Swift:自定义单元格中的 IBoutlets 为零

Posted

技术标签:

【中文标题】Swift:自定义单元格中的 IBoutlets 为零【英文标题】:Swift: IBoutlets are nil in Custom Cell 【发布时间】:2014-10-16 18:10:45 【问题描述】:

我不知道为什么没有输出这个自定义单元格。

我在情节提要中设置了一个自定义单元格(无笔尖)。 当我尝试在自定义单元格类中访问它们时,我有一个文本字段和 2 个标签。我几乎可以肯定我已经正确连接了所有东西,但仍然为零。

我在情节提要中选择了我的表格单元格并将自定义类设置为TimesheetTableViewCell 我还控制点击表格并将数据源和委托设置为TimesheetViewController

我的自定义单元格类:

import UIKit

class TimesheetTableViewCell: UITableViewCell 

@IBOutlet var duration: UITextField!
@IBOutlet var taskName: UILabel!
@IBOutlet var taskNotes: UILabel!

required init(coder aDecoder: NSCoder) 
    super.init(coder: aDecoder)


override init?(style: UITableViewCellStyle, reuseIdentifier: String!) 
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    println("Cell's initialised")// I see this
    println(reuseIdentifier)// prints TimesheetCell



override func setSelected(selected: Bool, animated: Bool) 
    super.setSelected(selected, animated: animated)


func setCell(duration: String, taskName: String, taskNotes: String)
    println("setCell called")
    self.duration?.text = duration
    self.taskName?.text = taskName
    self.taskNotes?.text = taskNotes

我的控制器:

class TimesheetViewController: UIViewController, UITableViewDataSource, UITableViewDelegate

@IBOutlet var timesheetTable: UITableView!

var items = ["Item 1", "Item2", "Item3", "Item4"]

override func viewDidLoad() 
    super.viewDidLoad()
    self.timesheetTable.registerClass(TimesheetTableViewCell.self, forCellReuseIdentifier: "TimesheetCell")


    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCellWithIdentifier("TimesheetCell", forIndexPath: indexPath) as TimesheetTableViewCell
        println(items[indexPath.row]) // prints corresponding item
        println(cell.duration?.text) // prints nil
        cell.setCell(items[indexPath.row], taskName: items[indexPath.row], taskNotes: items[indexPath.row])
        return cell

【问题讨论】:

而不是self.timesheetTable.registerClass(...):使用self.timesheetTable.registerNib(...),也许...? 【参考方案1】:

问题出在这一行:

self.timesheetTable.registerClass(TimesheetTableViewCell.self, forCellReuseIdentifier: "TimesheetCell")

删除它。那行说:“不要从情节提要中获取单元格。”但是您确实想从情节提要中获取单元格。

(但是,请确保单元格的标识符在故事板中为 "TimesheetCell",否则您会崩溃。)

【讨论】:

好的,我的默认单元格数据显示出来了。谢谢!不过,我似乎仍然无法访问 iboutlets,知道吗?尝试在 cell.setCell 中设置 self.taskName?.text = "something" 无效,因为 taskName 为 nil 请向我证明,从单元格到单元格中的标签的插座真的连接起来了! 哈哈!我会,但我已经继续并更改了我的代码。我最终重新开始并创建了一个 nib 以及自定义单元格类,然后在我的控制器 viewdidload() 中我称之为 self.timesheetTable.registerNib(UINib(nibName: "TimesheetTableViewCell", bundle: nil)!, forCellReuseIdentifier: "TimesheetCell ”)。感谢您的帮助,马特,谢谢。 对于故事板实例化和配置的单元格,我认为这是您想要的:github.com/mattneub/Programming-ios-Book-Examples/tree/master/… @matt 谢谢matt,我想通了,忘了在需要的方法中使用super.init(coder:)【参考方案2】:

很确定您需要删除该行

self.timesheetTable.registerClass(TimesheetTableViewCell.self, forCellReuseIdentifier: "TimesheetCell")

来自 viewDidLoad()。

【讨论】:

以上是关于Swift:自定义单元格中的 IBoutlets 为零的主要内容,如果未能解决你的问题,请参考以下文章

SWIFT:从自定义单元格中的 UIswitch 展开/折叠自定义单元格

swift UIViewController用于自定义单元格中的按钮

在 Swift 中的自定义单元格中存储/检索核心数据

如何在 swift 3 中的 tableview 单元格中添加带有自定义视图的 collectionView?

如何在 Swift 的自定义单元格中获取值组件的 indexPath?

使用自定义表格视图单元格中的故事板segue