从Swift中的nib定制UITableViewCell

从Swift中的nib定制UITableViewCell

我正在尝试从笔尖创建自定义表格视图单元格。我在这里指的是这篇文章。我面临两个问题。

我创建了一个.xib文件,其中拖动了一个UITableViewCell对象。我创建了一个子类,UITableViewCell并将其设置为单元格的类,将Cell设置为可重用的标识符。

import UIKitclass CustomOneCell: UITableViewCell {
    @IBOutlet weak var middleLabel: UILabel!
    @IBOutlet weak var leftLabel: UILabel!
    @IBOutlet weak var rightLabel: UILabel!
    required init(coder aDecoder: NSCoder!) {
        super.init(coder: aDecoder)
    }
    override init(style: UITableViewCellStyle, reuseIdentifier: String!) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
    }
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code    }
    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
        // Configure the view for the selected state    }}


在故事板中的UITableViewController中,我没有对单元格做任何事情。空标识符,没有子类。我尝试将Cell标识符添加到原型单元格并再次运行但我得到了相同的结果。

如我在文章中所提到的,我将cell参数的类型形式UITableViewCell更改CustomOneCell为我的UITableViewCell的子类。但我得到以下错误,

使用选择器'tableView重写方法:willDisplayCell:forRowAtIndexPath:'具有不兼容的类型'(UITableView!,CustomOneCell!,NSIndexPath!) - >()'

任何人都知道如何解决这些错误?这些似乎在Objective-C中运行良好。

谢谢。



慕姐8265434
浏览 1065回答 3
3回答

炎炎设计

使用Swift 5和iOS 12.2,您应该尝试以下代码来解决您的问题:CustomCell.swiftimport UIKitclass CustomCell: UITableViewCell {     // Link those IBOutlets with the UILabels in your .XIB file    @IBOutlet weak var middleLabel: UILabel!     @IBOutlet weak var leftLabel: UILabel!     @IBOutlet weak var rightLabel: UILabel!}TableViewController.swiftimport UIKitclass TableViewController: UITableViewController {     let items = ["Item 1", "Item2", "Item3", "Item4"]     override func viewDidLoad() {         super.viewDidLoad()         tableView.register(UINib(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: "CustomCell")     }     // MARK: - UITableViewDataSource     override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {         return items.count     }     override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {         let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath) as! CustomCell         cell.middleLabel.text = items[indexPath.row]         cell.leftLabel.text = items[indexPath.row]         cell.rightLabel.text = items[indexPath.row]         return cell     }}下图显示了一组使用提供的代码的约束,而没有来自Xcode的任何约束歧义消息:

犯罪嫌疑人X

这是我使用Swift 2和Xcode 7.3的方法。此示例将使用单个ViewController加载两个.xib文件 - 一个用于UITableView,另一个用于UITableCellView。对于此示例,您可以将UITableView权限放入空的TableNib .xib文件中。在里面,将文件的所有者设置为ViewController类,并使用插座引用tableView。和现在,在视图控制器中,您可以像往常一样委托tableView,就像这样class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {     @IBOutlet weak var tableView: UITableView!     ...     override func viewDidLoad() {         super.viewDidLoad()         // Do any additional setup after loading the view, typically from a nib.         // Table view delegate        self.tableView.delegate = self         self.tableView.dataSource = self         ...要再次创建自定义单元格,请将Table View Cell对象拖放到空的TableCellNib .xib文件中。这次,在单元格.xib文件中,您不必指定“所有者”,但您需要指定自定义类和标识符,如“TableCellId”使用您需要的任何插件创建您的子类class TableCell: UITableViewCell {     @IBOutlet weak var nameLabel: UILabel!}最后......回到View Controller中,您可以加载并显示整个事物override func viewDidLoad() {     super.viewDidLoad()     // Do any additional setup after loading the view, typically from a nib.     // First load table nib    let bundle = NSBundle(forClass: self.dynamicType)     let tableNib = UINib(nibName: "TableNib", bundle: bundle)     let tableNibView = tableNib.instantiateWithOwner(self, options: nil)[0] as! UIView     // Then delegate the TableView    self.tableView.delegate = self     self.tableView.dataSource = self     // Set resizable table bounds    self.tableView.frame = self.view.bounds     self.tableView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]     // Register table cell class from nib    let cellNib = UINib(nibName: "TableCellNib", bundle: bundle)     self.tableView.registerNib(cellNib, forCellReuseIdentifier: self.tableCellId)     // Display table with custom cells    self.view.addSubview(tableNibView)}代码显示了如何简单地加载和显示nib文件(表),以及如何注册nib以供单元使用。希望这可以帮助!!!

慕斯王

斯威夫特4注册NibtblMissions.register(UINib(nibName: "MissionCell", bundle: nil), forCellReuseIdentifier: "MissionCell")在TableView DataSource中func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {           guard let cell = tableView.dequeueReusableCell(withIdentifier: "MissionCell", for: indexPath) as? MissionCell else { return UITableViewCell() }           return cell     }
打开App,查看更多内容
随时随地看视频慕课网APP