Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios xcode 7 swift在表视图单元格中展开可选文件时发现nil_Ios_Swift_Uitableview - Fatal编程技术网

Ios xcode 7 swift在表视图单元格中展开可选文件时发现nil

Ios xcode 7 swift在表视图单元格中展开可选文件时发现nil,ios,swift,uitableview,Ios,Swift,Uitableview,我很抱歉要问另一个“Find nil unwrapping optional in TableViewCell”的帖子,但是经过几个小时的调试和阅读这里的其他类似帖子后,我仍然被卡住了。我想我已经涵盖了所有常见的错误,但仍然无法使事情正常进行 作为一个起点,只要我在单元格中使用默认标签,即“cell.textlab!.text=mystring”引用,一切都可以正常工作。还有一个例子,我用图像和标签自定义了原型单元格,这也可以正常工作 在当前情况下,我有一个普通的UIViewController

我很抱歉要问另一个“Find nil unwrapping optional in TableViewCell”的帖子,但是经过几个小时的调试和阅读这里的其他类似帖子后,我仍然被卡住了。我想我已经涵盖了所有常见的错误,但仍然无法使事情正常进行

作为一个起点,只要我在单元格中使用默认标签,即“cell.textlab!.text=mystring”引用,一切都可以正常工作。还有一个例子,我用图像和标签自定义了原型单元格,这也可以正常工作

在当前情况下,我有一个普通的UIViewController,嵌入了一些其他视图和一个UITableView。将普通UIViewController设置为单元格的委托

这是SettingsCell.swift代码。很简单。xcode中插座左侧的小点是实心的,表明插座正确连接到我的原型表单元格上的CellTwo标签

class SettingsCell: UITableViewCell {

  @IBOutlet weak var CellTwo: UILabel!

  override init(style: UITableViewCellStyle, reuseIdentifier reuseID: String?) {
    super.init(style: style, reuseIdentifier: reuseID)
  }

  required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }
}
在相应的SettingsVC.swift视图控制器中,以下是在尝试设置cell.CellTwo值时出现nil错误的dequeueCell代码

单元格在表视图中显示良好,但仅显示UILabel中的默认textLabel.txt。我的自定义标签根本不显示

  func tableView(
    tv: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tv.dequeueReusableCellWithIdentifier("SettingsCell") as! SettingsCell
    let row = indexPath.row

    cell.textLabel!.text = SettingsNames[row]
    // the commented out line below crashes on a nil unwrapped optional
    // cell.CellTwo!.text = "Blah"
    if let b = cell.CellTwo {
      b.text = "Blah"
    }
    return cell
  }
使用“let b=”可选的“无展开”保护,应用程序不会崩溃,但我的第二个标签也不会设置。最后,考虑类的注册。 网络上有很多例子(没有使用原型),你可以在那里注册这个类,我以前也成功地注册过。我做了一个例子,我建立了一个定制的原型单元,这个也很好用。但是我认为所有这些示例都使用了UITableViewController,而不是普通的UIViewController+嵌入式UITableView。也许这与此有关

无论如何,下面是包含UITableView的UIViewController中的init/viewDidLoad代码。正如您从代码中所看到的,UIViewController声明了数据源和委托责任,并且可以肯定的是,表行显示出来并且工作正常

我尝试了两种注册方式——不使用代码注册,也使用代码注册行。但这根本没有任何区别——我的代码仍然在单元格中对我的自定义标签的nil引用上崩溃

class SettingsVC: UIViewController, UITableViewDataSource, UITableViewDelegate {

  override func viewDidLoad() {
    super.viewDidLoad()
    SettingsTV.dataSource = self
    SettingsTV.delegate = self
    // I tried with this line in and out, no difference, the crash still happens
    //SettingsTV.registerClass(SettingsCell.self, forCellReuseIdentifier: "SettingsCell")
    SettingsTV.estimatedRowHeight = 70
  }

这就像我的自定义标签没有被创建或初始化一样。但我无法解释。有什么想法吗?谢谢

我的问题的答案是上面第一段代码中显示的设置调用的初始化。该初始化序列是从一个工作正常但未使用情节提要的示例复制而来的。相反,该示例仅限于使用UITableViewCell定义中的默认textLabel.text字段

为了解决这个问题,我一直在回顾我的例子,试图在已经有效的例子中重现这个问题。这是钥匙

如果您将故事板与原型单元一起使用,则表格单元初始化不能看起来像本文中的第一个块!!该样式仅适用于非故事板单元

相反,它应该看起来像下面这个。注意,我注释掉了创建文件时xcode插入到文件中的默认代码。所以你基本上可以有一个空的单元格类,只要你有插座的地方

        class SettingsCell: UITableViewCell {

      @IBOutlet weak var XXXLabel: UILabel!
      @IBOutlet weak var CellTwo: UILabel!

      //      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
      //      }
    }

第二件事是,故事板上的两个标签被放置在任意大小的故事板的两端。我的约束条件将右侧标签从模拟设备的边缘移开。我碰巧在模拟器里旋转了这个装置,普雷斯托!还有第二个标签。我应该更经常地使用预览器。:-)

您是否尝试过在单独的XIB中定义自定义单元格,而不是在tableview中使用原型单元格?它与您所做的几乎相同,但它只是在情节提要中有另一个XIB文件。要创建XIB,请执行以下操作:

文件->新建文件->iOS->用户界面->空 将UITableViewCell拖动到XIB并进行相应的自定义。将其类设置为SettingsCell并连接标签等。。。到你的设置呼叫类

然后在你的VC中注册如下:

 let nibName = UINib(nibName: "SettingsCell", bundle:nil)
 self.SettingsTV.registerNib(nibName, forCellReuseIdentifier: "SettingsCell")

答案的另一部分是本文顶部显示的NSCoder required init块的内容。该块是从一个不使用故事板原型单元的工作示例复制的。因此,当我用我的原型tableview单元格尝试时,我经常犯一个致命错误

如果您使用的是原型单元,那么该块应该(必须)是什么样子。所需的NSCoder必须调用super.init,如下所示:

      required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        //fatalError("init(coder:) has not been implemented")
      }
奇怪的是,当xcode通过注入模板NSCoder required init自动修复NSCoder问题时?函数,它注入一个将与原型单元断开的单元。为什么不添加super.init(..)行而不是致命错误行?可能有原因,但我看不出来


不管怎么说,所有这些现在对我来说都是可行的,即使是使用原型故事板表视图。因此,我认为这就是本文解决的所有问题。

在故事板中,您是否将原型单元的类更改为
SettingsCell
?此外,尝试断开和重新连接插座,有时它们会断开。最后,尝试在
cellforrowatinexpath
中创建单元格,如下所示:
let cell=tableView.dequeueReusableCellWithIdentifier(“setingscell”,forindexath:indexath)
感谢您的帮助。我确认:是的,故事板原型单元绑定到SettingsCell类。我再次断开/重新连接了插座(我同意,有时候插座会摇摇晃晃、断裂)。根据您的要求,我将“tv”本地变量更改为tableView.dequeue。遗憾的是,结果没有改变。如果我尝试为cell.CellTwo赋值,则会出现nil错误。似乎我正在将“出列”(新创建的)单元格强制转换为SettingsCell,希望该单元格