如何将参数传递给导航控制器内的弹出视图控制器
Posted
技术标签:
【中文标题】如何将参数传递给导航控制器内的弹出视图控制器【英文标题】: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”。
也许这是一个基本问题,但我被困在这里。
当该表位于导航控制器内时,如何通过分配我定义的一些属性来配置我的表视图?
【问题讨论】:
【参考方案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 的答案正是我所寻找的以上是关于如何将参数传递给导航控制器内的弹出视图控制器的主要内容,如果未能解决你的问题,请参考以下文章
iOS 11:带有不透明导航栏的导航控制器内带有滚动视图的弹出视图控制器在转换期间导致奇怪的内容动画
将带有可见导航栏的视图控制器弹出到带有隐藏导航栏的视图控制器时,带有 interactivePopGestureRecognizer 的黑色区域