iOS容器视图和父ViewController通信?

时间:2015-03-02 07:18:38

标签: ios objective-c communication

如何与容器视图控制器和父视图控制器通信?我试图进行沟通并在它们之间传递价值。我在绿色视图控制器中添加了一个容器视图。我已经设置了segue名称和#34; communicSegue"。我已经搜索了一些方法,我知道我们可以设置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中显示标签?

反过来,容器视图控制器单击按钮然后传递值并使用objective-c更改ParentViewController中的标签显示?

感谢。

我在parentViewController.h中的声明变量:      #import

 @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中      #import

 @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

enter image description here

test project in the here

非常感谢你。

5 个答案:

答案 0 :(得分:10)

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

self.ChildViewController.yourProperty = yourValue

相反可以用4种方式完成:

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

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

答案 1 :(得分:2)

我这样做:

  1. 将segue的标识符从containerView设置为viewController
  2. 在父视图控制器中创建属性/变量myChildViewController,在子视图控制器中创建属性/变量myParentViewController
  3. 在您的prepareForSegue方法中
  4. 将此属性设置为对对象的引用
  5. 现在,您可以通过此引用访问父/子视图控制器的属性。
  6. Swift中的示例:

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    
        if segue.identifier == "YourIdentifier" {
    
            // Set references
            myChildViewController = segue.destinationViewController as! YourChildViewController
            myChildViewController.myParentViewController = self
        }
    }
    

    目标C中的示例

    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
         if ([segue.identifier isEqualToString:@"YourIdentifier"]) {
    
             // Set references
             myChildViewController = [segue destinationViewController]; 
             myChildViewController.myParentViewController = self
         }
     }
    

    我没有尝试过目标C代码,因为我没有使用它。这只是一个实现这个想法的例子。

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

    myParentViewController.property = value
    

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

    myChildViewController.property = value
    

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

答案 2 :(得分:1)

非常简单,UIStoryboardSegue包含使用属性-destinationViewController对目标视图控制器的引用。
在方法-prepareForSegue中,您可以访问它并传递您需要的数据 如果您需要将数据从子节点传递给父节点,我强烈建议您避免硬连接并使用委托或通知模式等内容。
请记住,您的父视图控制器已包含对子视图控制器的引用,您只需使用-childViewControllers属性即可访问它。

答案 3 :(得分:1)

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

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

如果您导入ParentViewController.h,则可以在ContainerChildViewController.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];


回复是否有效

答案 4 :(得分:0)

试试这个

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

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

}