从ios中的tableview加载xib文件时出错

时间:2014-05-30 07:30:59

标签: objective-c ios7 uitableview

我正在尝试创建一个使用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的新手

我希望你理解我的问题

提前致谢

1 个答案:

答案 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。