我正在尝试创建一个包含名称,图片和数字的数组的应用。我已经创建了包含相应数组中所有数据的表视图;我已经有搜索栏工作并显示正确的搜索。我缺少的是在另一个视图控制器中显示搜索栏的结果。 (我已经使用了表视图:我选择了一个名称,然后打开另一个视图然后向我显示图片和数字等),我只是错过了同样的事情,但是当我进行搜索时。
这是我的代码。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *simpleTableIdentifier = @"DreamCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
}
if (tableView == self.tableView) {
cell.textLabel.text = [Names objectAtIndex:indexPath.row];
cell.imageView.image =[UIImage imageNamed:[Images objectAtIndex:indexPath.row]];
} else{
cell.textLabel.text = [searchResults objectAtIndex:indexPath.row];
}
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
if (self.searchDisplayController.isActive) {
[self performSegueWithIdentifier:@"ShowDreamsDetails" sender:self];
}
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
if ([segue.identifier isEqualToString:@"ShowDreamsDetails"]) {
NSString *object =nil;
// NSIndexPath *indexPath =nil;
if (self.searchDisplayController.isActive) {
indexPath =[[self.searchDisplayController searchResultsTableView] indexPathForSelectedRow];
object = [searchResults objectAtIndex:indexPath.row];
/* *Here is where I have the problem, If I leave it like thi,s it only shows the first row in my array; I needed to send the correct name and details to the other View Controller. */
DesciptionViewController *desViewController = segue.destinationViewController;
desViewController.PrincipalName = [Names objectAtIndex:indexPath.row ];
desViewController.PrincipalDescription = [Description objectAtIndex:indexPath.row];
desViewController.PrincipalNumber = [Numeros objectAtIndex:indexPath.row];
desViewController.Images1 = [UIImage imageNamed: [Images objectAtIndex: indexPath.row]];
} else {
DesciptionViewController *desViewController = segue.destinationViewController;
desViewController.PrincipalName = [Names objectAtIndex:indexPath.row];
desViewController.PrincipalDescription = [Description objectAtIndex:indexPath.row];
desViewController.PrincipalNumber = [Numeros objectAtIndex:indexPath.row];
desViewController.Images1 = [UIImage imageNamed: [Images objectAtIndex: indexPath.row]];
}
}
}
先感谢任何人,如果这是一个重复的问题,我很抱歉;我试图四处寻找,但我没有找到任何东西。
答案 0 :(得分:0)
从此代码中可以清楚地了解searchResults数组中存储的内容。通常这将是表示Principal的对象,它具有Name,Description,Numeros和Image的属性,但是您明确地将它们保存在单独的数组中。
当你进行搜索并显示结果时,你正在访问这些数组;你需要在这里重新创造你在那里所做的事情。换句话说,你知道你有搜索结果#row,现在你需要将它(我猜通过searchResults)映射到原始数组中的正确行。
换句话说,请发布tableView:cellForRowAtIndexPath
的代码编辑:在cellForRowAtIndexPath的代码之后:添加
好的,所以你只在searchResults中获得了名字,这意味着你必须找到其他数据。
同样,创建一个新的对象类型Principal是最简单也是最好的,它具有Name,Description,Numeros和Image的属性,那么你的主数组和searchResults不是字符串,而是Principals,你可以轻松处理为viewcontroller提供适当的信息。 (实际上,您的子视图控制器可能具有属性Principal * person,您可以从主阵列或搜索阵列中为其分配适当的Principal。
但是......如果你想修补它并使其有效,你可以>从Names数组中搜索searchResult中所选名称的名称。 (这假设没有两个人有相同的名字,否则它总会找到第一个。)
所以你的prepareForSegue改为:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
if ([segue.identifier isEqualToString:@"ShowDreamsDetails"]) {
NSInteger realRow = indexPath.row;
if (self.searchDisplayController.isActive) {
indexPath =[[self.searchDisplayController searchResultsTableView] indexPathForSelectedRow];
NSString * name = (NSString *) [searchResults objectAtIndex:indexPath.row];
realRow = [Names indexOfObject:name];
}
if (realRow != NSNotFound) {
DesciptionViewController *desViewController = segue.destinationViewController;
desViewController.PrincipalName = [Name objectAtIndex: row];
desViewController.PrincipalDescription = [Description objectAtIndex: row];
desViewController.PrincipalNumber = [Numeros objectAtIndex: row];
desViewController.Images1 = [UIImage imageNamed: [Images objectAtIndex: row]];
} else {
NSLog(@"Well, this is very odd; an invalid indexPath or a name in searchResults that's not in Names");
}
}
}
但同样,定义一个Principals对象并将其放在两个数组中会更好。