Фатална грешка на IOS Swift: неочаквано намерена нула при разопаковане на незадължителна стойност

Аз съм начинаещ в програмирането на IOS и в цялото програмиране.

(Имам XCODE 6.4)

Имам код в моя TableViewController, в който има данни, които искам да предам на друг viewController. Четох много за това в интернет и след това написах този код:

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

    let identifier = "formuleTableViewCell"

    let cell = tableView.dequeueReusableCellWithIdentifier(identifier, forIndexPath: indexPath) as! formule



    let formuleCommand = formulesList[indexPath.row]

    // Configure the cell...

    var shortCut = formuleCommand.formuleText

    cell.formuleLabel.text = shortCut



    return cell
}






var valueToPass:String!

func tablView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {
    println("You selected cell #\(indexPath.row)!")

    // Get Cell Label
    let indexPath = tableView.indexPathForSelectedRow();
    let currentCell = tableView.cellForRowAtIndexPath(indexPath!) as UITableViewCell!;

    let identifier = "formuleTableViewCell"

    let cell = tableView.dequeueReusableCellWithIdentifier(identifier, forIndexPath: indexPath!) as! formule

    valueToPass = cell.formuleLabel.text
    performSegueWithIdentifier("detail", sender: self)

}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if (segue.identifier == "detail") {

        // initialize new view controller and cast it as your view controller
       var viewController = segue.destinationViewController as! specialitiesViewController
        // your new view controller should have property that will store passed value
        viewController.passedValue = valueToPass
    }

}

В моя TableViewController имам клетки, които съдържат етикети с някои данни. Искам да предам данни от тези етикети към друг ViewController. И когато стартирам приложението си, няма грешки, но когато щракна върху една от клетките, които трябва да ме преместят в друг ViewController (зададох сег за това), отпечатва грешка: fatal error: unexpectedly found nil while unwrapping an Optional value И приложението се срива. Моля, помогнете ми да поправя тази грешка!

Благодаря ви за вашите предложения!


person nomorehumor    schedule 06.08.2015    source източник


Отговори (3)


Имате valueToPass, дефиниран като имплицитно разопакована опция - т.е. казвате на iOS, че тук винаги ще има стойност.

Така че, когато се извика prepareForSegue и не сте задали valueToPass на нищо, то ще се провали. Трябва да го инициализирате с някаква стойност.

person Mark    schedule 06.08.2015

Бих препоръчал да използвате този код, за да отворите вашия контролер за изглед (ако имате клас за VC, който искате да отворите).

let viewController = self.storyboard?.instantiateViewControllerWithIdentifier("your_Storyboard_id") as! Your_VC_Class
        self.navigationController?.pushViewController(viewController, animated: true)
person richbrz    schedule 06.08.2015

Ако няма да знаете стойността на valueToPass при инициализацията, но може да знаете стойността известно време по-късно, трябва да направите valueToPass незадължителен:

var valueToPass: String?

...и след това се заемете с разопаковането му, когато имате нужда от него и обработката на случая, когато не е инициализиран по подходящ начин.

Ако няма да знаете стойността на valueToPass при инициализацията, но ще знаете стойността до момента, в който контролерът на изгледа е представен, тогава трябва да го оставите като имплицитно разопакована опция (т.е. както е), но се уверете, че задавате валидна стойност преди употреба.

Странична бележка: Най-общо казано, за нас е по-добре as? отколкото as! и да се справим със случая, когато актьорският състав не работи.

person Andrew Ebling    schedule 06.08.2015