ios – 通过故事板和xcode正确创建手册
我是xcode的新手,而我正在尝试开发一个基本上是嵌入式表视图的示例应用程序,它具有与
this类似的许多级别。我有一个plist来存储每个tableview的单元格。如果单元格没有孩子,那么我希望能够在单元格被按下后进入一个详细的视图。最终,我想要根据数据类型去不同的详细视图。为此,我从故事板创建了一个详细的视图,拖动我的视图控制器到我的详细视图,创建一个手动“推”segue,并标记segue“segue1”。
编辑:源代码here 接下来我填充我认为是这个工作的必要功能,这是调用[self performSegueWithIdentifier:@“segue1”sender:myString];其中myString是我选择的单元格的标题。 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { //Check the dictionary to see what cell was clicked NSDictionary *dict = [self.tableDataSource objectAtIndex:indexPath.row]; NSString *myString = [dict objectForKey:@"Title"]; NSDictionary *dictionary = [self.tableDataSource objectAtIndex:indexPath.row]; NSArray *children = [dictionary objectForKey:@"Children"]; //If there is no children,go to the detailed view if([children count] == 0) { [self performSegueWithIdentifier:@"segue1" sender:myString]; } else{ //Prepare to tableview. DrillDownViewController *rvController = [[DrillDownViewController alloc] initWithNibName:nil bundle:[NSBundle mainBundle]]; //Increment the Current View rvController.CurrentLevel += 1; //Set the title; rvController.CurrentTitle = [dictionary objectForKey:@"Title"]; //Push the new table view on the stack [self.navigationController pushViewController:rvController animated:YES]; rvController.tableDataSource = children; } } 最后,我打电话准备segue,寻找标记为segue1的segue。 -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if([[segue identifier] isEqualToString:@"segue1"]) { DrillDownDetailController *dvController = [[segue destinationViewController] visibleViewController]; //DrillDownDetailController *dvController = [[DrillDownDetailController alloc] initWithNibName:nil bundle:[NSBundle mainBundle]]; [dvController setItemName:(NSString *)sender]; [self.navigationController pushViewController:dvController animated:YES]; } } 我以为这可以工作,但是由于某些原因,每当代码达到[self performSegueWithIdentifier:@“segue1”sender:myString];它会发生错误 *****由于未捕获的异常’NSInvalidArgumentException’终止应用程序,原因:’Receiver()没有标识符’segue1” 我不知道为什么告诉我它在故事板和代码中已经定义时找不到segue1。 解决方法
实际上有几个问题:
首先,在您为我们上传的项目中,segue不承担“segue1”标识符: 如果您还没有,您应该填写该标识符。 第二,当您从表视图推送到表视图时,您将调用initWithNibName来创建视图控制器。你真的想使用instantiateViewControllerWithIdentifier。 因此,说: DrillDownViewController *rvController = [[DrillDownViewController alloc] initWithNibName:nil bundle:[NSBundle mainBundle]]; 应该说: DrillDownViewController *rvController = [self.storyboard instantiateViewControllerWithIdentifier:@"TableView"]; 第三,你的prepareForSegue是: -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if([[segue identifier] isEqualToString:@"segue1"]) { dvController = [[segue destinationViewController] visibleViewController]; [dvController setItemName:self->nameToSend]; } } 而且应该简化为消除对visibleViewController的引用,例如: -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if([[segue identifier] isEqualToString:@"segue1"]) { dvController = segue.destinationViewController; dvController.itemName = nameToSend; } } 第四,你的DrillDownDetailController.m有这个方法: -(void) setItemName:(NSString *)itemName { if(!itemName) { itemName = [[NSString alloc] initWithString:itemName]; } label.text = itemName; } 这里有一些问题,但您不应该在此更新label.text(因为它可能还没有创建!)。你应该完全消除这个自定义设置器方法(只需让Xcode为您合成标准设置器),并将您的viewDidLoad更改为如下所示: - (void)viewDidLoad { [super viewDidLoad]; label.text = self.itemName; } 确保在viewDidLoad之前不更新UI对象! 我没有通过整个程序,但是通过这四个更正,我可以点击“SubItem1”,然后点“汽车”,然后再点“宝马”,看到一个说“宝马”的详细画面。我认为你的plist在其他项目上有一些问题(例如,鞋子的条目是字符串,而不是字典条目,你会收到一个错误…我假定你没有完全填写你的plist),但上面的修复纠正更重要的编码问题。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |