2016-08-08 21 views
0

私は初心者で、私がcollectionViewを使用しているプロジェクトで作業しています。 collectionViewから、いくつかの値を詳細ビューに転送したいのですが、上記のエラーが発生しています。値はゼロではありませんが、どういうわけか、segueを実行している間にこのエラーを出しています。誰でも助けてください、私はひどくここにこだわっています。はアンラッピング中にnilが予期せず発見されました。オプション値prepareForSegue

//In my CollectionView Controller. 
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

if(segue.identifier == "DetailsView") 
    { 
     if let vc:DetailsViewController = segue.destinationViewController as? DetailsViewController 
      { 
       vc.details.text = self.description 
       vc.line.text = self.subText 
       vc.startTime.text = self.formatted_time 
     } 
} 
} 

//DetailsViewController 
import UIKit 

class DetailsViewController: UIViewController { 

    @IBOutlet var startTime: UILabel! 
    @IBOutlet var line: UILabel! 
    @IBOutlet var details: UILabel! 

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

    override func didReceiveMemoryWarning() { 

     super.didReceiveMemoryWarning() 
    } 

} 

答えて

1

これは基本的にIBOutletsが初期化されていないことを意味します。

文字列を設定してから、ラベルをviewDidLoadに設定する必要があります。

  1. あなたのコードをあなたのラベル

を設定し、あなたのpreparForsegue機能あなたDetailsViewControllerviewDidLoad

  • におけるこれらの文字列プロパティを設定し、あなたのDetailsViewController
  • で文字列プロパティを追加しますので、要約する

    //In my CollectionView Controller. 
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    
        if(segue.identifier == "DetailsView") 
        { 
         if let vc:DetailsViewController = segue.destinationViewController as? DetailsViewController 
         { 
          vc.detailsString = self.description 
          vc.lineString = self.subText 
          vc.startTimeString = self.formatted_time 
         } 
        } 
    } 
    
    //DetailsViewController 
    import UIKit 
    
    class DetailsViewController: UIViewController { 
    
        @IBOutlet var startTime: UILabel! 
        @IBOutlet var line: UILabel! 
        @IBOutlet var details: UILabel! 
    
        var startTimeString: String? 
        var lineString: String? 
        var detailsString: String? 
    
        override func viewDidLoad() { 
         super.viewDidLoad() 
    
    
         startTime.text = tmpStartTimeString 
         line.text = tmpLineString 
         details.text = tmpDetailsString 
    
        } 
    
        override func didReceiveMemoryWarning() { 
    
         super.didReceiveMemoryWarning() 
        } 
    
    } 
    
    のようになります。 210

    私のコードをチェックダブルは、私は非常に迅速にそれを書いてきました;)

  • 0

    先ビュー・コントローラでIBOutletsprepareForSegue終了DetailsViewController

    後にいくつかの時間まで設定されていない、3つのインスタンス変数を追加します。

    vc.details = self.description 
    vc.line = self.subText 
    vc.startTime = self.formatted_time 
    

    var startTime: String? 
    var line: String? 
    var details: String? 
    

    そしてprepareForSegueに、これら3つの値を設定します

    その後でviewDidLoadDetailsViewController

    detailsLabel.text = self.details 
    lineLabel.text = self.line 
    startTimeLabel.text = self.startTime 
    
    0

    2つの答えは、上記のあなたがsegue.destinationViewController as? DetailsViewControllerを呼び出すときに、これは@IBOutlet年代が注入されていることを意味するものではありませ同様prepareForSegueで例えばUIViewControllerのインスタンスを作成するときに指摘されたようまだ初期化されていません。ビューが完全にロードされたときに、次のオプションのうち2つを行うことができますのでsは、初期化され@IBOutlet」:

    1. あなたはprepareForSegueUIViewControllerの初期化後の値を保存することができているあなたのUIViewControllerの変数を作成します。別のviewDidLoad()UIViewControllerには@IBOutletの値を設定します。
    2. 別のオプションを使用すると、UIViewControllerのインスタンスを作成するときに、この方法では、あなたが完全に負荷をロードするためにビューを強制することができますし、prepareForSegueからあなた@IBOutlet年代を設定することができview(例えばlet _ = vc.view)プロパティを呼び出すです。

    私はこれがあなたに役立つことを願っています。

    関連する問題