2012-02-02 24 views
0

爲一個UITableViewCell出口我看着TableViewUpdates /蘋果的WWDC 2010碼TVAnimationGestures時遇到麻煩複制一個UITableViewCell子類。這是我做了什麼:分配使用UINib

我創建了一個新的UITableViewCell子類的一些簡單的屬性:

@interface TargetDetailTableViewCell : UITableViewCell 

@property (nonatomic, retain) IBOutlet UILabel *DescriptionLabel; 
@property (nonatomic, retain) IBOutlet UILabel *ValueLabel; 
@property (nonatomic, retain) IBOutlet UIImageView *DotImageView; 

在.M,我只是釋放內存。在IB中,我將我的類更改爲TargetDetailTableViewCell,以獲取我剛剛拖入IB的UITableViewCell。我將TargetDetailTableViewCell的插座連接到適當的標籤和圖像視圖。

在我想使用這個類:

@class TargetDetailTableViewCell; 

//some properties 
@property (nonatomic, assign) IBOutlet TargetDetailTableViewCell *TargetCell; 

在.M:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {  
    static NSString *TargetCellIdentifier = @"TargetDetailTableViewCellIdentifier"; 
    TargetDetailTableViewCell *cell = (TargetDetailTableViewCell *)[tableView dequeueReusableCellWithIdentifier:TargetCellIdentifier]; 

    if (cell == nil) { 
     UINib *nib = [UINib nibWithNibName:@"TargetDetailTableViewCell" bundle:nil]; 
     [nib instantiateWithOwner:self options:nil]; 
     cell = self.TargetCell; 
     self.TargetCell = nil; 
    } 
// set some labels 
return cell; 
} 

當我運行它,我得到的錯誤:Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'

唯一想我可以看到Apple的例子和我的例子不同,當我在他們的IB中單擊UITableViewCell的子類時,他們有一個File's Owner屬性集。我不知道他們如何連接這個插座,因爲它被聲明爲他們使用該單元的類中的一個屬性,但是他們沒有實際的IB連接。有人可以向我解釋,或者我做錯了什麼?

此外,如果任何人都可以解釋這一點,那將是巨大的:

 UINib *nib = [UINib nibWithNibName:@"TargetDetailTableViewCell" bundle:nil]; 
     [nib instantiateWithOwner:self options:nil]; 
     cell = self.TargetCell; 
     self.TargetCell = nil; 

好像你創建的筆尖和被從內存中實例化的筆尖的所有者是你在類或自(我的viewcontroller)。然後最後兩行讓我困惑。就像你告訴你的單元指向新創建的對象,然後將新創建的對象設置爲零。我認爲,在我的腦海中,細胞現在指向零。謝謝。

回答

2

您需要在自定義表視圖單元格筆尖中擁有一個所有者,並且該所有者需要是您的TableViewDataSource類(即實現cellForRowAtIndexPath方法的表視圖控制器,並且具有表格單元格的TargetCell插座)。

您還需要從文件所有者(TableViewController)這個TargetCell插座連接到您的自定義表視圖。

原因是當你加載nib時,以你的表視圖控制器爲所有者,它將設置你擁有的出口(TargetCell屬性)指向你的筆尖中定義的表視圖單元格。

然後,您可以複製這對單元格引用的方法變量,配置它並返回它。您將該屬性複製後指定爲nil,因爲您只需要將其作爲引導程序來獲取對nib中的對象的引用,以便在cellForRowAtIndexPath方法中使用。

+0

快速跟進問題。所以'cell = self.TargetCell'拷貝了對象,不只是指向那個會使下一行爲零的引用?如果我想重複使用這個自定義的UITableViewCell,我是否將另一個文件的所有者對象添加到我的筆尖,並做同樣的事情?再次感謝。 – Crystal 2012-02-02 03:04:10

+0

self.TargetCell是對UITableViewCell對象實例的引用。將此引用複製到本地「單元」變量中,因此由於此第二次引用,對象將保留到方法結束。然後,您在方法結尾處返回單元格,並且表視圖現在具有對它的引用,因此它由表視圖保留。當你設置self.TargetCell = nil時,你只是清除對該對象的特定引用(即你沒有執行[self.TargetCell release]),它也會釋放基礎對象。這只是你正在清理的參考。 – gamozzii 2012-02-02 03:15:51

+0

要在不同的表視圖控制器中重複使用相同的自定義表格單元格和筆尖,您可能需要定義一個通用的「MyCellOwner」對象,該對象具有此表格單元格類型的出口,並將其設置爲表格單元格筆尖中的所有者,而不是表格視圖控制器。然後在cellForRowAtIndex代碼alloc/init中創建一個'MyCellOwner',並用它來加載nib(即作爲調用中的owner字段),它將在MyCellOwner對象的實例中創建對錶格單元格的引用。然後從該參考中複製。 (可能有一種更簡單的方法,我可能會使它過於複雜。) – gamozzii 2012-02-02 03:22:39