2017-03-13 3 views
1

イベントオブジェクトをDetailViewControllerに渡そうとしていますが、クラッシュして「致命的なエラーが発生しました:オプション値のアンラッピング中に予期せぬエラーが発生しました。私はエラーが私の準備中(segue :)機能にあるとは思っていますが、私はこれを何時間もしてきたので、修正方法を見つけることができません。どんな助けもありがとう。ありがとう!ここでSwift prepareForSegueオブジェクトがnilである

は私のコードです:

class MainViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

@IBOutlet weak var textView: UITextView! 
@IBOutlet weak var tableView: UITableView! 

var events = [Event]() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 


    tableView.delegate = self 
    tableView.dataSource = self 

    parseCSV() 
} 

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


@IBAction func logOutAction(sender: AnyObject) { 
    if FIRAuth.auth()?.currentUser != nil { 
     do { 
      try FIRAuth.auth()?.signOut() 
      let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SignUp") 
      present(vc, animated: true, completion: nil) 

     } catch let error as NSError { 
      print(error.localizedDescription) 
     } 
    } 
} 

func parseCSV() { 
    let path = Bundle.main.path(forResource: "eventData", ofType: "csv") 
    do { 
     let csv = try CSV(contentsOfURL: path!) 
     let rows = csv.rows 

     for row in rows { 
      let eventTitle = row["Title "]! 
      let eventLoc = row[" Location "]! 
      let eventStart = row[" Start_Time "]! 
      let eventEnd = row [" End_Time"]! 

      let event = Event(title: eventTitle, loc: eventLoc, start: eventStart, end: eventEnd) 
      events.append(event) 
     } 
    } catch let err as NSError { 
     print(err.debugDescription) 
    } 
} 


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    if let cell = tableView.dequeueReusableCell(withIdentifier: "eventCell", for: indexPath) as? EventCell{ 
     let event = events[indexPath.row] 
     cell.updateUI(event: event) 

     return cell 
    } else { 
     return UITableViewCell() 
    } 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return events.count 
} 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    let event = events[indexPath.row] 
    performSegue(withIdentifier: "detailSegue", sender: event) 
} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "detailSeque" { 
     if let detailVC = segue.destination as? DetailViewController { 
      if let event = sender as? Event { 
       detailVC.event = event 
      } 
     } 
    } 
} 
} 

マイDetailViewControllerクラス:

class DetailViewController: UIViewController { 

var event: Event! 

@IBOutlet weak var eventTitle: UILabel! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    eventTitle.text = event.title // error here. says event is nil. 
    } 
} 
+1

あなたのセグアはどのようにストーリーボードにつながっていますか?それはテーブルセルかメインビューコントローラからですか? – dan

+0

@dan MainViewControllerの表のセルからのものです。 – Jay

答えて

1

セグエがあなたのセルから接続されているので、あなたはセルをタップすると、それはすでに自動的に実行。これをプログラムで実行すると、segueが2回実行されます.1回は値が正しく渡され、1回は回されません。

あなたが代わりにあなたの現在のコードが動作し、またはprepareForSegueのロジックのすべてを行うとdidSelectRowAtの実装を削除するようにコードを更新することになる場合には、セルのビューコントローラから接続されるように、あなたのセグエを変更することができ、次のいずれか

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "detailSeque" { 
     if let detailVC = segue.destination as? DetailViewController { 
      let row = tableView.indexPathForSelectedRow!.row 
      detailVC.event = events[row] 
     } 
    } 
} 
+0

まだ同じエラーが発生しています。 : – Jay

+0

あなたのIDは正しいですか?元のコードには2通りの方法があります。 – dan

+0

WOW。それは本当にタイプミスでした.... :)ありがとうございました!私があまりにも長くそれを見つめていたときに捉えにくかった。 XD – Jay

関連する問題