使用nib的多个customTableViewCell

时间:2014-09-03 21:31:24

标签: ios uitableview swift

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

但是当我注册nib并尝试在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
}

1 个答案:

答案 0 :(得分:10)

使用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:返回Implicitly Unwrapped Optional 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
}