2014-03-02 42 views
2

我已經搜索了高和低的答案,但唉,我在這裏。因爲我知道NSDateFormatter對象的創建成本很高,所以我不想爲我的表格中的每個NSTextField實例化一個對象。我面對的問題是我的表是基於視圖(而不是基於單元格),並且當試圖連接日期格式化程序的共享實例時,我會看到黃色警告符號和此消息:在基於視圖的NSTableView中的NSTextFields之間共享NSDateFormatter?

不支持的配置:「文本字段細胞 - 表視圖細胞」的出口「格式化」被連接到「日期格式化,」無效 目的地(對象內視圖基於表視圖可以僅 連接到表視圖的代表。 )

該警告的問題是這樣的:上面引用的「日期格式化程序」是「文件的所有者,「這也恰好是NSTableView的代表。我在這裏錯過了什麼,或者我將不得不爲表中的每個與日期相關的文本字段創建格式化程序?

回答

3

您可以在廈門國際銀行文件附加共享格式化程序代替。在返回單元格的視圖的委託方法,假設你的類是MyCellViewMyCellView有一個屬性theTextField,視圖是由名爲MyCellView.xib一個XIB文件中加載:

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { 
    MyCellView *result = [tableView makeViewWithIdentifier:@"MyCellView" owner:self]; 
    [result.theTextField setFormatter:[[self class] sharedFormatter]]; 
    return result; 
} 

然後,你需要這個sharedFormatter方法。 sharedFormatter方法將設置一個懶惰的初始化單例。這是在iOS和Mac OS X的開發一個很常見的模式,它是學習,如果你以前沒有見過一個好的:

+ (NSFormatter *)sharedFormatter { 
    static NSFormatter *formatter; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     formatter = [[NSFormatter alloc] init]; 
     /* Set up the formatter's attributes here */ 
    }); 
    return formatter; 
} 

所以sharedFormatter初始化它的靜態formatter變量最多一次(第一時間調用sharedFormatter方法)。 dispatch_once會導致其輸入塊中的所有代碼只執行一次,甚至會照顧同步多線程中發生的調用(儘管我懷疑你會從多個線程調用sharedFormatter)。

+0

感謝您的詳細回覆!實際上,這幾乎完全是我發佈後嘗試做的。唯一的區別是,我沒有使用'dispatch_once'調用來使用實例方法,而不是類方法。我會用我最新的「問題」更新我的問題。 –

+0

劃傷我剛纔說的一切。有效。我有一個日期格式問題。一切都會破壞一切。再次感謝。 –

1

您不應該爲每個與日期相關的文本字段創建格式化程序。使用Singleton可以解決這個問題。

此代碼添加到您的viewController

+ (NSDateFormatter *)sharedDateFormatter 
    { 

     NSLog(@"%s",__func__); 
     static dispatch_once_t once; 
     static NSDateFormatter * _sharedDateFormatter; 

     dispatch_once(&once, ^{ 
      _sharedDateFormatter = [[NSDateFormatter alloc] init]; 
     }); 
     return _sharedDateFormatter; 


    } 

,那麼你就可以訪問NSDateFormatter實例是這樣的:

[[self class] sharedDateFormatter],or ['Your ViewController class ' sharedDateFormatter] 

可以將屬性添加到您的日期相關的文本框,調用此方法將NSDateFormatter實例設置爲文本字段:

yourTextField.dateFormatter = ['Your ViewController class ' sharedDateFormatter]; 

it wi會只有一個創造NSDateFormatter例如,如果你不`噸明白,請仔細閱讀本:

Create singleton using GCD's dispatch_once in Objective C

+0

感謝您的回覆。我實現了類格式化程序,但是我仍然沒有在單元格中輸出。這只是空白。有任何想法嗎?附:看到我更新的問題,看看我在哪裏。 –

+0

編輯:我想通了。儘管感謝您的回覆。 –

相關問題