我正在尝试创建一个使用tableview的应用程序。
我正在填充tableview,我可以在表格中显示数据。现在我想要做的是当我点击tableview中的特定单元格时,我想在不同的文件夹中加载特定的xib文件。对于所有其他单元格我想加载第二个tableview。我正在使用故事板。
我正在使用
(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([((UITableViewCell *)sender).textLabel.text isEqualToString:@"ABCD"]) {
ABCD *abcdViewController = [[ABCD alloc] initWithNibName:@"ABCD" bundle:nil];
// Push the view controller.
[self.navigationController pushViewController:ABCDViewController animated:YES];
}
// Pass the selected object to the new view controller.
NSLog(@"%@", ((UITableViewCell *)sender).textLabel.text);
MethodsViewController *methodsViewController = segue.destinationViewController;
NSString *rowTitle = ((UITableViewCell *)sender).textLabel.text;
NSDictionary *selected = [[self methodsDict] objectForKey:rowTitle];
methodsViewController.rows = [selected objectForKey:@"rows"];
methodsViewController.methodsDict = [selected objectForKey:@"methodsDict"];
}
这是我正在使用的代码。我在搜索互联网后制作了这段代码。
但问题是
但是当我构建并运行它时,显示第一个tableview,当我点击ABCD单元时,xib加载但导航栏覆盖了xib文件的上半部分,当我点击导航中的后退按钮时吧,它带我到黑色空白页面并显示错误
嵌套推送动画可导致导航栏损坏
在意外状态下完成导航转换。导航栏子视图树可能已损坏。
,应用停止
我不知道我做错了什么我是ios的新手
我希望你理解我的问题
提前致谢
答案 0 :(得分:1)
至少有三种方法可以解决您的问题。
最简单的方法是使用shouldPerformSegueWithIdentifier:
来精确控制IB中指定的时间以及推送ABCD视图控制器的时间:
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender{
if ([((UITableViewCell *)sender).textLabel.text isEqualToString:@"ABCD"]) {
ABCD *abcdViewController = [[ABCD alloc] initWithNibName:@"ABCD" bundle:nil];
// Push the view controller.
[self.navigationController pushViewController:ABCDViewController animated:YES];
return NO;
}
return YES;
}
这对您来说应该很容易,因为它与您尝试使用prepareForSegue:
时的操作类似。使用prepareForSegue:
的当前方法的错误在于您正在推动ABCD控制器并执行segue。 shouldPerformSegueWithIdentifier:
允许您取消segue,也就是说,当您要手动推送时。
另一种方法是使用手动分段:
您可以通过从视图控制器拖动来创建IB中的手动segue(而不是从原型表格单元格拖动);你可以创建多个命名的segues;
在您的表格视图委托中覆盖tableView:didSelectRowAtIndexPath:
,以便它调用performSegueWithIdentifier:
:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *identifierOfSegueToCall;
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:nowIndex];
if ([cell.textLabel.text isEqualToString:@"ABCD"]) {
identifierOfSegueToCall = @"ABCDSegueIdentifier";
} else {
identifierOfSegueToCall = @"XYWZCellSegueIdentifier";
}
[self performSegueWithIdentifier:identifierOfSegueToCall sender:self];
}
最后,第三种方法是为您的表视图定义两个不同的单元格原型,并从每个原型单元格划分到适当的视图控制器中。这类似于您在设置当前segue时所做的,只有您应该添加一个新的原型单元并从中定义一个特定的segue。