通过 uinavigationcontroller 将变量从父视图传递到子视图

Posted

技术标签:

【中文标题】通过 uinavigationcontroller 将变量从父视图传递到子视图【英文标题】:Pass variable from parent view to child view through uinavigationcontroller 【发布时间】:2013-02-07 01:26:06 【问题描述】:

很抱歉,这似乎是一个简单的问题,但每次我在谷歌上搜索这个主题时,我只能找到如何将数据从子视图传递到父视图,反之亦然。

基本上,我展示的是一个模态视图,它位于它自己的 UINavigation 控制器中。模态视图需要知道是否允许用户“编辑”它 - 所以我认为最简单的方法是将子视图(isEdit)上的 BOOL 设置为 TRUE (这会得到根据发生的 segue 设置)但是因为这个模式视图是从 UINavigation 控制器呈现的 - 我无法从 -(void)prepareForSegue 函数访问它并直接设置 BOOL。我已经尝试对 UINav 控制器进行子类化,并在其中包含一个可以设置的 BOOL,然后在子视图中重新检查,但我似乎无法从子视图访问控制器 - 我会包含我的代码,但我确定一定有更简单的方法来完成这个任务!

有没有人能提出一种更经济的方式将这个布尔值“通过”UINavigationController 传递给子视图?

谢谢

【问题讨论】:

【参考方案1】:

如果你的 segue 调用导航控制器,你可以从 -prepareForSegue 设置根视图控制器的属性,像这样

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    if ([segue.identifier isEqualToString:@"MySegueId"]) 
        UINavigationController *navController = (UINavigationController *)segue.destinationViewController;
        MyViewController *childController = (MyViewController *)navController.childViewControllers.lastObject;
        childController.isEditable = YES;
    

【讨论】:

如果您正在使用情节提要,或者您正在以编程方式调用 segue。如果没有,您可以按照 Joel 的建议在初始化子视图控制器时设置该属性。【参考方案2】:

当您分配/初始化模态视图控制器时,只需设置属性(假设您的模态视图控制器称为 ProfileVC):

ProfileVC *vc = [[ProfileVC alloc] init];
vc.isEdit = YES;
[vc.navigationController presentModalViewController:vc animated:YES];

只需确保在 ProfileVC.h 中有一个名为 isEdit 的属性:

@interface ProfileVC : UIViewController
@property (nonatomic) BOOL isEdit;
@end

【讨论】:

OP 说导航控制器本身是模态的。也就是说,这样做,您将在使用 childVC 使用 –initWithRootViewController: 初始化 navController 之前设置属性。

以上是关于通过 uinavigationcontroller 将变量从父视图传递到子视图的主要内容,如果未能解决你的问题,请参考以下文章

无法通过 UINavigationcontroller.viewControllers 更改类的属性

当 UINavigationController 通过 Storyboard 模态呈现时,它的 rootViewController 与它没有连接

UINavigationController的使用介绍

通过 uinavigationcontroller 将变量从父视图传递到子视图

UINavigationController 如何成为 UITableView 的 navigationController?

通过 UINavigationController 将整个 UIView 从一个 ViewController 传递到另一个