2011-10-05 80 views
3

我試圖在界面生成器中創建一個自定義的UITableViewCell,並將實際的UITableViewCell的文件所有者和自定義類設置爲新的自定義UITableViewCell類。我會掛鉤,從文件的所有者的IBOutlets和得到錯誤,當它來:爲什麼自定義TableViewCell不需要文件所有者?

TVCell *cell = (TVCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 

    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"TVCell" owner:nil options:nil]; 

    for(id currentObject in topLevelObjects) 
    { 
     if([currentObject isKindOfClass:[TVCell class]]) 
     { 
      cell = (TVCell *)currentObject; 
      break; 
     } 
    } 

最後我意識到你必須從對象的UITableViewCell掛鉤的IBOutlets,而不是文件的所有者。爲什麼是這樣?

感謝

回答

4

文件所有者是最終將加載NIB的對象的佔位符對象。這是NIB之外的對象引用NIB內的對象的一種方式。在你的情況下,你試圖從NIB創建表視圖單元格,所以你需要一些其他對象作爲所有者。表格視圖單元不能在NIB的外部和內部。

在這一行代碼的:

NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"TVCell" 
                 owner:nil 
                 options:nil]; 

你到指定在Interface Builder文件的所有者佔位符來解決的對象。我猜你的代碼是在類似'MyTableViewController'的。如果是的話,你可以將owner參數的'self'傳遞給 - [NSBundle loadNibNamed:owner:]。如果你這樣做了,你可以在MyTableViewController類上有插件,這對於加載這個NIB很有用。具體來說,你可以使用它們來避免你有的for循環。你會是這樣做的:

  • 到MyTableViewController
  • 添加「loadedTableViewCell」出口在表格單元格筆尖,該文件的所有者設爲MyTableViewController。
  • 爲文件所有者的「loadedTableViewCell」連接到表視圖單元格。

然後改變你的代碼與此類似:

TVCell *cell = (TVCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (cell == nil) { 
    [[NSBundle mainBundle] loadNibNamed:@"TVCell" owner:self options:nil]; 
    cell = [self loadedTableViewCell]; 
    [self setLoadedTableViewCell:nil]; 
} 
+0

優秀的解釋。我不知道爲什麼每個人都不這樣做,而不是循環訪問數組,我錯過了什麼? – jrturton

+0

有些人更喜歡循環的限制,它不需要一個實例變量來完成詞彙範圍。 –

+0

@JonHess - 很好的解釋。謝謝你清理那個。在相關說明中,「TVCell.h」中定義的IBOutlets如何出現在IB的Table View Cell中(有點像IBOutlets在文件所有者中出現的次數)?它們在表格視圖單元被定義爲TVCell類型時出現。這對於表格視圖單元格是獨特的嗎? –

0

這是因爲你拉出來的對象筆尖,不使用整個筆尖,喜歡你,如果你加載控制器。這就是for(topLevelObjects中的id currentObject)所做的事情。

相關問題