1

我有一个带有导航表视图的标签栏。当我在表格视图中选择一个单元格时,我的应用程序崩溃了。我希望在选择单元格时打开一个新的视图控制器。我的猜测是当 didselectrowatindexpath 被调用时我没有正确推动它。该应用程序会挂起几秒钟,然后关闭。

这段代码有什么引起你注意的吗?或者你有任何示例代码吗?我正在使用带有模拟器 4.3 的 Xcode 3。

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        NSInteger row = [indexPath row];
        if (self.vailViewController == nil) {
            VailViewController *vailView = [[VailViewController alloc]  initWithNibName:@"View" bundle:nil];
            self.vailViewController = vailView;
            [vailView release];
        }

        vailViewController.title = [NSString stringWithFormat:@"%@", [resortsArray  objectAtIndex:row]];
        Ski_AdvisorAppDelegate *delegate = (Ski_AdvisorAppDelegate *)[[UIApplication  sharedApplication] delegate];
        [delegate.resortsNavController pushViewController:vailViewController animated:YES];
        [self.navigationController pushViewController:vailViewController animated:YES];
}

非常感谢!

4

3 回答 3

0

什么是BookDetail?看起来您可能不会像您认为的那样将 VailViewController 推入堆栈。下面的代码可能更符合您的要求。此外,调试器是否为您提供有关崩溃的任何错误信息?

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSInteger row = [indexPath row];
    if (self.vailViewController == nil) {
        VailViewController *vailView = [[VailViewController alloc]  initWithNibName:@"View" bundle:nil];
        self.vailViewController = vailView;
        [vailView release];
    }

    self.vailViewController.title = [NSString stringWithFormat:@"%@", [resortsArray  objectAtIndex:row]];
    Ski_AdvisorAppDelegate *delegate = (Ski_AdvisorAppDelegate *)[[UIApplication  sharedApplication] delegate];
    [delegate.resortsNavController pushViewController:self.vailViewController animated:YES];
}
于 2011-11-07T02:48:42.340 回答
0

确保保留 vailViewController。

@property (retain) VailViewController *vailViewController;

另外,Ski_AdvisorAppDelegate 的resortsNavController 是否保留?该属性是如何定义的?

另外,UITableViewController 是 UINavigationController 的 rootController 吗?如果是这样,您应该可以调用 [self navigationController]

[[self navigationController] pushViewController:detailedView animated:YES];

我通常在我的 appDelegate 中这样做:

_mainTableViewController = [[MainTableViewController alloc] init];
_navController = [[UINavigationController alloc] initWithRootViewController:_mainTableViewController];
于 2011-11-07T03:04:37.580 回答
0
if (self.vailViewController == nil) {
        VailViewController *vailView = [[VailViewController alloc]  initWithNibName:@"View" bundle:nil];
        self.vailViewController = vailView;
        [vailView release];
    }

在这段代码中,您的视图文件实际上命名为“View.xib”,因为如果不是,这就是您的崩溃。带有此错误消息

*由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无法在包中加载 NIB:“NSBundle(已加载)”,名称为“View”

因此,如果您想使用 initWithNibName 加载它并且您的文件被命名为:

VailViewController.h VailViewController.m VailViewController.xib

你需要:

VailViewController *vailView = [[VailViewController alloc]  initWithNibName:@"VailViewController" bundle:nil];

但是,如果它是标准的 UIViewController 子类,您只需要执行以下操作:

VailViewController *vailView = [[VailViewController alloc] init];

如果您刚刚在 Xcode 中创建了 UIViewController 子类并且没有更改任何内容,则上述方法有效。视图控制器知道如何加载它自己的视图。如果您让它为您创建一个 .xib 文件,并且您删除了其中的某些内容,或者只是不确定确保文件的所有者已连接到界面 bulder 中 .xib 文件中的根视图。

我希望这会有所帮助。

编辑:

您评论中的错误:

*由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“不支持多次推送同一个视图控制器实例

在您的代码中出现这两行:

[delegate.resortsNavController pushViewController:vailViewController animated:YES];
[self.navigationController pushViewController:vailViewController animated:YES];

我应该问这些是否是两个不同的导航控制器?如果是这样,为什么他们需要向他们推送完全相同的视图控制器?

我会删除其中一个,然后它应该毫无错误地推送视图控制器。

于 2011-11-07T03:52:19.303 回答