因此,使用storyboard,您可以从UITableViewCell创建一个segue,从第一个tableViewController到detailViewController。
不是太复杂,但是当故事板组合中引入了UISearchBarDisplayController时,如何将结果单元格转换为detailViewController?
我能够毫无问题地进行搜索,我遵循了本教程:http://clingingtoideas.blogspot.com/2010/02/uitableview-how-to-part-2-search.html
我所能做的就是从搜索中选择一行,它变为蓝色,不会转到detailViewController。
我已经实现了prepareForSegue方法,该方法适用于未搜索的单元格,但无法弄清楚这个。
答案 0 :(得分:4)
这是基于@James Chen评论的解决方案。还要使用不同的IndexPath,具体取决于表所处的状态。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"toDetail"]) {
Person *person = nil;
if (self.searchDisplayController.active == YES) {
NSIndexPath *indexPath = indexPath = [self.searchDisplayController.searchResultsTableView indexPathForSelectedRow];
NSLog(@"segue - section: %d, row: %d", indexPath.section, indexPath.row);
person = [self.filteredPersonArray objectAtIndex:indexPath.row];
}
else {
NSIndexPath *indexPath = indexPath = [self.tableView indexPathForSelectedRow];
NSLog(@"segue - section: %d, row: %d", indexPath.section, indexPath.row);
person = [self.personArray objectAtIndex:indexPath.row];
}
[[segue destinationViewController] setPerson:person];
}
}
答案 1 :(得分:2)
我尝试了你的解决方案,发现prepareForSegue被调用了两次 由于生命周期和didSelect ... - > performSegueWithIdentifier。
然后我专注于didSelect ...并提出了这个解决方案,我删除了segue并以编程方式推送视图:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
DestTableViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"DestViewController"];
CustomObj *custObj = nil;
if (tableView == self.searchDisplayController.searchResultsTableView) {
custObj = [filteredListContent objectAtIndex:indexPath.row];
} else {
storeToDetail = [self.fetchedResultsController objectAtIndexPath:indexPath];
}
controller.custObj = custObj;
[self.navigationController setNavigationBarHidden:NO];
[self.navigationController pushViewController:controller animated:YES];
// presentViewController::animated:completion is always full screen (see problem below)
}
然后我遇到了一些问题,因为我遵循了一个segue 来自mapView,导致:
//DestinationViewController
- (IBAction)back:(id)sender
{
[self.navigationController popToRootViewControllerAnimated:YES]; // list
[self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; // map
}
这不是这样做的方法,但现在可行。
然而,第一部分既简单又干净,也许它也适合你?!
答案 2 :(得分:0)
好吧我觉得我明白了,它似乎有点像黑客但它适用于我的目的:
我正在使用故事板: 我有一个UITableview控制器,UISearchBarDisplayController直接在它上面。没有代码只是拖放。
从那时起,我按照本教程使搜索栏正确搜索http://clingingtoideas.blogspot.com/2010/02/uitableview-how-to-part-2-search.html
然而,prepareForSegue:只允许我显示原始数组中的单元格,而不是搜索数组。
所以我使用了didSelectRowAtIndexPath:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (savedSearchTerm) {
searchRowSelected = indexPath.row; //<-- the trick that worked
[self performSegueWithIdentifier:@"ShowDetail" sender:self];
}
}
searchRowSelected是我在类顶部声明的int变量。
didSelectRowAtIndexPath:知道我选择哪一行,但prepareForSegue没有。这就是为什么我需要那个变量。
这就是我在prepareForSegue中使用它的方式:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if ([segue.identifier isEqualToString:@"ShowDetail"]) {
dvc = [segue destinationViewController];
NSIndexPath* path = [self.tableView indexPathForSelectedRow];
int row = [path row];
if (savedSearchTerm){ //set the detailViewController with the searched data cell
myDataClass* c = [searchResults objectAtIndex:searchRowSelected];
dvc.myDataClass = c;
}else{ //set the detailViewController with the original data cell
myDataClass* c = [array objectAtIndex:row];
dvc.myDataClass = c;
}
}
}
还可以使用此代码清理savedSearchTerm
-(void) searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller{
[self setSavedSearchTerm:nil];
}
如果有人有更好的解决方案我会全力以赴:)