如何在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