如何在objective-c中使用didSelectRowAtIndexPath

Posted

技术标签:

【中文标题】如何在objective-c中使用didSelectRowAtIndexPath【英文标题】:How to use didSelectRowAtIndexPath in objective-c 【发布时间】: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”。 【参考方案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" 中输入了错误的名称,我在这里发布了更详细的答案。 我没有给出那个名字——这是约翰的问题。我认为你是对的...... 是的,我想评论他的评论,而不是你的答案。对不起。这只是对他发布的错误消息的回应。

以上是关于如何在objective-c中使用didSelectRowAtIndexPath的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中使用 Objective-C #define

如何在objective-c中使用didSelectRowAtIndexPath

如何在 Objective-C 中使用 Swift 文件?

如何在 Objective-C 中使用正则表达式验证 IP 地址?

如何在 Objective-C 中使用符号断点获取参数

SideMenu:如何包含在 Objective-C 项目中?