2017-11-12 8 views
0

のための愚かな何かを準備でエラーが発生しましたが、私は単にシンプルperformSegueをスローし、多分セグエFUNC

@IBAction func requestPanel(_ sender: Any) { 

    performSegue(withIdentifier: "sendMail", sender: AnyObject) 
} 

を使用して単純な動きを任意のデータを渡すそして私ではないのViewControllerにtableviewControllerから移動しようとしていますsegue funcの準備に誤りがあります。

しかし、それは私の他のセグーとは何の関係がありませんか?

データがないため、セグに問題があることを理解しています。

ここで見ているように、セグエは上のセグエの準備です。

@IBAction func requestPanel(_ sender: Any) { 

    self.performSegue(withIdentifier: "sendMail", sender: AnyObject.self) 
} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    var indexPath: IndexPath = self.tableView.indexPathForSelectedRow! 
    let desti = segue.destination as! DeviceDetailTableViewController 

    let selectedRecord = onlineDevices[indexPath.row] 

    let panelWidth = selectedRecord.object(forKey: "panelwidth") as? String 
    let panelHight = selectedRecord.object(forKey: "panelhight") as? String 
    let panelPitch = selectedRecord.object(forKey: "panelpitch") as? String 
    let panelPower = selectedRecord.object(forKey: "panelpower") as? String 
    let panelWeight = selectedRecord.object(forKey: "panelweight") as? String 
    let panelMaker = selectedRecord.object(forKey: "maker") as? String 
    let panelModel = selectedRecord.object(forKey: "model") as?  String 

    desti.pawidth = panelWidth! 
    desti.pahight = panelHight! 
    desti.papitch = panelPitch! 
    desti.papower = panelPower! 
    desti.weight = panelWeight! 
    desti.maker = panelMaker! 
    desti.model = panelModel! 
} 



override func numberOfSections(in tableView: UITableView) -> Int { 
return 1 
} 
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
return onlineDevices.count 
} 
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "DeviceCell", for: indexPath) 

    // Configure the cell... 

    let noteRecord: CKRecord = onlineDevices[(indexPath as IndexPath).row] 

    cell.textLabel?.text = noteRecord.value(forKey: "maker") as? String 
    cell.detailTextLabel?.text = noteRecord.value(forKey: "model") as? String 


    return cell 
} 


} 
+0

あなたが実行セグエメソッドを呼び出すたびに、それはセグエを作成しますあなたがセグをしたい新しいビューコントローラ。これが完了すると、システムはprepareを呼び出して、次のView Controllerにデータを渡す機会を与えます。あなたがここでデータを逃して、展開を強制すると、それを壊そうとするとクラッシュします。 – BennX

+0

segueは、行を選択するのではなくボタンからトリガーされるので、選択した行を取得する前にsegue識別子を確認してください。 – vacawama

+3

DO _NOT_コードの写真を表示します。 Show _CODE_。 – matt

答えて

1

すべてsegues 。さまざまなセグを異なる方法で処理するには、segue.identifierを使用する必要があります。

あなたsendMailセグエがUIBarButtonアクションからの代わりに、選択された行から来ているので、そのセグエをチェックして別々に扱う:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "sendMail" { 
     // nothing extra to be done here 
    } else { 
     // do your normal path here 
     if let indexPath = self.tableView.indexPathForSelectedRow { 
      // you have a valid selected row so proceed 
     } 
    } 
} 
1

エラーメッセージはクリアです。行が選択されていないときは、一度にtableView.indexPathForSelectedRowと言っています。したがって、その値はnilであり、強制解除するとクラッシュします。

ユーザーがテーブルの行を選択することによって、唯一のセグがトリガーされたときに、オリジナルのprepareForSegueが書き込まれました。しかし、this segueはではありません。は、ユーザーがテーブルの行を選択することによってトリガーされます。ユーザーがボタンをタップするとトリガーされます。その違いを考慮する必要があります。

(これは全体のアーキテクチャの主要な欠陥である:同じprepareForSegueに与えられたビュー・コントローラの流れから全てsegues、ボトルネックとなる)同じprepare(for:sender:)方法通過しますのViewControllerで

+0

私のテーブルsegueは正常に動作しています、ちょうど新しいVCに別のセグを追加して、問題を起こしました。 – lightmaster2006

+0

あなたは元の 'prepareForSegue'をどういう意味か、それがどのように機能するのか理解せずに書きましたので、 – matt

関連する問題