How to access ObjectAtIndex in tabBarController with Swift?
Asked Answered
M

2

11

i used to say in obj-c

[self.tabBarController.viewControllers objectAtIndex:1];

but now in swift no ObjectAtIndex any more

self.tabBarController.viewControllers.ObjectAtIndex

Update

ok i am gonna make it simple lets consider i have tabBarController it contains 2 object [FirstViewController,SecondViewController] and i am trying to make a delegate between the object here is the code to set the delegate

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

when i Run , i got this error 0x1064de80d: movq %r14, %rax and no console error is showing up

Moises answered 19/8, 2014 at 20:54 Comment(0)
E
22

Your code is OK:

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

... however you can omit ! mark at the end and :SecondViewController type definition since it can be inferred by the cast:

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

The problem appears because you try to cast to the wrong class. Try to print to debug log name of the class of object at [1]; add this before your cast to check the class name:

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

UPDATE:

As we figured out in comments, you should cast received view controller to UINavigationController:

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

Later you can examine nc.viewControllers property and see if for instance its topViewController is SecondViewController:

if nc.topViewController is SecondViewController {
    var svc = nc.topViewController as SecondViewController
    // your code goes here
}
Easy answered 19/8, 2014 at 21:53 Comment(4)
console print UINavigationController and now i should pass the UINavigationController first right ?Moises
It means that at the 1-st position in your viewControllers array you have UINavigationController which is obviously not SecondViewController class that you use for the cast. That is why you get the error. Do you have your SecondViewController class instance wrapped inside navigation view controller?Easy
yeah i have a UINavigationController before both first and second viewControllerMoises
Thanks. Save my day +1.Telemann
U
3

You don't need objectAtIndex in swift, just use the subscript operator:

self.tabBarController.viewControllers[1]
Unmistakable answered 19/8, 2014 at 20:58 Comment(8)
i got this noob error when i use [1] 0x1064de80d: movq %r14, %raxMoises
Are you sure there are objects in that viewControllers array?Unmistakable
yeah sure i have 4 objectMoises
Can you update your question with some more context? It kind of sounds like you're now getting a separate error, but it's hard to tell with just the one line of code. Also do you get any errors in the debug console when it crashes?Unmistakable
do you have any other suggestions ?Moises
Not offhand. Do you have more of a stack trace than just that little bit of assembly?Unmistakable
look new update if i put ? to unrape var Svc:SecondViewController? = self.tabBarController.viewControllers[1] as? SecondViewController it works but when i try to set the delegate it fails even if i say Svc?.delegate = selfMoises
try self. tabBarController.viewControllers![2] as! UIViewControllerWomack

© 2022 - 2024 — McMap. All rights reserved.