2016-08-10 7 views
1

私はSwiftで開発中です。SwiftでSegue経由で次のビューにデータを渡すには?

次の画像は私のストーリーボードです。

enter image description here

メインビューがあります。 メインビュースキャンビューに表示を変更してもScan viewプレススキャン(右バーボタンアイテム)にデータを渡します。 ストーリーボードセグエ

そして識別子があるScanView

私はスキャンにメインからデータを渡すために、次のコードを使用

プレススキャン(右バーボタン項目)

self.performSegueWithIdentifier("ScanView", sender: self) 

そして、次のビュー

//prepare jumping to next page 
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if (segue.identifier=="ScanView"){ 
     let desViewController = segue.destinationViewController as! ScanViewController 
     desViewController.myCenteralManager = myCenteralManager 
    } 
} 

にデータを渡すそして、それはlet desViewController = segue.destinationViewController as! ScanViewControllerでクラッシュし、次のようなエラーが表示されます:

Could not cast value of type 'UINavigationController' (0x3960e0a8) to 'BLEConnect.ViewController' (0x5514c). 

誰かがどのように解決するために私を教えることができます問題 ?前もって感謝します。

+3

エラーメッセージはかなり明確です。 UINaigationControllerをScanViewControllerとして強制的にキャストしようとしました。メインビューコントローラをスキャンビューではなくナビゲーションコントローラに埋め込むか、ナビゲーションコントローラのViewControllersプロパティからスキャンビューコントローラにアクセスする必要があります。私はまた、スキャンビューからメインビューに戻るセグの見た目が気に入らない。アンワインドセグを使用するか、メインビューコントローラをナビゲーションコントローラに組み込むと、デフォルトで戻るボタンが表示されます – Paulw11

答えて

1

エラーメッセージは、明らかに、segue.destinationViewControllerScanViewControllerとして取得しようとしますが、実際にはナビゲーションコントローラです。最初にナビゲーションコントローラを取得し、そのtopViewControllerプロパティを使用して、ターゲットのView Controllerを取得する必要があります。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
{ 
    if (segue.identifier=="ScanView") { 
     if let navController: UINavigationController = segue.destinationViewController as? UINavigationController { 
      if let desViewController: ScanViewController = navController.topViewController as? ScanViewController { 
       desViewController.myCenteralManager = myCenteralManager 
      } 
     } 
    } 
} 
0

あなたNavigationControllerは、Interface Builderで間違った場所に(おそらく)です。今、あなたがセグをすると、UINavigationControllerに行きますが、期待通りのScanViewControllerではありません。これは、UINavigationControllerScanViewControllerに強制しようとしているため、キャストが失敗する理由です。

この問題を解決するには、MainViewControllerUINavigationControllerに置き、次にScanViewControllerに直接つながなければなりません。

This guideは、Interface Builder、UINavigationController、およびSeguesを使って、何をしようとしているかを正確に示しています。

0

あなたはメインのViewControllerにごナビゲーションコントローラを埋め込み、あなたは上記の行ったようセグエを行うことができます。それは問題を解決するはずです。あなたの代わりにスキャンのViewControllerナビゲーションコントローラをキャストタイプを持っているので

エラーメッセージが表示されます。

関連する問題