UITableViewController 的子类在包含在子视图中时不会触发 didSelectRowAtIndexPath,我该如何解决这个问题?
Posted
技术标签:
【中文标题】UITableViewController 的子类在包含在子视图中时不会触发 didSelectRowAtIndexPath,我该如何解决这个问题?【英文标题】:Subclass of UITableViewController will not fire didSelectRowAtIndexPath when it is contained in a subview, how can I fix this? 【发布时间】:2012-03-22 00:57:30 【问题描述】:我有一个使用“addSubView”嵌入到另一个视图中的视图控制器,它没有捕获事件,我如何确保它可以捕获?
背景: 我正在尝试嵌套视图以分解由多个开发人员共享的故事板。为了以最少的功能重复来实现这一点,我/我们创建了一个包含选项卡控制器和 4 个选项卡的 mainStoryboard,每个选项卡都包含一个子视图,该子视图将 UIView(包含在另一个故事板中)加载到自身中。这些视图是这样添加的:
//Add sub view
UIStoryboard *board = [UIStoryboard storyboardWithName:@"MessagesStory" bundle:nil];
UIViewController *boardController = [board instantiateInitialViewController];
[self.view addSubview:boardController.view];
boardController.view.frame = CGRectMake(0, 0, 320, 480);
加载的初始视图控制器是一个 UITableView 子类,整个事情非常适合将表格及其内容呈现到屏幕上,我可以与表格交互并选择行,但是视图控制器上的事件侦听器'didSelectRowAtIndexPath' 未能触发。
感谢优秀的 NSLog(),我知道它不会触发:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
NSLog(@"Please kind sirs help a poor string appear in the console.");
我知道它与子视图有关,因为如果我将子视图作为主视图单独加载,事件侦听器将正常运行。
感谢任何帮助,因为这比预期花费的时间更长,在我完成实施之前,我可能会被拉到另一个项目。
【问题讨论】:
这不是实现viewController遏制的正确方式 好的,谢谢,你能给我指出正确的方向吗? 如果您有时间,我强烈建议您观看Apple video from wwdc 2011 在Implementing UIViewController Containment
上查找视频/幻灯片
你真的应该阅读文档:developer.apple.com/library/ios/#featuredarticles/… 顺便说一句,我喜欢 NSLog 字符串!!
听起来是个问题,可能是 UITableView 委托设置不正确造成的。
【参考方案1】:
我想通了。
这非常简单,但我必须阅读大量内容才能找到答案。我搜索的所有“addSubView”教程和示例,我什至不知道“addChildViewController”的存在。
反正我相信就是这么简单:
-(void)viewDidAppear:(BOOL)animated
if (firstLaunch)
firstLaunch = NO;
//Find the view controller in the other storyboard
UIStoryboard *board = [UIStoryboard storyboardWithName:@"MessagesStory" bundle:nil];
UIViewController *boardController = [board instantiateInitialViewController];
//add it as a child view controller (THIS IS WHAT I WAS MISSING)
[self addChildViewController:boardController];
//now it is okay to add the subview
[self.view addSubview:boardController.view];
//trigger this method (also missing this but it will run without it, I assume is good practice)
[boardController didMoveToParentViewController:self];
[super viewDidAppear:animated];
一旦我知道我想要“addChildViewController”,就很容易找到信息:
How does View Controller Containment work in iOS 5?
Is it wise to "nest" UIViewControllers inside other UIViewControllers like you would UIViews?
【讨论】:
以上是关于UITableViewController 的子类在包含在子视图中时不会触发 didSelectRowAtIndexPath,我该如何解决这个问题?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我不能使用“List”作为 UITableViewController 子类的类名?
UIViewController 子类(模仿 UITableViewController)没有被释放
子类化 uitableview 单元而不使用 uitableviewcontroller
为 PopoverController 子类化 UITableViewController