iOS Container View 和 Parent ViewController 通信?

iOS Container View and Parent ViewController communication?

如何与容器视图控制器和父视图控制器通信?我试图进行交流并在它们之间传递价值。我在绿色视图控制器中添加了一个容器视图。我用 "communicateSegue" 设置了 segue 名称。我搜索了一些方法,我知道我们可以设置 prepareForSegue 以在初始时传递值。

 -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
     if ([segue.identifier isEqualToString:@"communicateSegue"]) {
         NSLog(@"call prepare for segue at parent view controller");
     }
 }

但现在我想传递值并更改不同 viewcontroller 中的标签。不是初始的。

不知道怎么办?

问题:

有谁知道如何实现 ParentViewController 将值传递给 Container View Controller 并在 ContainerViewController 中显示标签?

反之,Container View Controller 单击按钮然后传递值并更改显示在 ParentViewController 中的标签 objective-c?

谢谢。

我在 parentViewController.h 中声明变量: #导入

 @interface ParentViewController : UIViewController
 @property (weak, nonatomic) IBOutlet UITextField *parentTF;
 @property (weak, nonatomic) IBOutlet UIButton *passValToChildVCBtn;

 @property (weak, nonatomic) IBOutlet UILabel *showContainerValLB;
 @property (weak, nonatomic) IBOutlet IBAction *passValueToContainerEvent;

 @end

在ContainerChildViewController.h #导入

 @interface ContainerChildViewController : UIViewController
 @property (weak, nonatomic) IBOutlet UILabel *showParentValLB;
 @property (weak, nonatomic) IBOutlet UITextField *childTF;
 @property (weak, nonatomic) IBOutlet UIButton *passToParentBtn;
 @property (weak, nonatomic) IBOutlet IBAction *passValueToParentBtnEvent;

 @end

test project in the here.

非常感谢。

关于将值传递给 containerView 控制器,您可以在 ChildViewController 中创建一个 属性 您希望传递的值。然后在您的 ParentViewController 中执行如下操作:

self.ChildViewController.yourProperty = yourValue

反面可以通过 4 种方式完成:

  • 您可以创建一个委托协议来在您的控制器之间传递数据。
  • 您可以 post 在您的 ChildViewController 中发送通知,并将父控制器添加为观察者。
  • 您可以使用 KVO。
  • 最简单的方法是,您可以在您的 parentviewController 中创建一个 属性 并像下面这样访问它

    ((YourParentViewControllerClassType *)self.parentViewController).yourParentProperty = TheValueYouWant;
    

非常简单,UIStoryboardSegue 使用 属性 -destinationViewController.
包含对目标视图控制器的引用 在方法 -prepareForSegue 中,您可以访问它并传递您需要的数据。
如果您需要将数据从子级传递给父级,我强烈建议您避免硬耦合并使用诸如委托或通知模式之类的东西。
请记住,您的父视图控制器已经包含对您的子视图控制器的引用,您只需使用 -childViewControllers 属性.

即可访问它

您可以使用 NSNotificationCenter 来更新所有屏幕,或者您可以这样做..
ContainerChildViewController.h

中创建一个 属性
 @property(nonatomic,copy)NSString * mytextString;

如果您导入 ContainerChildViewController.h,此 属性 将可以在您的 ParentViewController.h 中访问
你必须在 ParentViewController.h 中创建一个 NSString
在此您可以将按钮操作设置为复制 textfielddata.text 然后您可以将此值分配给您的 ContainerChildViewcontroller's 作为

// 在 ParenViewController

中创建第二个视图控制器的实例
UIStoryboard *mystoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
   ContainerChildViewController * second= [mystoryboard instantiateViewControllerWithIdentifier:@"ContainerChildViewController"];
        second.mytextString = self.mytextString;
// either you directly pass this value or use the string it should work both ways
        NSLog(@"%@",second.orderID);
        [self.navigationController pushViewController:second animated:YES];


回复如果有效

试试这个

- (IBAction)showDetail:(UIButton *)sender {

        DetailViewController *detailVc = [self.childViewControllers firstObject];
        detailVc.lable.text = sender.titleLabel.text;

}  

我是这样做的:

  1. 将 containerView 的 segue 标识符设置为 viewController
  2. 在父视图控制器中创建 property/variable myChildViewController 并在子视图控制器中创建 property/variable myParentViewController
  3. 在您的 prepareForSegue 方法中将此属性设置为对正确对象的引用
  4. 现在您可以通过此引用访问 parent/child 视图控制器的属性。

Swift中的示例:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if segue.identifier == "YourIdentifier" {

        // Set references
        myChildViewController = segue.destinationViewController as! YourChildViewController
        myChildViewController.myParentViewController = self
    }
}

Objective C

中的示例
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
     if ([segue.identifier isEqualToString:@"YourIdentifier"]) {

         // Set references
         myChildViewController = [segue destinationViewController]; 
         myChildViewController.myParentViewController = self
     }
 }

我没有尝试 objective C 代码,因为我从未使用过它。这只是一个例子来理解这个想法。

之后,您可以将子视图控制器中的任何 属性 父项设置为:

myParentViewController.property = value

并在您的父视图控制器中:

myChildViewController.property = value

希望这对任何人都有帮助!