2017-02-20 2 views
0

私はインタラクティブなストーリーアプリを作っています。 PageController:UIViewControllerはストーリーをコントロールします。最初のページはうまくロードされますが、選択するとアプリケーションが致命的なエラーでクラッシュします。アンラッピングすると予期せずnilが見つかりました。オンライン:アウトレットがロードされる前にアウトレットにアクセスしないようにする方法

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

これを見ると、オプションのようです...私のStory.swiftファイルと通信していない可能性がありますか?

多分@IBOutlet firstChoiceButtonですか?しかし、私のすべての@BOOutlets /アクションは、私が思った通りに夢中になっています...ヘルプ?

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

ありがとうございました! –

関連する問題