如何为已添加在 UIViewController 之上的 tableView 添加自定义单元格?

Posted

技术标签:

【中文标题】如何为已添加在 UIViewController 之上的 tableView 添加自定义单元格?【英文标题】:How do I add custom cells for a tableView which has been added on top of a UIViewController? 【发布时间】:2019-08-02 11:48:28 【问题描述】:

我在一个普通的 UIViewController 类上使用了一个 tableView (myTableView)。我希望在这个 tableView 中使用可重复使用的单元格来节省内存。我没有创建单独的 XIB 并将 tableView 组件拖放到 viewController 上。 单元格已使用 UITableViewCell 类型的新类 HistoryTableViewCell 创建,并且该类也具有 XIB。 我还创建了一个 tableViewCell 及其 XIB,并在 tableView(_,cellForRowAt:) 方法中使用了以下代码:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

    let cell = tableView.dequeueReusableCell(withIdentifier: "historyReuseIdentifier", for: indexPath) as! HistoryTableViewCell
    cell.meetingDateLabel.text = historyArray![indexPath.section]

    return cell

当我在viewDidLoad() 方法中添加以下行时,这行代码可以很好地与 tableViewController 一起使用:

tableView.register(UINib(nibName: "TableViewCell", bundle: nil), forCellReuseIdentifier: "reuseIdentifier")

tableView.register 属性不能与 tableView 一起使用。我如何利用这里的可重复使用的细胞?

【问题讨论】:

提问时请多加努力。不,这不适用于视图控制器或表格视图控制器。您的标识符不匹配。回答你的问题;与使用表格视图控制器的方式完全相同。 我认为你使用了不同的 reusableIdentifier.register 和 dequeable cell 有不同的标识符名称 如果您只有一个表格视图,请删除 XIB 并在 Interface Builder 的表格视图中设计 所有 单元格 @Desdenova 感谢您的建议,问题已更新。我找到了问题的答案。必须使用 _mytableView.register() 而不是使用 tableView.register(),并且代码可以正常工作。 【参考方案1】:

假设你的 xib 没问题,一切正常,唯一剩下的就是注册nib

首先声明你的表格视图:

@IBOutlet weak var tableView: UITableView!

viewDidLoad()

tableView.register(UINib(nibName: "HistoryTableViewCell", bundle: nil) , forCellReuseIdentifier: "historyReuseIdentifier")

还要检查您的 tableView 的 dataSourcedelegate

【讨论】:

这行得通。我可以重用 tableView 中的单元格。此外,您可以将名称从 tableView 更改为任何其他名称(例如:myTableView),并且可以直接访问属性...... myTableView.register(UINib(nibName: "HistoryTableViewCell", bundle: nil ) , forCellReuseIdentifier: "historyReuseIdentifier"))【参考方案2】:

答案其实很简单。在阅读了其他一些答案后,我想通了。

我只需要替换这一行:

tableView.register(UINib(nibName: "TableViewCell", bundle: nil), forCellReuseIdentifier: "reuseIdentifier")

用这个:

UITableView.register(UINib(nibName: "TableViewCell", bundle: nil), forCellReuseIdentifier: "reuseIdentifier")

由于没有名为tableView的表格视图,你需要访问UITableView类。

【讨论】:

【参考方案3】:

你想重用单元格没关系,要使用它们你需要先注册它..假设你在一个 ViewController 中有多个 tableView,那么你必须用各自的 tableView 注册每个单元格。 只需将 tableViewCell 注册到相应的 tableView 并使用您在注册 tabelViewcell 时使用的 reusableIdentifier。

【讨论】:

【参考方案4】:

尝试像这样直接在cellForRowAt indexPath: 中创建它。这里不需要tableView.register(UINib(nibName: "TableViewCell", ... 行。

//And replace names with your names
var cell = tableView.dequeueReusableCell(withIdentifier:"cell") as? TableViewCell
if cell == nil 
     cell = Bundle.main.loadNibNamed("TableViewCell",owner: self, options: nil)?.first as? TableViewCell

【讨论】:

@Desdenova,你能解释一下为什么错了。到目前为止,我一直在关注此代码。 不,你不能,你不能从那个方法返回一个可选项。

以上是关于如何为已添加在 UIViewController 之上的 tableView 添加自定义单元格?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 UIViewController 的第一个视图提供带有乘数的垂直间距

如何为我在 Swift 中以编程方式创建的 UIViewController 子类创建 init?

如何为 UIViewController.view 中也具有 UITapGestureRecognizer 的 UIView 挑选和操作 UITapGestureRecognizer?

如何为没有情节提要的 UIViewController (Swift) 提供标识符?

如何为子域添加单独的谷歌分析

如何为程序添加splashScreen