如何在“搜索”应用程序中使用 UItableView 和 UINavigationController?最佳实践

Posted

技术标签:

【中文标题】如何在“搜索”应用程序中使用 UItableView 和 UINavigationController?最佳实践【英文标题】:How to use UItableView and UINavigationController in a "search" application ? Best practices 【发布时间】:2011-09-05 04:12:42 【问题描述】:

我想将 UITableView 和 UINaviationController 结合在一个应用程序中,但作为新手,我见过的大多数应用程序只是将您直接发送到结果视图 (UITableView)。但是,我猜一个“正常”的搜索应用程序不会假设您在第一个屏幕上就有结果。第一个屏幕上应该有一个搜索表单,其中包含输入字段和一个触发搜索过程并显示一些结果和导航的按钮。

所以,我只是想在我的应用中复制这种正常行为。我已经制作了搜索表单(当然,上面没有显示导航)和一个名为“ListingViewController”的单独视图及其相关视图并包含一个 UITableView,我认为我应该在其中添加导航......下一个想法将是制作一个 DetailViewController 并可能和 ListingMapController 在 GoogleMap 中显示列表。

那么,我遇到的问题是如何添加这个导航控制器?

有人建议我将它添加到 SearchViewController 委托中... 但我当然不想在搜索表单上导航...

有人建议我以模态方式打开导航控制器... 但是,我还计划添加一个选项卡栏以允许用户查看其他信息(例如关于等...),并且使用模态导航控制器,我不知道他们是否仍会看到底部选项卡...

有什么建议吗?您认为什么是最佳做法,尤其是避免我的应用被 Apple 拒绝?

感谢您的阅读和帮助!

斯蒂芬

【问题讨论】:

【参考方案1】:

您可以使用您的视图控制器作为根视图控制器来初始化导航控制器。然后隐藏导航栏(如果需要)。然后,您将添加 navigationController.view 作为子视图。这基本上看起来像原始的视图控制器。然后就可以pushViewController:animated:来推送结果视图Controller。

因此,例如在您的 AppDelegate 中(或在适当的视图控制器中):

为 UINavigationController 创建一个属性和 ivar,并在界面构建器中连接其出口。然后将您的搜索控制器设置为导航栏的根视图控制器,并将其添加为子视图。

MySearchViewController* searchController = [[MySearchViewController alloc] init];
self.myNavigationController = [[UINavigationController alloc] initWithRootController:searchController];
[searchController release];
self.myNavigationController.navigationBarHidden = YES;
[self.window addSubview:self.myNavigationController.view];
[self.window makeKeyAndVisible];

当然,在你的 searchController 中,你会简单地说:

ResultsViewController* myResultsViewController = [[MyResultsViewController alloc] init];
//You may want to create another init method and pass in some arguments like an array:
// [[MyResultsViewController alloc] initWithResults:results];

然后推送viewController

//This is in your search controller class
[self.navigationController pushViewController:myResultsViewController Animated:YES];
[myResultsViewController release];

从结果 viewController 中返回,将视图控制器从 navigationController 视图控制器的堆栈中弹出。

//In results view controller perhaps in some IBAction for a back button:

-(IBAction)backButtonPressed:(id)sender


     [self.navigationController popViewControllerAnimated:YES];


【讨论】:

现在 App 委托中的 didFinishLaunchingWithOptions 看起来像: self.window.rootViewController = self.viewController; [self.window makeKeyAndVisible];返回是;根据您上面的建议,我在应用程序委托头文件中添加了一个实例变量: UINavigationController *ListingNav;然后在同一文件中的属性和实现文件中的相关综合语句。现在,我正在尝试按照您所说的将 searchController 添加为 rootView,但我看到您在将 searchContoller 添加到导航控制器之后就发布了它......是否正确? 当你将searchController添加到UINavigationController时,它会被UINavigationController保留。您可能想要也可能不想发布它,这取决于您的应用程序的工作方式。我回答的要点是,通过将视图控制器嵌套(因为没有更好的术语)作为 UINavigationController 的根视图控制器,您将能够在根视图控制器之上推送和弹出其他视图控制器。我有时会添加一个 UITabbar(不是 UITabbarController),然后为我的部分或全部选项卡添加一个带有根视图控制器的 UINavigationController。

以上是关于如何在“搜索”应用程序中使用 UItableView 和 UINavigationController?最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

如何在 .xib 文件中使用自定义 UITableView 和 UITableViewCell?

如何从 xib 文件加载视图控制器?

如何在 iOS 13.3 上使用 xib 显示 UITableViewCell?

在一个类中管理两个表视图

在 Xamarin.iOS 中使用 UITableViewCell 展开 Segue

从 API 加载图像