objective-c - tableview教學 - uitableviewcell




在故事板中,如何製作自定義單元格以供多個控制器使用? (4)

我正在嘗試在我正在處理的應用中使用故事板。 在應用程序中有列表用戶 ,每個包含另一個(列表的成員,用戶擁有的列表)的集合。 所以,相應地,我有ListCellUserCell類。 目標是讓這些應用程序在整個應用程序中重用(即,在我的任何桌面視圖控制器中)。

這就是我遇到問題的地方。

如何在故事板中創建可在任何視圖控制器中重新使用的自定義表格單元格?

以下是我迄今嘗試的具體事情。

  • 在控制器#1中,添加一個原型單元格,將該類設置為我的UITableViewCell子類,設置重用標識,添加標籤並將它們連接到該類的插座。 在控制器#2中,添加了一個空的原型單元格,將它設置為相同的類並重新使用id。 運行時,單元顯示在控制器#2中時,標籤不會出現。 在控制器#1中正常工作。

  • 在不同的NIB中設計每種細胞類型,並連接到相應的細胞類別。 在故事板中,添加了一個空的原型單元格並設置其類並重用了id來引用我的單元格類。 在控制器的viewDidLoad方法中,為重用標識註冊了這些NIB文件。 顯示時,兩個控制器中的單元格都像原型一樣是空的。

  • 保持兩個控制器中的原型為空並設置類,並將id重用到我的單元類。 用代碼完全構造單元的UI。 細胞在所有控制器中完美工作。

在第二種情況下,我懷疑原型總是覆蓋NIB,如果我殺死了原型單元,註冊我的NIB以獲得重用ID將會起作用。 但之後我無法將細胞中的細胞設置到其他框架上,這實際上是使用故事板的關鍵。

在一天結束時,我需要兩件事情:在故事板中連接基於tableview的流程,並以可視方式而非代碼方式定義單元格佈局。 到目前為止,我看不出如何獲得這兩個。


BJ荷馬對發生的事情給出了很好的解釋。

從實際的角度來看,我補充說,既然你不能將單元格作為xibs並連接segues,最好的選擇是將單元格作為xib - 轉換比單元格佈局和多個地方的屬性更容易維護,而且你的血統可能與你的不同控制器有所不同。 您可以直接從您的表視圖控制器定義segue到下一個控制器,並在代碼中執行它。 。

還有一點需要注意的是,讓你的單元格作為一個獨立的xib文件可以防止你能夠將任何操作等直接連接到表視圖控制器(我還沒有解決這個問題 - 無論如何 - 你不能將文件的所有者定義為任何有意義的東西)。 我正在通過定義一個協議來解決這個問題,該協議希望單元格的表視圖控制器符合併在cellForRowAtIndexPath中將控制器添加為類似於委託的弱屬性。


斯威夫特3

BJ荷馬給出了一個很好的解釋,它幫助我理解這個概念。 為了make a custom cell reusable in storyboard可以make a custom cell reusable in storyboard ,可以在任何TableViewController中使用,我們必須mix the Storyboard and xib方法。 假設我們有一個名為CustomCell的單元用於TableViewControllerOneTableViewControllerTwo 。 我正在逐步完成。
1.文件>新建>點擊文件>選擇Cocoa Touch Class>點擊下一步>命名你的類(例如CustomCell )>選擇子類作為UITableVieCell>勾選也創建XIB文件複選框並按下一步。
2.根據需要自定義單元格,並在屬性檢查器中為單元格設置標識符,這裡我們將設置為CellIdentifier 。 該標識符將用於ViewController中以識別和重用Cell。
3.現在我們只需要在ViewController的viewDidLoad register this cell 。 不需要任何初始化方法。
4.現在我們可以在任何tableView中使用這個自定義單元格。

在TableViewControllerOne中

let reuseIdentifier = "CellIdentifier"

override func viewDidLoad() {
super.viewDidLoad()
tableView.register(UINib(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: reuseIdentifier)
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier:reuseIdentifier, for: indexPath) as! CustomCell
    return cell!
}

我找到了一種方法來加載相同的VC單元格,沒有測試賽格。 這可能是在單獨的筆尖中創建單元格的解決方法

假設你有一個VC和2個表格,你想在故事板中設計一個單元格並在兩個表格中使用它。

(例如:一個表格和一個帶有UISearchController的搜索字段,其中有一個用於結果的表格,並且您希望在兩者中使用同一個Cell)

當控制器詢問單元時,請執行以下操作:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString * identifier = @"CELL_ID";

    ContactsCell *cell = [self.YOURTABLEVIEW dequeueReusableCellWithIdentifier:identifier];
  // Ignore the "tableView" argument
}

在這裡,你從故事板中獲得了你的細胞


我正在尋找這個,我發現理查德維納布爾的答案 。 這個對我有用。

iOS 5在UITableView上包含一個新方法:registerNib:forCellReuseIdentifier:

要使用它,請將UITableViewCell放入筆尖。 它必須是筆尖中唯一的根對象。

你可以在加載你的tableView之後註冊nib,然後當你調用dequeueReusableCellWithIdentifier時:使用單元標識符將它從nib中拉出來,就像你使用了Storyboard原型單元一樣。







storyboard