gpt4 book ai didi

ios - 从单独的类推送新的 UIViewController

转载 作者:行者123 更新时间:2023-11-29 04:09:07 25 4
gpt4 key购买 nike

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

类似地,我有在单独的类(SliderMenuViewController)中控制 slider 的表格 View 的方法。

我正在寻找一种方法,让 slider (搜索框或表格 View 单元格)能够告诉 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];
}

但它再次只写入日志,而不推送 View Controller 。

我在 Google 和 SO 上进行了广泛的搜索,但没有找到任何有用的东西。 This question和我的类似,但是没有找到合适的答案。我知道答案可能涉及委托(delegate),但我无法解决这个问题。

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

预先感谢您的帮助。

最佳答案

我不相信这是最好的解决方案,但我能够使用通知来实现此目的。对于任何感兴趣的人,这就是我所做的:

步骤 1

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

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

步骤 2

然后,当从 slider 执行搜索时,我需要触发通知。 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];
}

这就是我如何设法从一个单独的类(在本例中是应用程序委托(delegate),但我也让它在其他类中工作)推送新的 viewController。

最后一步(可选)

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

-(void)viewWillDisappear:(BOOL)animated{
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"navSliderSearchNotification" object:nil];
}

就像我说的,我并不完全相信这是最好的方法。如果您有其他喜欢的解决方案,请随时发布。

关于ios - 从单独的类推送新的 UIViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14690041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com