从一个单独的类中推送一个新的UIViewController

时间:2013-02-04 15:35:26

标签: ios objective-c delegates uinavigationcontroller appdelegate

我目前为我的应用编写了一个滑块(类似于Facebook应用)。在滑块的顶部是搜索框,控制搜索功能的方法也在应用程序委托中。

同样,我有一些方法可以在一个单独的类(SliderMenuViewController)中控制滑块的表视图。

我正在寻找滑块(搜索框或tableview单元格)的方法,以便能够告诉RootViewController(或任何viewController当前可见)推送新的ViewController(在UINavigationController中)。

这是我尝试做的(此代码在AppDelegate中):

-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{
NSLog(@"Searching for: \"%@\"",searchBar.text);
[searchBar resignFirstResponder];
IndexAndSearch *vc = [[IndexAndSearch alloc]initWithNibName:nil bundle:nil];
[self.navigationController pushViewController:vc animated:YES];
}

但它不起作用(它写入日志,但不推送新的ViewController)。我也尝试向RootViewController发送一条消息,如下所示:

-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{
NSLog(@"Searching for: \"%@\"",searchBar.text);
[searchBar resignFirstResponder];
RootViewController *vc = [[RootViewController alloc]initWithNibName:nil bundle:nil];
[vc performSearchFromDelegateSlider];
}

使用RootViewController的实现文件中的以下代码:

-(void)performSearchFromDelegateSlider{
NSLog(@"Searching");
IndexAndSearch *vc = [[IndexAndSearch alloc]initWithNibName:nil bundle:nil];
[self.navigationController pushViewController:vc animated:YES];
}

但是它再次只写入日志,而不是推送一个viewController。

我在Google和SO上看得很远,但却找不到任何有用的东西。 This question与我的相似,但没有任何合适的答案。我知道答案可能涉及授权,但我无法解决这个问题。

重要说明:此滑块几乎可以在应用中的每个ViewController中使用,这意味着我实现的任何解决方案都必须能够为每个类推送一个新的ViewController。这就是为什么我不能使用像this one这样的解决方案(我必须在每个ViewController中输入NavigationDelegate代码,这在我的应用程序中不起作用)。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我不相信这是最好的解决方案,但我能够使用通知来实现这一点。对于任何有兴趣的人,我都是这样做的:

第1步

第一步是在RootViewController的viewDidLoad方法中注册通知:

-(void)viewDidLoad{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveNavSliderSearchNotification:) name:@"navSliderSearchNotification" object:nil];
}

第2步

然后我需要在从滑块执行搜索时触发通知。 searchBar代码位于我的AppDelegate中,如下所示:

-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{
    //Write to the log
    NSLog(@"Searching for: \"%@\"",searchBar.text);
    //Dismiss the keyboard
    [searchBar resignFirstResponder];
    //Post the notification (to be used by the RootViewController
    [[NSNotificationCenter defaultCenter] postNotificationName:@"navSliderSearchNotification" object:self];
}

第3步

然后我需要编写 didReceiveNavSliderSearchNotification 类(当发布和接收 navSliderSearchNotification 通知时,将在RootViewController中调用它):

-(void)didReceiveNavSliderSearchNotification:(NSNotification *) notification {

    if ([[notification name] isEqualToString:@"navSliderSearchNotification"])
    NSLog (@"Successfully received the search notification!");    

    //Push the next ViewController when the *navSliderSearchNotification* is received
    IndexAndSearch *vc = [[IndexAndSearch alloc]initWithNibName:@"IndexAndSearch" bundle:nil];
    [self.navigationController pushViewController:vc animated:YES];
}

这就是我设法从一个单独的类推送新的viewControllers(在这种情况下是App Delegate,但我也可以从其他类中工作)。

最后一步(可选)

我可以从应用程序的任何位置访问我的滑块,因此我没有从RootViewController中的通知中取消注册(这意味着即使用户已被推送到另一个viewController,这些方法也会继续触发)。如果您不想使用此功能,请确保使用以下代码取消注册这些通知(它将在RootViewController中):

-(void)viewWillDisappear:(BOOL)animated{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"navSliderSearchNotification" object:nil];
}
像我说的那样,我并不完全相信这是最好的方法。如果您有其他您喜欢的解决方案,请随时发布。

答案 1 :(得分:0)

您是否尝试过这样做:

在AppDelegate中创建一个UIViewController变量,该变量始终引用屏幕上的当前UIViewController(您可能需要在每次创建视图控制器时设置当前控制器) 一旦完成全部。 在AppDelegate中使用

[self.currentViewController.navigationController pushViewController:anotherNewViewController animated:YES];