【问题标题】:How to use didSelectRowAtIndexPath in objective-c如何在objective-c中使用didSelectRowAtIndexPath
【发布时间】:2011-11-07 02:39:11
【问题描述】:

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

这段代码有什么吸引你的地方吗?或者你有任何示例代码吗?我正在使用 Xcode 3 和模拟器 4.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];
}

非常感谢!

【问题讨论】:

  • 我假设 vailViewController 是一个@property(保留)?
  • 另外,什么是BookDetail?那应该是 vailView 吗?
  • 会出现任何错误吗?
  • 据我所知,您的代码很好。我们需要看看 self.vailViewController 属性是如何定义的。此外,如果您还可以提供应用程序崩溃时出现的特定错误消息/堆栈跟踪,那将非常有帮助。
  • 调试器在崩溃时告诉我这一点。抛出“NSException”实例后调用终止程序收到信号:“SIGABRT”。

标签: iphone objective-c xcode3.2 didselectrowatindexpath


【解决方案1】:
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 文件中的根视图。

希望对你有帮助。

编辑:

您的 cmets 中的错误:

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

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

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

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

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

【讨论】:

  • 谢谢 - 我尝试了这两种方法,但都没有成功。我在调试器中收到此错误 *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“不支持多次推送同一个视图控制器实例
  • 根据 John 添加到我的答案中的调试器信息,我认为这可能是正确的答案。异常抱怨找不到“查看”
  • @John - 那时不要保存控制器。尝试每次创建它。如果您以后担心性能,请查看 UINib
  • 我更新了答案,问题似乎是你的块底部两次推送到两个(或相同的)导航控制器......如果你真的需要这样做,你需要动画它两次?
  • 你不知道当视图控制器加载时我有多高兴。多谢你们。我很感激。当我拿出其中一个时,它起作用了。不管是哪一个。
【解决方案2】:

什么是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];
}

【讨论】:

  • 我对 aBookDetail 的坏处.. 我忘了切换,当我复制它时它应该是 vailView
【解决方案3】:

确保 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];

【讨论】:

  • 好吧,我在此代码所在的 tableviewcontroller 中保留了 VailView Controller。tableview 是根。我已将resortsnavconrtoller 保留在我的代表中-再次感谢您的帮助
  • 这里是来自调试器的更多内容:*** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无法在捆绑包中加载 NIB:'NSBundle /KingJohnLanz/Library/Application支持/iPhone Simulator/4.3/Applications/E038D880-31F0-40FA-9AC9-4F54F5093933/Ski Advisor.app>(已加载)',名称为'View''
  • 看来您在 initWithNibName:@"View" 中输入了错误的名称,我在这里发布了更详细的答案。
  • 我没有给出那个名字——这是约翰的问题。我认为你是对的......
  • 是的,我想评论他的评论,而不是你的答案。对不起。这只是对他发布的错误消息的回应。
猜你喜欢
  • 2016-02-14
  • 2017-06-01
  • 2015-03-23
  • 1970-01-01
  • 1970-01-01
  • 2022-12-03
  • 2011-02-10
  • 2015-04-07
  • 1970-01-01
相关资源
最近更新 更多