setSelectedIndex通过委托方法

时间:2014-03-20 11:17:27

标签: ios objective-c uitabbarcontroller uitabbar

我正在尝试通过另一个viewController中的委托方法调用tabBarViewController的setSelectedIndex

我已经完成了整个委托部分,并且我的tabBarViewController中的方法调用正确地在调用时登录到控制台。

我遇到的问题是,它不会将我的tabBar更改为正确的索引。这是我tabBarViewController.m

中调用的方法
-(void)passNewSelectedIndex{
    NSLog(@"delegate method called"); //This correctly outputs to the logs when the delegate method is called.
    [self setSelectedIndex:1];
}

但它不起作用。 现在,如果我在tabBarViewController.m的viewDidLoad中调用[self setSelectedIndex:1];,它可以工作,并且它正确显示index:1处的选项卡。但这显然不是我想设置它的地方。我想我可能会遗漏一些非常明显的东西,但我无法弄清楚是什么。

编辑发布相关.h和.m的代码

ScoreViewController.h:

@protocol ScoreViewControllerDelegate <NSObject>

- (void)passNewSelectedIndex;

@end

@interface CEWSoreViewController : UICollectionViewController{
    id <ScoreViewControllerDelegate> scoreDelegate;
}


@property (nonatomic, weak) id<ScoreViewControllerDelegate> scoreDelegate;

@end

ScoreViewController.m:

- (void)passNewSelectedIndex{

    CEWTabBarViewController *instanceOfTabBarCont = [[CEWTabBarViewController alloc] init];
    self.scoreDelegate = instanceOfTabBarCont;
    NSLog(@"I was called, hurray");
        [instanceOfTabBarCont passNewSelectedIndex];

}

TabBarViewController.h

#import "CEWFinalScoreViewController.h"

@interface CEWTabBarViewController : UITabBarController <UITabBarControllerDelegate, ScoreViewControllerDelegate>{
}



@end

tabBarViewController.m:

-(void)passNewSelectedIndex{
        NSLog(@"delegate method called");
    NSLog(@"self.tabBar: %@", self.tabBar);
    [self setSelectedIndex:1];
}

AppDelegate.m

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];


CEWTabBarViewController *tabViewController = [[CEWTabBarViewController alloc] init];


self.window.rootViewController = tabViewController;
[self.window makeKeyAndVisible];
return YES;

希望现在更有意义。

2 个答案:

答案 0 :(得分:1)

问题完全符合我的预期:

- (void)passNewSelectedIndex{
    CEWTabBarViewController *instanceOfTabBarCont = [[CEWTabBarViewController alloc] init];
    self.scoreDelegate = instanceOfTabBarCont;
    NSLog(@"I was called, hurray");
    [instanceOfTabBarCont passNewSelectedIndex];
}

您正在实例化一个新的标签栏控制器并在其上调用passNewSelectedIndex方法。问题是,标签栏控制器不是控制视图控制器所在标签栏的控制器。

试试这个:

[(CEWTabBarViewController*)self.tabBarController passNewSelectedIndex];

根据您的导航设置,您可能需要这样做:

[(CEWTabBarViewController*)self.view.window.rootViewController passNewSelectedIndex];

我们需要更多的项目来确定最佳方式来获得对正确的标签栏控制器的引用(我不建议你这样做),但重点是,我们必须获取对已经实例化的标签栏控制器的引用,该控制器已经控制了我们的标签栏,而不是简单地实例化一个新标签栏并期望它能够神奇地控制我们当前的标签栏。

它在标签栏控制器的viewDidLoad中工作的原因是因为标签栏控制器的每个实例都自己调用viewDidLoad。当移动到passNewSelectedIndex时,只有在其他人调用它时才会调用此方法。

答案 1 :(得分:0)

selectedIndex 是UITabBarController的属性

[self setSelectedIndex:1];

仅当当前控制器是UITabBarController的子类时才会起作用。

对于您的场景,您必须将UITabBarController作为参数传递

-(void)passNewSelectedIndex:(UITabBarController *)tabBar {
    NSLog(@"delegate method called"); 
    [tabBar setSelectedIndex:1];
}

如果声明你的委托方法的视图控制器本身是UITabBarController的子类,那么[self setSelectedIndex:1]; 会导致调用自己的tabBar而不是设置委托方法的那个。