2016-07-24 14 views
1

現在、ナビゲーション用にCarbonKitライブラリを使用してiOSアプリを開発中です。私は現在、最初のタブにUITableViewを持っています。セルが選択されると、別のタブにプログラム的にナビゲートしたいと思います。Swift - 特定のインスタンスからメソッドを呼び出す方法は?

私は私のメインCarbonKitビューコントローラの下に、以下の機能を実装しました:

import CarbonKit 

class ViewController: UIViewController, CarbonTabSwipeNavigationDelegate { 


    func carbonTabSwipeNavigation(carbonTabSwipeNavigation: CarbonTabSwipeNavigation, viewControllerAtIndex index: UInt) -> UIViewController  { 

     switch index { 
     case 0: 
      return self.storyboard!.instantiateViewControllerWithIdentifier("AircraftViewController") as! AircraftViewController 
     case 1: 
      return self.storyboard!.instantiateViewControllerWithIdentifier("LoadController") as! LoadController 
     case 3: 
      return self.storyboard!.instantiateViewControllerWithIdentifier("SettingsController") as! SettingsController 
     default: 
      return self.storyboard!.instantiateViewControllerWithIdentifier("ViewControllerOne") as! ViewControllerOne 
     } 
    } 

    func navigate(index: UInt) { 
     carbonTabSwipeNavigation.setCurrentTabIndex(index, withAnimation: true) 
    } 

} 

setCurrentTabIndexは、プログラム的にタブを切り替えるために、ライブラリが提供する機能です。

import UIKit 
import CarbonKit 

class SecondViewController: UITableViewController { 

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

     \\ First Attempt 
     (ViewController() as CarbonTabSwipeNavigationDelegate).navigate(2) 

     \\ Second Attempt 
     let viewController = self.storyboard?.instantiateViewControllerWithIdentifier("controller") as! ViewController 
     viewController.navigate(2) 
    } 

} 

私は私の最初の試みで、私はViewControllerの新しいインスタンスを作成し、私の第二の試みは、私が期待していたインスタンスを選択しなかったことを理解:私は、次のしている私のUITableViewController

ViewControllerの最初のインスタンスでメソッドを有効にするには、SecondViewControllerからどうすればよいですか?あなたは、ナビゲーション・プロバイダーにアクセスする必要がありますので、ごSecondViewControllerクラスにCarbonTabSwipeNavigationプロパティを追加することにより

+0

あなたが作成した 'CarbonTabSwipeNavigation'への参照にぶら下がっている必要があります。私はあなたのアプリケーションデリゲートですべてを設定すると思います。 'carbonTabSwipeNavigation:viewControllerAtIndex'プロトコルメソッドはどこに実装しますか?私はそれがそれぞれの子ビューコントローラーの 'CarbonTapSwipeNavigation'でプロパティを設定するのに適していると思います。次に、そのプロパティを 'SecondViewController'で使用することができます。 – dylansturg

+0

私は 'viewControllerAtIndex'を上記の' viewController'クラスに実装しています。 viewControllerをプロパティとして設定するにはどうすればよいですか?上記の 'viewControllerAtIndex'メソッドで私の質問を更新しました。 – user3185748

答えて

1

スタート:

import UIKit 
import CarbonKit 

class SecondViewController: UITableViewController { 
    weak var carbonNavigation : CarbonTabSwipeNavigation?; 

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     if let carbonNav = self.carbonNavigation { 
      carbonNav.setCurrentTabIndex(index, withAnimation: true) 
     } 
    } 

} 

次は、私たちはそのcarbonNavigationプロパティを設定する必要があるので、使用できるようになります。 CarbonTabSwipeNavigationDelegateはそれを行うのに最適な場所です。副次的に、私はあなたの代理人によってあなたのSecondViewControllerが返されることはありません - それは意図されていますか?

import CarbonKit 

class ViewController: UIViewController, CarbonTabSwipeNavigationDelegate { 


    func carbonTabSwipeNavigation(carbonTabSwipeNavigation: CarbonTabSwipeNavigation, viewControllerAtIndex index: UInt) -> UIViewController  { 

     switch index { 
     case 0: 
      let aircraftVC = self.storyboard!.instantiateViewControllerWithIdentifier("AircraftViewController") as! AircraftViewController 
      aircraftVC.carbonNavigation = carbonTabSwipeNavigation 
      return aircraftVC 
     case 1: 
      // do something similar, instantiate view controller, set navigation property 
      return self.storyboard!.instantiateViewControllerWithIdentifier("LoadController") as! LoadController 
     case 3: 
      // do something similar, instantiate view controller, set navigation property 
      return self.storyboard!.instantiateViewControllerWithIdentifier("SettingsController") as! SettingsController 
     default: 
      // do something similar, instantiate view controller, set navigation property 
      return self.storyboard!.instantiateViewControllerWithIdentifier("ViewControllerOne") as! ViewControllerOne 
     } 
    } 

    func navigate(index: UInt) { 
     carbonTabSwipeNavigation.setCurrentTabIndex(index, withAnimation: true) 
    } 
} 

また、代わりにCarbonTabSwipeNavigationViewControllerプロパティを追加し、ViewControllerのメソッドとしてカーボンからあなたが必要とするすべてのメソッドを公開することができます。これは、プロパティ宣言の型を変更し、carbonTabSwipeNavigationの代わりにselfに設定することを意味します。

+0

強い参照サイクルを避けるために '弱いvar 'が必要なようです。 –

+0

最初の投稿では、単純化のために' AircraftViewController'クラスの名前を 'SecondViewController'に変更し、投稿を更新したときに変更を忘れました。そうでなければ、私が望んでいたように働く。私は2番目のビューコントローラで変数を宣言することを期待していませんでした。 Swiftと一緒にCocoaとXcodeの複雑さを学ぶためにお勧めするリソースはありますか?あなたの助けをもう一度ありがとう! – user3185748

+0

@AaronBrager良い点。コードを更新します。 – dylansturg

関連する問題