使用 nib 的多个 customTableViewCell

Posted

技术标签:

【中文标题】使用 nib 的多个 customTableViewCell【英文标题】:multiple customTableViewCell using nib 【发布时间】:2014-09-03 21:31:23 【问题描述】:

我正在尝试使用 Swift 创建多个自定义 tableViewCells。我使用了一个objective-c项目来转换成swift代码,这可能是它不起作用的原因。我用 xib 创建了 2 个 UITableViewCell 子类。然后我将子类添加到 xib 类中。

但是当我注册笔尖并尝试在 tableView 中显示它们时,tableView 是空的。我已将委托连接到 uitableView

viewDidLoad

    self.tableView?.registerNib(UINib(nibName: "TextViewCell", bundle: nil), forCellReuseIdentifier: "TextViewCell")
    self.tableView?.registerNib(UINib(nibName: "AttachViewCell", bundle: nil), forCellReuseIdentifier: "AttachViewCell")

cellForRowAtIndexPath

func tableView(tableView:UITableView!, cellForRowAtIndexPath indexPath:NSIndexPath!) -> UITableViewCell! 
    var cell: UITableViewCell? = nil


    if indexPath.row == 0 


        var  textCell:TextViewCell! = tableView.dequeueReusableCellWithIdentifier("TextViewCell") as? TextViewCell

        textCell.nameTextView.text = "Test"

        cell = TextViewCell()
    

    if indexPath.row == 1 
        var  attachCell:AttachViewCell! = tableView.dequeueReusableCellWithIdentifier("AttachViewCell") as? AttachViewCell

        attachCell.attachLabel.text = "Attach image"


        cell = AttachViewCell()
    




    return cell

【问题讨论】:

你尝试过什么调试? attachCell 和 textCell 都不是零吗?但是,查看代码,您不应该有cell = textCellcell = AttachViewCell(没有括号)以便返回出队的单元格吗? 您不应手动创建单元格 (cell = TextViewCell),而应使用您出列并配置的单元格。在您的代码cell 中从未设置任何文本标签,您应该返回textCell/attachCell 而不是cell。看看 POB 的回答。 【参考方案1】:

使用 Xcode 6 beta 7,您的 UITableViewController 类应如下所示:

import UIKit

class ViewController: UITableViewController 

    override func awakeFromNib() 
        super.awakeFromNib()
    

    override func viewDidLoad() 
        super.viewDidLoad()

        tableView.registerNib(UINib(nibName: "TextViewCell", bundle: nil), forCellReuseIdentifier: "TextViewCell")
        tableView.registerNib(UINib(nibName: "AttachViewCell", bundle: nil), forCellReuseIdentifier: "AttachViewCell")
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
    

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int 
        return 1
    

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return 2
    

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        if indexPath.row == 0 
            let cell = tableView.dequeueReusableCellWithIdentifier("TextViewCell", forIndexPath: indexPath) as TextViewCell
            cell.nameTextView!.text = "Test" //@IBOutlet weak var nameTextView: UILabel!
            return cell
         else 
            let cell = tableView.dequeueReusableCellWithIdentifier("AttachViewCell", forIndexPath: indexPath) as AttachViewCell
            cell.attachLabel!.text = "Attach image" //@IBOutlet weak var attachLabel: UILabel!
            return cell
        
    


请注意,在 Xcode 6 beta 7 中,tableView:cellForRowAtIndexPath: 不再返回可选的 UITableViewCell。所以你必须使用前面的代码。如果您使用以前版本的 Xcode 6 beta 和 tableView:cellForRowAtIndexPath: 返回一个隐式展开的可选 UITableViewCell,您可以编写以下代码:

override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! 
    if indexPath.row == 0 
        let cell = tableView.dequeueReusableCellWithIdentifier("TextViewCell", forIndexPath: indexPath) as TextViewCell
        cell.nameTextView!.text = "Test" //@IBOutlet weak var nameTextView: UILabel!
        return cell
    

    if indexPath.row == 1 
        let cell = tableView.dequeueReusableCellWithIdentifier("AttachViewCell", forIndexPath: indexPath) as AttachViewCell
        cell.attachLabel!.text = "Attach image" //@IBOutlet weak var attachLabel: UILabel!
        return cell
    

    return nil

【讨论】:

出现问题:NSInternalInconsistencyException',原因:'为标识符注册的无效笔尖 (cell_printStatus) - 笔尖必须包含一个必须是 UITableViewCell 实例的***对象'

以上是关于使用 nib 的多个 customTableViewCell的主要内容,如果未能解决你的问题,请参考以下文章

在单个视图控制器中使用多个 nib 文件?

如何创建一个具有多个 ViewController 可以使用的关联视图类的 Nib

访问,从单个 nib 获取对多个视图的引用

在多个视图控制器中重用从 nib 创建的 uiview

Core Data 文档基于多个 nib 基于选择

具有多个 NIB 的 iPhone 应用程序的最佳实践建议