Objective c 目标C:如何重新加载视图控制器&x27;选择“选项卡”时的表视图
单击视图控制器的选项卡栏时,我需要在视图控制器中重新加载数据 我使用UITABBARCONTROLLEDELEGATE方法,如下所示:Objective c 目标C:如何重新加载视图控制器&x27;选择“选项卡”时的表视图,objective-c,uitabbarcontroller,Objective C,Uitabbarcontroller,单击视图控制器的选项卡栏时,我需要在视图控制器中重新加载数据 我使用UITABBARCONTROLLEDELEGATE方法,如下所示: - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { if (tabBarController.selectedIndex == 3) {
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
if (tabBarController.selectedIndex == 3)
{
[(SomeViewController *)viewController getData];
}
}
其中“getData”是SomeViewController类中的实例方法。但是,当我运行我的应用程序时,我得到以下错误
2011-07-01 02:12:11.193 onethingaday[19169:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UINavigationController getData]: unrecognized selector sent to instance 0x600d500'
有人能告诉我如何克服这个问题吗?当tabbarcontroller.selected index==3时,我只需要触发“getData”方法。请查看解决方案请查看解决方案从收到的错误消息中,我觉得您在选项卡控制器中使用了
UINavigationController
;在这种情况下,您不能直接向其发送getData
消息;您应该首先找出UINavigationController
下的哪个视图控制器应该接收该消息。(这实际上与选项卡栏selectedIndex
无关)
我不知道您的UINavigationController是如何组织的,但您可以:
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
if (tabBarController.selectedIndex == 3) {
//-- option 1: getData goes to the first view controller in the UINavigationController:
[[(SomeViewController*)[(UINavigationController*)viewController topViewController] getData];
//-- option 2: getData goes to the last view controller in the UINavigationController (the visible one):
[[(SomeViewController*)[(UINavigationController*)viewController visibleViewController] getData];
}
}
如果您提供有关UINavigationController
组织的更多详细信息,我可以帮助您进一步确定正确的选项
不管怎么说,正如您从模型中看到的那样,您的设计中存在一些不完全合适的地方。我强烈建议对此使用通知。也就是说,您的SomeViewController
将自己注册为给定类型的通知:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(someSelector:)
name:ShouldGetDataNotification
object:nil];
选项卡栏控制器会发送通知,让您的控制器在以下情况下做出反应:
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
if (tabBarController.selectedIndex == 3) {
[[NSNotificationCenter defaultCenter] postNotificationName:ShouldGetDataNotification object:nil];
}
....
}
看看。从您收到的错误消息中,我觉得您在选项卡控制器中使用了
UINavigationController
;在这种情况下,您不能直接向其发送getData
消息;您应该首先找出UINavigationController
下的哪个视图控制器应该接收该消息。(这实际上与选项卡栏selectedIndex
无关)
我不知道您的UINavigationController是如何组织的,但您可以:
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
if (tabBarController.selectedIndex == 3) {
//-- option 1: getData goes to the first view controller in the UINavigationController:
[[(SomeViewController*)[(UINavigationController*)viewController topViewController] getData];
//-- option 2: getData goes to the last view controller in the UINavigationController (the visible one):
[[(SomeViewController*)[(UINavigationController*)viewController visibleViewController] getData];
}
}
如果您提供有关UINavigationController
组织的更多详细信息,我可以帮助您进一步确定正确的选项
不管怎么说,正如您从模型中看到的那样,您的设计中存在一些不完全合适的地方。我强烈建议对此使用通知。也就是说,您的SomeViewController
将自己注册为给定类型的通知:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(someSelector:)
name:ShouldGetDataNotification
object:nil];
选项卡栏控制器会发送通知,让您的控制器在以下情况下做出反应:
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
if (tabBarController.selectedIndex == 3) {
[[NSNotificationCenter defaultCenter] postNotificationName:ShouldGetDataNotification object:nil];
}
....
}
查看。您可以在
UITableViewController
子类中实现-viewwillbeen
方法。当UITabBarController
切换到该视图时,应自动调用。它应该是这样的:
- (void)viewWillAppear {
[super viewWillAppear];
[self getData];
}
您可以在
UITableViewController
子类中实现-viewwillbeen
方法。当UITabBarController
切换到该视图时,应自动调用。它应该是这样的:
- (void)viewWillAppear {
[super viewWillAppear];
[self getData];
}