【问题标题】:My UITableView is nil Swift我的 UITableView 是 nil Swift
【发布时间】:2015-09-17 12:57:06
【问题描述】:

在我的应用程序中,每次运行应用程序时都会出现此错误。 fatal error: unexpectedly found nil while unwrapping an Optional value。这是非常令人沮丧的。我的课程代码:

import UIKit
import Foundation
class MainViewController: UIViewController, UITableViewDataSource, UITableViewDelegate{
    @IBOutlet weak var nameField: UITextField!
    @IBOutlet weak var amountField: UITextField!
    @IBOutlet weak var whoPaysLabel: UILabel!
    @IBOutlet weak var statusLabel: UILabel!
    @IBOutlet weak var datePicker: UIDatePicker!

    var names:[String] = []
    var amounts:[Int] = []
    var dates:[String] = []
    var whoPays:[String] = []
    var status:[String] = []
    var arrayNumber:Int = -1


    @IBOutlet var tableView: UITableView!

    let textCellIdentifier = "EntityCell"

    var entityCellArray:[String] = []

    let newDate = NSDate()

    override func viewDidLoad() {
        super.viewDidLoad()
        println(tableView)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    override func viewWillAppear(animated: Bool) {
        self.tableView.reloadData()
    }
    @IBAction func changeWhoPays(sender: UISwitch) {
        if(sender.on){
            whoPaysLabel.text = "\(nameField.text) pays you"
        }else{
            whoPaysLabel.text = "you pay \(nameField.text)"
        }
    }

    @IBAction func changeStatus(sender: UISwitch) {
        if sender.on{
            statusLabel.text = "paid"
        }else{
            statusLabel.text = "not paid"
        }
    }

    func createNewEntity(){
        names.append(nameField.text)
        var newAmount = self.amountField.text.toInt() ?? 0
        amounts.append(newAmount)
        let formatter = NSDateFormatter()
        formatter.dateStyle = NSDateFormatterStyle.MediumStyle

        var dateString = formatter.stringFromDate(datePicker.date)
        dates.append(dateString)
        if whoPaysLabel.text == "\(nameField.text) pays you" || whoPaysLabel.text == "... pays you"{
            whoPays.append("they pay")
        }else{
            whoPays.append("you pay")
        }
        status.append(statusLabel.text!)
        arrayNumber++
        entityCellArray.append("\(names[arrayNumber])  -  \(amounts[arrayNumber])  -  \(dates[arrayNumber])  -  \(status[arrayNumber])")
        let created = UIAlertController(title: "success", message: "creation successful", preferredStyle: UIAlertControllerStyle.Alert)
        created.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Cancel, handler: nil))
        presentViewController(created, animated: true, completion: nil)
        nameField.text = ""
        amountField.text = ""
        whoPaysLabel.text = "..."
        datePicker.date = newDate
        println("\(entityCellArray[arrayNumber])")
        printCount()
    }

    //test function, not to be implemented in app
    func printCount(){
       println(entityCellArray.count)
    }

    @IBAction func createButtonPressed(sender: UIButton){
        createNewEntity()
    }

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return entityCellArray.count
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier(textCellIdentifier, forIndexPath: indexPath) as! UITableViewCell
        cell.textLabel?.text = entityCellArray[indexPath.row]
        return cell
    }
}

注意:当我用字符串值对 myentityCellArray 进行硬编码并取出 self.tableView.reloadData() 时,它工作得很好,显示所有字符串都应该是这样。这是我使用Main.storyboard 设置的tableView 的屏幕截图。

非常感谢!

【问题讨论】:

  • 尝试更改您的 tableView 的出口名称
  • 我做了,它仍然产生 nil 值错误。 @iAnurag
  • println(tableView) 打印出什么?
  • ;层 = ;内容偏移:{0, 0}; contentSize: {320, 0}> 下一行 nil @Jeff
  • 你的数组包含什么?

标签: ios iphone uitableview reload


【解决方案1】:

我认为你的代码在这一行崩溃了

cell.textLabel?.text = entityCellArray[indexPath.row]

由于您的 entityCellArray 是字符串数组,因此请在下面添加此行 您可以通过安全地解开 cell.textLabel?.text 来防止崩溃的发生。

var x = entityCellArray[indexPath.row] as! String
cell.textLabel?.text = x

并确保您的数组不为空

【讨论】:

  • 首先,一个简单但重要的高质量 Swift 编码规则,永远不要在 Swift 中强制转换或展开任何内容。其次,更新后的代码不会改变任何会导致崩溃的东西。第三,代码中唯一可能的崩溃是 entityCellArray 没有足够的 indexPath.row 元素,并且检查空数组是不完整的保护。
  • 并且错误的数组索引运行时错误与展开可选错误不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-12
  • 1970-01-01
  • 2014-09-10
  • 2012-09-29
  • 2020-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多