我希望能够在我的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中读取,你可以在这里看到
答案 0 :(得分:1)
小男孩,你在杂草丛生中。
首先,停止谈论推动“观点”。术语视图和视图控制器不可互换。视图是显示在屏幕上的对象。视图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