簡體   English   中英

UIViewController中的Xcode 5.1 UITableView - 自定義TableViewCell Outlets為零

[英]Xcode 5.1 UITableView in UIViewController - Custom TableViewCell Outlets are nil

我有一個UITableView作為UIViewController中的子視圖。 我沒有使用UITableViewController,因為我有一些與tableview無關的其他內容占用了部分屏幕。 我正在使用故事板。 我將tableview設置為插座,viewcontroller是數據源和委托。 如果我在這種情況下使用標准的UITableViewCell,一切運行良好,我可以加載內容。

我需要為此tableview使用自定義UITableViewCell,因此我執行了以下步驟:

  1. 創建了一個名為SWTableViewCell的UITableView子類
  2. 在viewDidLoad中添加了一個調用,用接口生成器注冊單元格: [self.tableView registerClass:[SWTableViewCell class] forCellReuseIdentifier:@"Cell"];
  3. 在我的tableview上的故事板中,將原型單元的Class設置為SWTableViewCell
  4. 在故事板中,將單元重用標識符設置為“Cell”
  5. 在故事板上為原型單元添加了一些標簽
  6. 仍然在故事板中,按住Ctrl鍵從標簽拖動到SWTableViewCell.h以創建出口
  7. 在我的cellForRowAtIndexPath:方法中,將單元格出列並轉換為自定義子類: SWTableViewCell *cell = (SWTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"Cell"];

檢查時,單元格變量是正確的類型。 它不是UITableViewCell,而是SWTableViewCell。 但沒有一個網點人口稠密。 屬性存在,但它們是零。 我敢肯定有一個我必須要忘記的聯系,但我想不出我在這一點上跳過的任何事情。

這種情況是否可行,或者它是否只能通過IB和故事板工作?

刪除呼叫

[self.tableView registerClass:[SWTableViewCell class] forCellReuseIdentifier:@"Cell"];

解決了這個問題。

我不知道這個方法究竟是做什么的,因為我從未使用它,所以我會調查一下。 如果有人有關於某些信息的信息,請告訴我們!


編輯:

因此, registerClass:forCellReuseIdentifier:背后的想法是它告訴tableView如何創建新的單元格。 這樣,如果dequeueReusableCellWithIdentifier:不返回單元格(如果隊列為空),則tableView知道如何創建新單元格,而不需要手動創建一個單元格。


編輯2:

我找到了這個帖子,其中說:

如果使用故事板中的原型創建單元格,則無需注冊該類。

只需調用dequeueReusableCellWithReuseIdentifier:將“激活”tableView的單元重用功能。

所以registerClass:forCellReuseIdentifier:只有在不使用故事板的情況下手動構建單元格時才會被調用。

以下是一些提示:

基本上可以有3種方法來創建和使用UITableViewCell

  1. 在storyboard / nib中使用“prototype”單元格

    (在UITableView內的storyboard / nib中創建單元格UI)

    不應該使用 registerClass:forCellReuseIdentifier:registerNib:forCellReuseIdentifier: methods。 UIStoryboard自己處理它,因為你在storyboard中指定了reuseIdentifiertableView知道哪個cell與哪個reuseIdentifier相關聯。

  2. tableViewCell UI使用單獨的nib

    (當你想在幾個tableView使用相同的tableViewCell時,這可能是一種方法)

    應該使用registerNib:forCellReuseIdentifier:方法。

  3. 不要使用nib,以編程方式創建tableViewCell UI

    應該使用registerClass:forCellReuseIdentifier:方法。

另請注意, registerClass:forCellReuseIdentifier:registerNib:forCellReuseIdentifier:都應該在之前調用(最常見於viewDidLoaddequeueReusableCellWithIdentifier:forIndexPath:方法被調用。 如果為reuseIdentifier注冊了類或nib,則可以保證dequeueReusableCellWithIdentifier:forIndexPath:返回一個有效的單元格(與dequeueReusableCellWithIdentifier:不同)。

在您的代碼中, Storyboard為單元格注冊了一個帶有UI的nib ,但是您調用了registerClass:forCellReuseIdentifier:使用相同的reuseIdentifier強制表視圖取消注冊nib並注冊不知道IBOutlet的類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM