2011-10-23 107 views
11

想要創建靜態菜單(IOS 5)並嘗試在故事板內創建自定義單元格,然後加載到分組的tableview中。在Storyboard內創建自定義UITableViewCell

我已創建的視圖控制器類設置到適當的TableViewController出口

@property(nonatomic,strong) IBOutlet UITableViewCell *labelCell; 

,我已經連接了自定義單元格到此插座。

我也有代表和數據源設置。

我有

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return self.labelCell; 
} 

我敢肯定有一噸的錯,但我只是想顯示一個單元,並從那裏走。似乎沒有任何通過故事板在IB內執行自定義單元格的示例。我仍然可以使用舊的方式創建一個xib文件並將其加載到mainBundle中,但我只想保持最新的我猜。

但與我上面我得到一個崩潰時,我加載此視圖控制器。 SIGABRT

回答

13

如果您已將UITableView設置爲在故事板中使用「靜態單元格」,則不需要實施任何UITableViewDataSource方法,並且可以直接在Interface Builder中修改單元格。對於單個標籤單元格,請選擇單元格並將其類型更改爲「基本」。現在您可以像處理其他視圖對象一樣編輯單元格。

+1

沒錯。就是這樣。不知道爲什麼我沒有找到任何告訴你這樣做的指南。使它更容易。 – Doug

+1

作爲一個隨機問題,使用靜態單元是否意味着您具有您在IB中指定的單元格的數量?既然你不必實現數據源方法,我想你不能改變你的表視圖中的數據,這就是爲什麼他們稱之爲靜態的 - 對嗎? – Warkst

+0

@Warkst - 確切地說。實際上,您應該刪除數據源方法的存根實現。 – jrturton

27

以下是我在使用故事板時如何爲桌子獲取單元格的知識。將UITableView拖到視圖中時,它會附帶一個已被設置爲子視圖的原型單元。要使用此原型單元格,請在屬性檢查器中設置唯一的重用標識符,然後使用相同的標識符使cellForRowAtIndexPath:方法中的單元格出列。如果出隊調用返回nil,則省略從頭創建單元的代碼;我不認爲這會發生。所以只要將這個單元格出隊,用通常的UITableViewCell方法對其進行配置,然後返回它。

但您也可以創建UITableViewCell的自定義子類。只需在故事板的類別標識檢查器中設置類名稱,然後將所需的任何元素從「對象」調板拖放到單元格中即可。然後在你的子類的代碼文件中爲它們創建IBOutlet屬性,並以通常的方式將它們連接到故事板中的單元格。這比在代碼中完成這一切要好得多!

最後,您可以在表格中擁有多種單元格。只需將UITableViewCell對象從選用板拖放到表中,並在屬性檢查器中爲每個對象提供唯一的重用標識符。在你的cellForRowAtIndexPath:方法中,選擇每個單元格的類型,並且你可以有一個非常靈活的表格視圖。

+1

這完全是真的,但問題是關於靜態表視圖,它不使用原型。 – jrturton

+0

我有一個新的場景(懷疑)。如果我有一個帶有'+','''按鈕和'UITextField'的自定義單元格的'UITableView'。所有的設置都是根據你的第2段完成的,但是現在如果我想阻止我的單元格被重用,是否有任何好的方法呢?我應該這樣做嗎? (我想添加多個電子郵件ID的功能) – thesummersign

+0

@jrturton啊,但有些從谷歌搜索到達這裏,沒有意識到「靜態」部分。標題有點誤導。所以*這個*答案實際上是我*尋找的東西。 –

4

This教程對我很有幫助。你可以通過標籤來引用你需要的任何對象。

在故事板拖動一個UIImageViewUILabel等,並設置(任何你想要的)標籤100,然後在你的- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath使用標籤來引用它。

下面是本教程中的示例代碼,只記得設置標籤的故事板:

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

// Configure the cell... 
if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
} 

// Display recipe in the table cell 
Recipe *recipe = [recipes objectAtIndex:indexPath.row]; 
UIImageView *recipeImageView = (UIImageView *)[cell viewWithTag:100]; 
recipeImageView.image = [UIImage imageNamed:recipe.imageFile]; 

UILabel *recipeNameLabel = (UILabel *)[cell viewWithTag:101]; 
recipeNameLabel.text = recipe.name; 

UILabel *recipeDetailLabel = (UILabel *)[cell viewWithTag:102]; 
recipeDetailLabel.text = recipe.detail; 

return cell; 
}