在 Swift 中访问自定义 UITableViewCell UILabel 文本会引发错误

Posted

技术标签:

【中文标题】在 Swift 中访问自定义 UITableViewCell UILabel 文本会引发错误【英文标题】:Access to Custom UITableViewCell UILabel Text in Swift throws error 【发布时间】:2014-06-24 15:57:40 【问题描述】:

我正在尝试创建一个自定义 UITableViewCell,其中包括我自己的 UILabel。

我使用 Swift 创建了一个单视图应用程序,并添加了一个带有 .xib 文件的 Cocoa Touch 类,然后我添加了 UILabel 并在新文件中创建了一个 Outlet(CustomCell 类)。

在主 StoryBoard 中,我添加了一个 UITableView,并用数据初始化它(实现 UITableViewDataSource 和 UITableViewDelegate)。

当我尝试访问 UILabel 中的文本属性时,它会失败并出现以下错误:

致命错误:无法打开 Optional.None

这是我的 CustomCell 类:

import UIKit

class CustomCell: UITableViewCell 

    @IBOutlet var myLbl: UILabel

    override func awakeFromNib() 
        super.awakeFromNib()
    

    func SetValue(value: String)
        myLbl.text = value  // Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
    
    override func setSelected(selected: Bool, animated: Bool) 
        super.setSelected(selected, animated: animated)
    

更新: 这是在主 ViewController 中创建单元格的代码:

    func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!
        var cell = CustomCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Default")
        cell.SetValue(stringArray[indexPath.row])
        return cell;
    

【问题讨论】:

【参考方案1】:

您收到该错误是因为 myLbl 为 nil。

那是因为您没有使用 Nib 创建单元格。您正在使用带有样式的 init。您应该做的是将 nib 注册到 table view 上,然后在 tableview 上使用 deque:

override func viewDidLoad() 
    var cellNib = UINib(nibName:"ANibName", bundle: nil)
    self.tableView.registerNib(cellNib, forCellReuseIdentifier: "default")


func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!
    var cell = tableView.dequeueReusableCellWithIdentifier("default", forIndexPath: indexPath) as CutomCell
    cell.SetValue(stringArray[indexPath.row])
    return cell;

但是,如果您要在视图控制器的 Nib 中创建模板单元格,则不必为该单元格注册单独的 Nib,但您仍需要像上面那样对单元格进行 deque。

【讨论】:

它看起来像他附加了 OK,我看到 IBOutlet 行旁边的编辑器左侧的圆圈。 (圆圈是灰色的) 那你确定你真的是从笔尖加载它吗?你是如何创建单元格的? 问题已更新。但我很确定这不是问题。如果我以相同的方式创建单元格但没有 UILabel.text,它的工作正常。 @user3210784 好的,我更新了我的答案。您不是从笔尖加载单元格,而是以编程方式创建它 它工作正常,但现在我有其他错误:'Could not load NIB in bundle:'NSBundle /admin/Library/Developer/CoreSimulator/Devices/11675D3B-7030-4DC5-8D7A- 2D2693DAE3EE/data/Containers/Bundle/Application/D08FDC90-6F4F-4D21-95FA-0C5DBCF5B0E8/TableViewCellsTest.app>(已加载)',名称为'ANibName''

以上是关于在 Swift 中访问自定义 UITableViewCell UILabel 文本会引发错误的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中访问共享容器中的自定义对象

在 Swift 中访问自定义 UITableViewCell UILabel 文本会引发错误

swift 协议,IBOutlet 属性不能有非对象类型

在 Swift 3 UI 测试中访问自定义视图组件中的元素

Swift 中的 NSManagedObject 子类不能使用自定义访问器?

Swift 3.1:自定义错误转换为 NSError 以访问其域属性时崩溃