web-dev-qa-db-ja.com

SwiftでtabBarControllerのObjectAtIndexにアクセスする方法は?

私はobj-cで言っていました

[self.tabBarController.viewControllers objectAtIndex:1];

しかし、今はSwift ObjectAtIndexはもうありません

self.tabBarController.viewControllers.ObjectAtIndex

更新

わかりました、簡単にします。tabBarControllerが2つのオブジェクト[FirstViewController、SecondViewController]を含み、オブジェクト間にデリゲートを作成しようとしています。ここにデリゲートを設定するコードがあります。

var Svc:SecondViewController = self.tabBarController.viewControllers[1] as SecondViewController!
Svc.delegate = self

実行すると、このエラー0x1064de80dが発生しました:movq%r14、%rax、コンソールエラーは表示されません

11
Amr Mohamed

あなたのコードはOKです:

var svc:SecondViewController = self.tabBarController.viewControllers[1] as SecondViewController!
svc.delegate = self

...ただし、キャストから推測できるため、末尾の!マークと:SecondViewControllerタイプの定義は省略できます。

var svc = self.tabBarController.viewControllers[1] as SecondViewController

間違ったクラスにキャストしようとすると、問題が発生します。 [1]にあるオブジェクトのクラスのデバッグログ名を出力してみてください。キャストの前にこれを追加して、クラス名を確認します。

let vcTypeName = NSStringFromClass(self.tabBarController.viewControllers[1].classForCoder)
println("\(vcTypeName)")

更新:

コメントで理解したように、受信したViewControllerをUINavigationControllerにキャストする必要があります。

var nc = self.tabBarController.viewControllers[1] as UINavigationController

後でnc.viewControllersプロパティを調べて、たとえばそのtopViewControllerSecondViewControllerであるかどうかを確認できます。

if nc.topViewController is SecondViewController {
    var svc = nc.topViewController as SecondViewController
    // your code goes here
}
21
Keenle

SwiftではobjectAtIndexは必要ありません。subscript演算子を使用するだけです。

self.tabBarController.viewControllers[1]
3
Mike S