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

在 UITableViewController 子类中的 tableView 后面放置一个 UIImageView

是否可以使用 xib 或情节提要对 UITableViewController 进行子类化?