didSelectRowAtIndexPath或prepareForSegue使用?

时间:2014-01-11 13:31:04

标签: ios objective-c uitableview if-statement

我希望能够在我的tableview中选择一个项目并获得正确的视图。 说我的uitableview有两个项目。一个有ubuntu值的其他有一个arch-在我的plist中的值来自arraA我有一个SystemID,它保存文本Ubuntu / Arch,从不都是

现在当我用ubuntu选择一个时我希望它推送到一个新的视图,其中ubuntu的东西是 如果我回去选择拱形,它将再次将我推向拱形物的视图

到目前为止我做了这个并且没有按预期工作:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *segueName = nil;

if ([[arrayA valueForKey:@"SystemID"]isEqualToString:@"Ubuntu Linux"]) {
    ActionViewController *controller = [[ActionViewController alloc] initWithNibName:@"Ubuntu Linux" bundle:nil];
    controller.Serverinfo = [arrayA objectAtIndex:indexPath.row];
    [self.navigationController pushViewController:controller animated:YES];
}
else if ([[arrayA valueForKey:@"SystemID"]isEqualToString:@"Arch Linux"]) {
    ActionViewController *controller = [[ActionViewController alloc] initWithNibName:@"Arch Linux" bundle:nil];
    controller.Serverinfo = [arrayA objectAtIndex:indexPath.row];
    [self.navigationController pushViewController:controller animated:YES];
}

[self performSegueWithIdentifier: segueName sender: self];
}

也试过准备forsegue

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if([arrayA valueForKey:@"Arch Linux"])
{
    ActionViewController *controller = (ActionViewController *)segue.destinationViewController;
    NSIndexPath *indexPath = [self.mainTableView indexPathForSelectedRow];
    controller.Serverinfo = [arrayA objectAtIndex:indexPath.row];
    NSLog(@"hostname = %@", controller.Serverinfo);
}
if ([arrayA valueForKey:@"Ubuntu Linux"]) {
    ActionViewController *controller = (ActionViewController *)segue.destinationViewController;
    NSIndexPath *indexPath = [self.mainTableView indexPathForSelectedRow];
    controller.Serverinfo = [arrayA objectAtIndex:indexPath.row];
    NSLog(@"hostname = %@", controller.Serverinfo);
}
}

arrayA是一个NSMutableArray,它从plist中读取,你可以在这里看到 nib

3 个答案:

答案 0 :(得分:1)

enter image description here

小男孩,你在杂草丛生中。

首先,停止谈论推动“观点”。术语视图和视图控制器不可互换。视图是显示在屏幕上的对象。视图CONTROLLER是一个管理视图集合的对象(通常是整个屏幕。)

您推送视图控制器,而不是视图。视图控制器然后在屏幕上显示它的内容视图。

现在,关于你的代码。

tableView:didSelectRowAtIndexPath:方法中的if语句搞砸了。

if ([[arrayA valueForKey:@"SystemID"]isEqualToString:@"Ubuntu Linux"])

您不希望在阵列上使用valueForeKey。该方法试图在数组中的每个对象上调用valueForKey,它返回的是结果数组。

数组由数字索引索引,而不是键。您希望数组作为表视图的数据源。

您要做的是从阵列中获取所选行的对象。

但是,为了进一步帮助您,您需要解释存储在arrayA中的内容。它是一系列字典吗?一串字符串?

此外,您正在将基于NIB的视图控制器代码与故事板代码混合。如果需要,你当然可以在同一个程序中使用它们,但作为初学者,你可能不应该这样做。

tableView:didSelectRowAtIndexPath方法中,您使用initWithNibName创建视图控制器,推送它,然后调用performSegueWithIdentifier。你想做其中一个,而不是两个。

答案 1 :(得分:1)

将您的方法替换为:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

if ([arrayA[indexPath.row][@"SystemID"]isEqualToString:@"Ubuntu Linux"]) {
    //ActionViewController *controller = [[ActionViewController alloc] initWithNibName:@"Ubuntu Linux" bundle:nil];
    // Make sure you replace Storyboard with your storyboard name
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil];
    ActionViewController *controller = [storyboard instantiateViewControllerWithIdentifier:@"Ubuntu Linux"];
    controller.Serverinfo = [arrayA objectAtIndex:indexPath.row];
    [self.navigationController pushViewController:controller animated:YES];
}
else if ([arrayA[indexPath.row][@"SystemID"]isEqualToString:@"Arch Linux"]) {
    ActionViewController *controller = [[ActionViewController alloc] initWithNibName:@"Arch Linux" bundle:nil];
    controller.Serverinfo = [arrayA objectAtIndex:indexPath.row];
    [self.navigationController pushViewController:controller animated:YES];
}
}

您不需要在didSelectRow中调用[self performSegueWithIdentifier: segueName sender: self];,因为您已经在didSelectRow方法中推送视图。如果你打电话给它,你会把视图放两次。

答案 2 :(得分:0)

将故事板与prepareForSegue

一起使用