代码之家  ›  专栏  ›  技术社区  ›  Winston Chen

在导航控制器之间传递值/参数的最佳实践是什么?

  •  2
  • Winston Chen  · 技术社区  · 14 年前

    在问这个问题之前,我在谷歌上搜索了一下。一般来说,人们建议在导航控制器之间传递值/参数的两种方法:

    1. 通过根视图控制器中的属性
    2. 通过数据模型

    我已经知道第一选择可能不是最佳实践。很多人似乎都采用这种做法。然而,我仍然不明白第二个实践是如何实施的。有人知道任何教程吗?

    此外,是否可以通过构造函数向下传递值/参数?我想唯一的问题是从子视图控制器中获取值/参数。

    2 回复  |  直到 14 年前
        1
  •  4
  •   Adam Eberbach Adil Shaikh    14 年前

    此文件定义委托协议:

    @protocol VCDelegate
    
    - (void)notifyParent:(NSString*)someString;
    
    @end
    

    您可以将它包含在您定义的任何视图控制器的.h中。在该视图控制器中,您声明一个IVAR:

    id<VCDelegate> delegate;
    

    在创建子视图控制器的视图控制器中,像往常一样包含子视图控制器的.h。不管你怎么加

    <VCDelegate>
    

    要指示它实现了您定义的协议,就像您指示它实现了UITableViewDelegate一样—您定义的委托的工作方式与此相同。

    创建子视图控制器时:

    MyChildViewController* myCVC = [[MyChildViewController alloc] initWithString:(NSString*)someString];
      myCVC.delegate = self;
    

    所以现在子视图控制器有一个委托,它是父视图控制器,在其中创建子视图的那个,以及将它推到导航堆栈上的那个。当然,您必须在父视图控制器中实现委托功能:

    顺便说一句,这里是您可以在堆栈中传递信息的地方——只需在创建之后设置ivar,与代理ivar相同。您会注意到有一个initWithString正在将一个字符串传递给一个自定义init方法,这是传递信息的另一种方法。你仍然做所有正常的初始化工作,只是额外传递数据。

    - (void)notifyParent:(NSString*)someString
    {
      NSLog(@"Child view controller says %@", someString);
    }
    

    然后在子视图控制器中

    [self.delegate notifyParent:@"Hello"];
    

    父VC从子VC获取数据。

        2
  •  1
  •   Community CDub    7 年前

    这个工作似乎是为了 NSNotificationCenter . 看看这个。 sending data to previous view in iphone