通过UITabBarController调用UIViewController进行推送

Posted

技术标签:

【中文标题】通过UITabBarController调用UIViewController进行推送【英文标题】:calling UIViewController through UITabBarController for push 【发布时间】:2014-02-18 08:42:06 【问题描述】:

在我的应用程序中,我将 UINavigationController 作为初始视图, 层次是这样的

UINavigationController-->LoginViewController -->UITabBarController-->UINavigationController -->MasterViewController

MasterViewController 本身就有 tableView

当推送通知到来时,我在应用程序在后台运行时单击推送通知,然后应用程序打开 masterViewController,问题是当我从推送通知打开应用程序时,我想更新 MasterviewController 中的 tableList。

我尝试像这样从 AppDelegate 导航到 MasterViewController

 -(void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 

    UINavigationController * navController = (UINavigationController *) self.window.rootViewController;

    MasterViewController * masterController = [navController.viewControllers objectAtIndex:0];

    [masterController updateList];

    

它不起作用,我如何在收到推送时更新 MasterViewController?

谢谢。

【问题讨论】:

【参考方案1】:

这也可以。

-(void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    MasterViewController * masterController = [storyboard instantiateViewControllerWithIdentifier:@"Your_StoryboardID"];
[masterController updateList];

【讨论】:

【参考方案2】:

你应该这样尝试:

UINavigationController * navController = (UINavigationController *) self.window.rootViewController;
for (id viewController in navController.viewControllers) 
    if ([viewController isKindOfClass:[MasterViewController class]]) 

              MasterViewController * masterController = (MasterViewController*) viewController; 
              [masterController updateList];
             break;
    

【讨论】:

我尝试了代码,但在 for 语句中 viewController 总是作为设置视图出现。所以它无法到达 if 语句。 如果您的MasterViewController 存在于UINavigationController 中,它应该可以工作。【参考方案3】:
UINavigationController * navController = (UINavigationController *) self.window.rootViewController;

MasterViewController * masterController = [navController visibleViewController];
if ([viewController isKindOfClass:[masterController class]]) 
    [masterController updateList];

eles
   //Hierarchy maybe not as your description

【讨论】:

【参考方案4】:

获取标签栏视图控制器并使用 pop 调用该视图方法...

    NSArray *array=[self.tabBarViewController viewControllers];

                    for(int i=0;i<array.count;i++)
                    

                        UINavigationController *navCont=[array objectAtIndex:i];
                        NSArray *navArray=[navCont viewControllers];
                        for (id view in navArray)
                        
                            if ([view isKindOfClass:[MasterViewController class]])
                            
                                MasterViewController * masterController =        (MasterViewController*) viewController; 
                                 [masterController updateList];

//if you want to pop to that view controller then use below two lines of code else put comments..

                                [self.tabBarViewController setSelectedIndex:0]; 
                                [navCont popToRootViewControllerAnimated:YES];
                            
                            break;
                         
                   

希望它能解决您的问题....

【讨论】:

以上是关于通过UITabBarController调用UIViewController进行推送的主要内容,如果未能解决你的问题,请参考以下文章

通过UITabBarController调用UIViewController进行推送

UIScrollView 在带有自动布局的 UITabBarController 中有一个无法解释的位置

UITabBarController 委托方法永远不会被调用

在 UITabBarController 内未调用 cellForRowAtIndexPath

UITabBarController - 如何访问视图控制器?

从 UITabBarController 调用 SFSafariViewController 并在按下“完成”后返回