我正在努力将搜索栏添加到现有应用中。
我有一个表格,其中填充了从服务器下载的数据,我正在使用新的UISearchController。
我的搜索栏现在全部正常工作,并在用户在搜索栏中输入时显示新的结果过滤表。
我的问题是如何处理用户从这个新的过滤搜索结果表中选择一个项目?
我在我的过滤表中添加了一个新的segue并添加了一个didSelectRowAtIndexPath,它确实可以正常工作 - 但是当用户从过滤后的表中选择一个项目时,搜索栏仍然存在,并在该点之后单击“取消”会导致应用程序崩溃。 / p>
所以我不确定我应该做什么以及我应该如何处理用户从过滤表中选择项目?
我是否按照我的方式保存,但在用户选择项目时添加一些代码来取消搜索栏?
或者我是否这样做错了,有一种方法可以将选择从过滤后的表格返回到用户选择过滤项目的主视图控制器表中?
任何帮助,一如既往,非常感谢!
答案 0 :(得分:3)
初始化searchController
后,尝试设置searchController
的以下属性,以启用didSelectRowAtIndexPath
的{{1}}方法
UITableViewDelegate
答案 1 :(得分:1)
如您所知,任何选择的表都是在
方法下执行的- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
您需要做的就是在方法didSelectRowAtIndexPath:
中添加一个条件,以区分“完整”数据表与“已过滤”数据表。
在下面的示例代码中,我使用名为UserData的Singleton来存储我的选择,但是有许多不同的实现,欢迎提出建议。 (我不会讨论单身人士的情况,但如果你有兴趣,请查看Matt Galloway撰写的this blog)。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (mySearchController.active) {
// if the search bar is active use filteredData array
[[UserData sharedUserData] setSelection:filteredData[indexPath.row]];
// here you can add your segue code
} else {
// if search bar is not active then use the full data set
[[UserData sharedUserData] setSelection:unfilteredData[indexPath.row]];
// here you can add your segue code
}
// Optional:
// if you would like to add a checkmark for selection
// first remove any existing checkmarks
for (UITableViewCell *cell in [tableView visibleCells]) {
cell.accessoryType = UITableViewCellAccessoryNone;
}
// then add new check mark
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
cell.accessoryType = UITableViewCellAccessoryCheckmark;
// and lastly tell the selected cell to deselect
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
我希望这会有所帮助。如果您对此有任何疑问或建议,请与我们联系。 :)
答案 2 :(得分:0)
您可能正在尝试从表控制器中显示新控制器。不要这样做,你应该从搜索栏控制器中显示它。
答案 3 :(得分:0)
当用户选择过滤的表格行时尝试取消搜索栏:
[yourSearchController.searchBar resignFirstResponder];