2015-06-30 3 views
-1

В моем приложении каждый раз, когда я запускаю приложение, я получаю эту ошибку. fatal error: unexpectedly found nil while unwrapping an Optional value. Это очень расстраивает. Мой код для класса:My UITableView is nil Swift

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

Примечания: Когда я жесткий код мои entityCellArray с строковыми значениями и вынимают self.tableView.reloadData(), он прекрасно работает, отображая все строки, как предполагается. Вот скриншот моей настройки tableView с Main.storyboard. Note that <code>Info</code>'s class is set to the class with tableView inside it.

Большое вам спасибо!

+0

попытки изменить имя на выходе в вашей Tableview в – iAnurag

+0

я сделал, это до сих пор производится ошибка нулевой стоимости. @iAnurag – richbrz

+0

Что распечатывается println (tableView)? – Tim

ответ

0

Я думаю, что ваш код сбой на этой линии

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

Как ваш entityCellArray является массив строки, чтобы добавить ниже строки с этим Вы можете предотвратить аварию от случаться, благополучно разворачивания cell.textLabel?.text с.

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

И убедитесь, что ваш массив не пуст

+0

Во-первых, простое, но важное правило качественного кодирования Swift никогда не заставляло лить или разворачивать что-либо в Swift. Во-вторых, обновленный код не изменяет ничего, что могло бы привести к сбою. В-третьих, единственный возможный сбой в коде - это если у entityCellArray недостаточно элементов для indexPath.row, и проверка на пустой массив является неполной защитой от этого. –

+0

И неправильные ошибки времени индекса массива отличаются от разворачивания дополнительной ошибки. –