致命错误:使用cloudkit展开Optional值时意外发现nil

时间:2015-02-23 19:40:44

标签: ios swift xcode6 icloud cloudkit

我一直收到以下错误:

fatal error: unexpectedly found nil while unwrapping an Optional value 

我想我只是不明白为什么。有人可以帮我找到我的错误吗?变量结果是可选的吗?

错误一直指向viewDidLoad()中的一行,我评论了哪里。谢谢。

//
//  ViewController.swift
//  Physics Help!
//
//  Created by Sam Hanson on 2/8/15.
//  Copyright (c) 2015 Sam Hanson. All rights reserved.
//


import UIKit
import CloudKit

class ViewController: UIViewController {

//VARIABLES********************************************************

@IBOutlet var c1Answer: UILabel!
@IBOutlet var questions: UILabel!
var resultsOfDB : String = ""
var indexes : [Int] = []
var counter : Int = 0
var newStr : String = ""

//*****************************************************************




override func viewDidLoad() {

    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    self.questions.text = String(getNewQbutton()) //error points to here*********

}


//load the answers, grab them from the cloud base
@IBAction func loadAnswers() {
    let container = CKContainer.defaultContainer()
    var publicDB = container.publicCloudDatabase

    let myQuery = CKQuery(recordType: "QuestionsTable", predicate: NSPredicate(value: true))

    publicDB.performQuery(myQuery, inZoneWithID: nil){
        results, error in

        if error != nil {
            println(error)
        }

        else
        {

            dispatch_async(dispatch_get_main_queue(), { () -> Void in

                self.c1Answer.text = results.description
                println(results.description)

            })
        }
    }

}




@IBAction func getNewQbutton() {

    let container = CKContainer.defaultContainer()
    var publicDB = container.publicCloudDatabase


    let myQuery = CKQuery(recordType: "QuestionsTable", predicate: NSPredicate(value: true))


    publicDB.performQuery(myQuery, inZoneWithID: nil){
        results, error in

        if error != nil {
            println(error)
        }

        else
        {

            dispatch_async(dispatch_get_main_queue(), { () -> Void in

                self.resultsOfDB = results.description

                //for each character in resultsOfDB
                for character in self.resultsOfDB{

                    if(character == "\""){
                        self.indexes.append(self.counter)

                    }
                    self.counter++
                }

                self.newStr = self.resultsOfDB.substringWithRange(Range<String.Index>(start: advance(self.resultsOfDB.startIndex, self.indexes[0] + 1), end: advance(self.resultsOfDB.endIndex, -(self.counter - self.indexes[1]))))

                self.questions.text = self.newStr
            })
        }
        self.counter = 0
    }

}

1 个答案:

答案 0 :(得分:2)

这个问题可能有两个原因:

<强> 1 这可能意味着您正在尝试调用未初始化的对象(text?)的函数(questions?)。

我的猜测是questions未初始化。所以,当你调用questions.text时,你在一个零插座上调用文本功能。

确保您的电子邮件地址questions在故事板中正确连接(您应该在@IBOutlet附近看到一个圆圈)。另外,请确保您没有与插座建立多个连接。

<强> 2 您的函数getNewQbutton@IBAction,不返回任何内容。所以声明String(getNewQbutton())并没有多大意义。由于函数getNewQbutton没有返回类型(并且是@IBOutlet),因此您可能将nil赋予String()。这可能是这个问题的第二个原因。