【问题标题】:How to pass parameters to a popover view controller inside a navigation controller如何将参数传递给导航控制器内的弹出视图控制器
【发布时间】:2012-11-27 19:25:39
【问题描述】:

我有一个 iPad 应用程序,在 detailviewcontroller 的导航栏中有一个拆分视图和一个右栏按钮。

此按钮调用由导航控制器和两个表视图组成的弹出框。 如下图所示

由于图片上的故事板很小,我添加了一些解释。 白色控制器是 detailViewController(splitviewcontroller 的右侧),它位于导航控制器内。白色视图右侧的三个视图从左到右依次为:navigationController、firstTableView、secondTableView。

我的问题是我需要将参数传递给第一个表视图才能正确配置。

当视图控制器共享同一个导航控制器时,我曾经这样做过。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if([[segue identifier] isEqualToString:@"popoverButtonSegue"]){
        MyPopoverFirstTableViewController *popoverFirstTVC = [[MyPopoverFirstTableViewController alloc] init];

        popoverFirstTVC = segue.destinationViewController;
        popoverFirstTVC.property1 = aProperty1;
        popoverFirstTVC.property2 = aProperty2;
    }
}

我的问题是执行此操作时出错,因为目标控制器不是我的 popoverFirstTableViewController 而是 NavigationController 和导航控制器当然没有“property1”和“property2”。

也许这是一个基本问题,但我被困在这里。

当该表位于导航控制器内时,如何通过分配我定义的一些属性来配置我的表视图?

【问题讨论】:

    标签: ios storyboard uipopovercontroller navigationcontroller


    【解决方案1】:

    所有的功劳都属于@Michael Kernahan,但只要他不将其作为答案发布,我就会将其写为寻找相同答案的人的后续行动。

    在我的情况下,问题是我正在分配目标控制器,即导航控制器

    popoverFirstTVC = segue.destinationViewController; 
    

    我应该做的是访问那个导航控制器的 topViewController。

    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        if([[segue identifier] isEqualToString:@"popoverButtonSegue"]){
            MyPopoverFirstTableViewController *popoverFirstTVC = (MyPopoverFirstTableViewController *)((UINavigationController *) segue.destinationViewController).topViewController;
    
            popoverFirstTVC.property1 = aProperty1;
            popoverFirstTVC.property2 = aProperty2;
    }
    

    【讨论】:

    • 好问题,好答案。两者都 +1!
    【解决方案2】:

    我不完全确定我是否遵循,因为故事板对我来说有点小。但是您似乎在您的代码中创建了一个闪闪发光的新 popoverFirstTVC,然后被分配丢弃它

    popoverFirstTVC = segue.destinationViewController;
    

    如果你把那一行注释掉,那么最后写

    segue.destinationViewController.itsPopover = popoverFirstTVC;
    

    然后您可以传递完全构造和初始化的 popoverFirstTVC 并让第二个 VC 中的代码将其拾取并使用它运行。当然,你需要

    @property (strong, readwrite) MyPopoverFirstTableViewController * itsPopover;
    

    在您的第二个 VC 的标题中。

    【讨论】:

    • 我做了一个编辑试图描述故事板。我在代码中显示的是在推送时将参数传递给视图控制器的常用方法。我在你给我的内容中遇到了同样的错误,因为 segue 仍然指向我要配置的第一个TVC 的导航控制器。
    • 对不起,我完全误解了。 (也许我仍然这样做!)所以segue.DestinationViewController 是 UINavigationController?这是否对 MyPopoverFirstTableViewController 产生了影响,它是图表上的下一个框?在这种情况下,它不会在 segue 之前实例化目标,因此您需要其他方式来传输数据。还是 MyPopoverTableViewController 是 UIViewController 管理的控制器之一?所以你可以使用segue.destinationViewController.viewcontrollers[n].property1 = ...
    • 快到了:UINavigationController 上的 .topViewController 属性可能会得到你想要的。
    • @MichaelKernahan 就是这样。把它写成答案,我会验证它
    • 顺便@emrys57 感谢您抽出宝贵时间来回答。 Michael Kernahan 的答案正是我所寻找的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2017-09-02
    相关资源
    最近更新 更多