如何从包含我的 UIViewController 的 UITableViewController 显示新视图?

Posted

技术标签:

【中文标题】如何从包含我的 UIViewController 的 UITableViewController 显示新视图?【英文标题】:How can I show a new view from the UITableViewController contained my UIViewController? 【发布时间】:2013-01-22 23:44:16 【问题描述】:

我在UIViewController 中有一个UITableViewController。虽然这个 table viewcontroller 是唯一涉及的,但当用户点击一行时,它可以很好地推送视图。然而,自从我把它移到 UIViewController 中包含的两个之一之后,行的点击突然什么都不做。

我有tried searching around,我不是第一个遇到这个问题的人,但没有一个答案适合我的情况,或者这些问题没有有效的答案。该链接是我找到的最接近的链接,但我没有使用故事板——我使用的是单独的 XIB。

那么如何在视图控制器中从视图控制器推送新视图?

回顾一下:

    这就是我所拥有的,它可以很好地将用户带到一个新屏幕!

    // Normal table behavior, as illustrated by [another question][2].
    
    - (void)tableView:(UITableView *)tableView 
    didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    
        SomeView *detailViewController = [[SomeView alloc] initWithNibName:@"SomeView" bundle:nil];
    
        // Pass the selected object to the new view controller.
        [self.navigationController pushViewController:detailViewController animated:YES];
    
    
    1234563没有了!

感谢cmets!这是一些代码来阐明我的情况。

    控制器中的控制器。这是我用来测试概念的测试项目中的一个文件。在这种情况下,我在 tableview 控制器中有一个 tableview 控制器。

    @interface SimpleTableViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
    
    // This is the controller within the controller
    @property IBOutlet SecondTableViewController *secondTableController;
    @property IBOutlet UITableView *secondTable;
    

    我的SecondTableViewController 有这个有趣的部分。

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    
        // Navigation logic may go here. Create and push another view controller.
    
        UIViewController *detailViewController = [[UIViewController alloc] initWithNibName:@"SimpleNonTableViewController" bundle:nil];
        // ...
        // Pass the selected object to the new view controller.
        [manualViewControllerParent.navigationController  pushViewController:detailViewController animated:YES];
    
    

用户与之交互的视图与SimpleTableViewController 挂钩。这样,SecondTableViewController 就“在”SimpleTableViewController 之内。如果您想了解更多详细信息,请随时发表评论!


我已将我的测试/概念项目放在 github 上。 https://github.com/hyliandanny/TableViewCeption

【问题讨论】:

您是在尝试推送之前已经推送过的视图控制器吗? “在 UIViewController 内是什么意思?它是子视图控制器吗? @rooster117 在这种情况下不是,不是。显示的屏幕目前只能通过此表访问。 @rdelmar tableviewcontroller 现在是视图中的一个属性。以前,视图只是一个 tableviewcontroller。 这没有任何意义。你是如何在另一个控制器中获得表格视图控制器的?在代码中?如果是这样,请发布。 【参考方案1】:

您需要使用自定义容器控制器来做您想做的事情。如果您使用情节提要,这将是最简单的,但您也可以使用 xibs 在代码中完成。外部控制器应该是 UIViewController,而不是表视图控制器。你可以这样做(在外部控制器中):

- (void)viewDidAppear:(BOOL)animated 
    [super viewDidAppear:animated];
    UIViewController *detailViewController = [[UIViewController alloc] initWithNibName:@"SimpleNonTableViewController" bundle:nil];
    [self addChildViewController:detailViewController];
    detailViewController.view.frame = set the frame to what you want;
    [self.view addSubview:detailViewController.view];
    [detailViewController didMoveToParentViewController:self];

您应该阅读 Apple 的自定义容器控制器文档。

【讨论】:

自定义容器控制器,嗯?很高兴知道!我会检查一下,谢谢你指出我正确的方向! 我讨厌对未来的研究人员这样做,但我将这个答案标记为“the”答案,即使我以另一种方式解决了它。这背后的原因是自定义容器控制器是一个 ios 5.0+ 解决方案,它反映了我实际使用的东西:委托和协议。通过定义可以由“外部”视图控制器实现的协议方法,“内部”视图控制器最终调用了包含/外部视图控制器处理的方法。根据我阅读的有关自定义容器控制器的内容,这与 rdelmar 所暗示的想法相同。【参考方案2】:

你需要确保什么:

您的UITableView 委托已连接到您的控制器。否则它不会调用didSelectRow。您可以在 xib 或 viewDidLoad 方法中执行此操作。 你的 self.navigationController 不是 nil 你的 detailViewController 不是 nil

我也认为你的意思是你的UITableView 在你的UIViewController 中。 UITableView 只是视图,而 UITableViewController 是控制器。您不能在另一个控制器中拥有一个控制器。

【讨论】:

为什么我不能在另一个控制器中拥有一个控制器? 是的,您可以在另一个控制器中拥有一个控制器,这就是为什么我在评论中询问它是否是子视图控制器。但是 OP 的做法是错误的。 嘿,我 OP!有人告诉我有问题我很高兴,我很想了解为什么这是错误的。例如,在单个屏幕上的两个表格之间切换的正确方法是什么?那是我原来的问题正在解决。你听起来很自信,所以我很高兴听到你的知识!再次感谢! @Danny 你是对的,你可以在另一个里面有一个控制器。我认为 rdelmar 的方式就是要走的路。

以上是关于如何从包含我的 UIViewController 的 UITableViewController 显示新视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何从内容 ViewController 呈现 UIViewController?

带有 UIViewController 的插件

如何从创建的 UIViewController 中的另一个 UIViewController 执行功能

如何从 UIViewController 填充表格视图

从 UIViewController 显示 UIView 作为上下文菜单预览

如何在 iOS 中以编程方式从基本 UIViewController 向我的所有视图控制器添加视图