2017-02-20 13 views
0

Я создаю приложение для интерактивной истории. PageController: UIViewController контролирует историю, первая страница загружается нормально, но когда я делаю выбор, приложение вылетает с фатальной ошибкой. Неожиданно обнаруживается нуль при распаковке. на линии:Как обеспечить, чтобы я не получал доступ к розеткам до их загрузки в

firstChoiceButton.setTitle(firstChoice.title, for: UIControlState()) 

Глядя его, похоже, есть дополнительный ... может быть, это не общение с моим файлом Story.swift?

Возможно, это @IBOutlet firstChoiceButton? но все мои @ IBOutlets/Actions подключены правильно, я думаю ... Помогите?

import UIKit 
class PageController: UIViewController { 

    @IBOutlet weak var storyLabel: UILabel! 
    @IBOutlet weak var firstChoiceButton: UIButton! 
    @IBOutlet weak var secondChoiceButton: UIButton! 
    @IBOutlet weak var backdrop2: UIImageView! 

    var page: Page? 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder)} 

    init(page: Page) { 
     self.page = page 
     super.init(nibName: nil, bundle: nil)} 

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


    if let page = page { 

      let attributedString = NSMutableAttributedString(string: page.story.text) 

      let paragraphStyle = NSMutableParagraphStyle() 

      paragraphStyle.lineSpacing = 5 

      attributedString.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle, range: NSMakeRange(0, attributedString.length)) 

    if let firstChoice = page.firstChoice { 

     firstChoiceButton.setTitle(firstChoice.title, for: UIControlState()) 

      firstChoiceButton.addTarget(self, action: #selector(PageController.loadFirstChoice), for: .touchUpInside) 

      } else { 

       firstChoiceButton.setTitle("Meep", for: UIControlState()) 
       firstChoiceButton.addTarget(self, action: #selector(PageController.playAgain), for: .touchUpInside) 
      } 

      if let secondChoice = page.secondChoice { 

       secondChoiceButton.setTitle(secondChoice.title, for: UIControlState()) 

       secondChoiceButton.addTarget(self, action: #selector(PageController.loadSecondChoice), for: .touchUpInside) 
      } 
     storyLabel.attributedText = attributedString 
    } 
    } 

    @IBAction func loadFirstChoice() { 
     if let page = page, let firstChoice = page.firstChoice { 
      let nextPage = firstChoice.page 
      let pageController = PageController(page: nextPage) 

      // playSound(nextPage.story.soundEffectURL as URL) 
      navigationController?.pushViewController(pageController, animated: true) 
     } 
    } 

    @IBAction func loadSecondChoice() { 
     if let page = page, let secondChoice = page.secondChoice { 
      let nextPage = secondChoice.page 
      let pageController = PageController(page: nextPage) 

      // playSound(nextPage.story.soundEffectURL as URL) 
      navigationController?.pushViewController(pageController, animated: true) 
     } 
    } 

    @IBAction func playAgain() { 
     navigationController?.popToRootViewController(animated: true) 
    } 
} 

ответ

0

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

func loadFirstChoice() { 
     if let page = page, let firstChoice = page.firstChoice { 
      let nextPage = firstChoice.page 
      //let pageController = PageController(page: nextPage) 

      // playSound(nextPage.story.soundEffectURL as URL) 
      let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 

      if let newPage = mainStoryboard.instantiateViewController(withIdentifier: "newpage") as? PageController { //newpage is the storyboard id of the view controller 
       newPage.page = nextPage 
       navigationController?.pushViewController(newPage, animated: true) 
      } 
     } 
    } 
+0

Спасибо за ваше время! –

Смежные вопросы