Swift / XCode 6.4:来自UITableViewController的类没有初始值设定项

时间:2015-09-04 14:58:19

标签: xcode swift uitabbarcontroller

我有一个类作为UITableViewController的扩展:

import UIKit

class DetailsMyTasksViewController: UITableViewController {

@IBOutlet var backButton : UIButton!
var detailItem: Task

@IBAction func backToHome(sender : AnyObject) {
    /*dispatch_async(dispatch_get_main_queue()){
        self.performSegueWithIdentifier("selectedTasksToHome", sender: self)
    }*/
}

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

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

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

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 11 /* number of Task information/attributes --> 11 rows */
}

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

    let cell = tableView.dequeueReusableCellWithIdentifier("SelectedMyTaskDetails", forIndexPath: indexPath) as! UITableViewCell

    switch indexPath.row {
    case 0:
        cell.textLabel?.text = "Task id"
        cell.detailTextLabel?.text = String(self.detailItem.id)
        break
    case 1:
        cell.textLabel?.text = "Titolo"
        cell.detailTextLabel?.text = self.detailItem.titolo
        break
    case 2:
        cell.textLabel?.text = "Oggetto"
        cell.detailTextLabel?.text = self.detailItem.oggetto
        break
    case 3:
        cell.textLabel?.text = "Check mail abilitato"
        if (self.detailItem.check_mail) {
            cell.detailTextLabel?.text = "Abilitato"
        }
        else {
            cell.detailTextLabel?.text = "Non abilitato"
        }
        break
    case 4:
        cell.textLabel?.text = "Progetto id"
        cell.detailTextLabel?.text = String(self.detailItem.id_progetto)
        break
    case 5:
        cell.textLabel?.text = "Progetto nome"
        cell.detailTextLabel?.text = self.detailItem.progetto_nome
        break
    case 6:
        cell.textLabel?.text = "Assegnato a"
        cell.detailTextLabel?.text = self.detailItem.assegnato_a
        break
    case 7:
        cell.textLabel?.text = "Richiesto da"
        cell.detailTextLabel?.text = self.detailItem.richiesto_da
        break
    case 8:
        cell.textLabel?.text = "Priorità"
        cell.detailTextLabel?.text = self.detailItem.priorita
        break
    case 9:
        cell.textLabel?.text = "Termine consegna"
        var dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = "yyyy-mm-dd"
        cell.detailTextLabel?.text = dateFormatter.stringFromDate(self.detailItem.termine_consegna)
        break
    case 10:
        cell.textLabel?.text = "Stato"
        cell.detailTextLabel?.text = self.detailItem.stato
        break
    default:
        break
    }

    return cell
}

}

我不知道问题出在哪里,因为我在尝试编译时会收到标题中的错误。此外,我有另一个类似于这个类到另一个表视图控制器,它工作得很好,并且在该类中没有初始化器。问题是什么?

更新 我不知道为什么,但我刚刚改变了

var detailItem: Task

var detailItem: Task?

它有效。那是什么?

1 个答案:

答案 0 :(得分:1)

如果设置了var detailItem,则表示它属于Task类型。没有'?' detailItem不能为零,所以它必须有一个值。但是使用代码

var detailItem: Task

你没有给它一个值(它是空的,这是禁止的)。但是如果你设置了一个初始化器,你设置了detailItem的值,那么DetailsMyTasksViewController的对象永远不会有没有值的detailItem,这是可能的。

添加'?' to task你说detailItem可以为空(nil),所以默认设置为nil。

所以最后xcode并没有告诉你它是什么错误告诉你你可能想要做些什么来解决它。

结论:
- 错误:你说detailItem不能为零,但你不能给它一个值 -1。解决方案:添加一个'?'说它可以是零           -2。解决方案:为您的班级添加初始化程序 -3。解决方案:做类似的事情:

    var detailItem: Task = Task(...)