2014-11-20 1 views
0

Я пытаюсь вызвать случайное значение в пределах моего массива в мой запрос, где он говорит: «ObjectId», но я получаю сообщение об ошибке "EXC_BAD_INSTRUCTION", где он говорит let votes = voteCount1["votes"] as Int. Он ниже моего IBAction с функцией addVote1.Swift - ошибка при вызове случайного значения в массиве

Куда я иду не так? Я пытаюсь получить значения для каждой переменной, которые находятся в пределах определенной строки в моем контроллере данных Parse (каждый с определенным объектным идентификатором), и отправить голосование соответствующей переменной внутри этой строки, но я получаю сообщение об ошибке. Единственный способ для меня не получить ошибку, если я конкретно определяю objectId вместо того, где он говорит «objectId» в query.getObjectInBackgroundWithId("objectId"). Где я могу ошибиться?

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

    var voteCount1 = PFObject(className: "VoteCount") 
    voteCount1["choices"] = 2 
    voteCount1["votes"] = Int() 
    voteCount1["votes2"] = Int() 
    voteCount1["optionName"] = String() 
    voteCount1["optionName2"] = String() 

    var voteCount2 = PFObject(className: "VoteCount2") 
    voteCount2["choices"] = 3 
    voteCount2["votes"] = Int() 
    voteCount2["votes2"] = Int() 
    voteCount2["votes3"] = Int() 
    voteCount2["optionName"] = String() 
    voteCount2["optionName2"] = String() 
    voteCount2["optionName3"] = String() 

    var voteCount3 = PFObject(className: "VoteCount3") 
    voteCount3["choices"] = 4 
    voteCount3["votes"] = Int() 
    voteCount3["votes2"] = Int() 
    voteCount3["votes3"] = Int() 
    voteCount3["votes4"] = Int() 
    voteCount3["optionName"] = String() 
    voteCount3["optionName2"] = String() 
    voteCount3["optionName3"] = String() 
    voteCount3["optionName4"] = String() 

    let array = ["BiEM17uUYT", "TtKGatVCi9"] 
    let randomIndex = Int(arc4random_uniform(UInt32(array.count))) 
    let objectId = array[randomIndex] 




} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

@IBOutlet weak var pollResults1: UILabel! 

@IBAction func addVote1(sender: AnyObject) { 
    var query = PFQuery(className: "VoteCount") 
    query.getObjectInBackgroundWithId("objectId") { 
     (voteCount1: PFObject!, error: NSError!) -> Void in 
     if error != nil { 
      NSLog("%@", error) 
     } else { 
      voteCount1.incrementKey("votes") 
      voteCount1.saveInBackgroundWithTarget(nil, selector: nil) 
     } 
     let votes = voteCount1["votes"] as Int 
     let votes2 = voteCount1["votes2"] as Int 
     self.pollResults1.text = "\(votes)" 
     } 
    } 
} 
+0

Добавить контрольную точку исключения и получить больше информации о том, где именно это происходит –

ответ

0

Я вижу, что в viewDidLoad можно определить некоторые объекты, хранить их в локальных переменных и их значения теряются заканчивается метод. Таким образом, они никоим образом не способствуют запросу и данным, которые должны находиться в parse db.

Это, я надеюсь, что вызов getObjectInBackgroundWithId не возвращает совпадения, и что параметр закрытия voteCount1 равен нулю.

Если это произойдет, вы должны увидеть сообщение об ошибке, напечатанное на консоли.

Таким образом, исключение происходит из-за того, что вы обращаетесь к переменной voteCount1, которая содержит nil. Вы должны переместить этот код в else отрасли:

if error != nil { 
     NSLog("%@", error) 
    } else { 
     voteCount1.incrementKey("votes") 
     voteCount1.saveInBackgroundWithTarget(nil, selector: nil) 

     let votes = voteCount1["votes"] as Int 
     let votes2 = voteCount1["votes2"] as Int 
     self.pollResults1.text = "\(votes)" 
    } 

, но я думаю, что есть какая-то другая ошибка в вашей логике коды, на основе рассмотрения я сделал в начале этого ответа.