How to send data from container to parent view controller in iOS?
我正在尝试将数据从容器(子视图)发送到父级。在另一个视图控制器中,我可以使用
1 | -(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender |
但是,我不知道如何将数据从子级发送到父级,特别是我正在尝试将属性userlat(容器的属性)发送到父级。有什么建议吗?
PinViewController . M(父母):
1 2 3 4 5 6 7 8 9 10 11 12 13 | - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. NSLog(@"children : %@", self.childViewControllers); //this returns the child view controller NSLog(@"children : %@", self.childViewControllers.userLat); //userLat is a property of the child view controller, but displays an error in Xcode. } |
mapwithinInviewController(子级,容器)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | - (void)viewDidLoad { GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.86 longitude:151.20 zoom:6]; mapView_ = [GMSMapView mapWithFrame:CGRectZero camera:camera]; mapView_.myLocationEnabled = YES; mapView_.delegate = self; self.view = mapView_; } - (void)mapView:(GMSMapView *)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate { NSLog(@"You tapped at %f,%f", coordinate.latitude, coordinate.longitude); [mapView_ clear]; GMSMarker *marker = [[GMSMarker alloc] init]; marker.position = CLLocationCoordinate2DMake(coordinate.latitude, coordinate.longitude); self.userLat = @"test"; marker.map = mapView_; } |
苹果建议,在您的"准备工作"中,您将家长设置为孩子的代理人。然后,子代可以使用委托方法(自定义协议)与父代进行通信。
有几种方法来完成这项任务,但放松塞舌尔可能是最简单的方法。您首先需要在父视图控制器中使用一个方法。当将子视图控制器分段回父视图控制器时,将调用此方法。在您的示例中,将"userlat"替换为下面显示的"u data"实例变量。
在parentviewcontroller.m中添加以下方法…
1 2 3 4 5 | - (IBAction)sendDataFromChildToParent:(UIStoryboardSegue *)segue { ChildViewController *childViewController = segue.sourceViewController; _data = childViewController.data; } |
接下来,打开故事板并选择ChildViewController。ctrl从按钮(用于导航回ParentViewController的按钮)拖动到位于视图控制器正下方的停靠区中的"退出"按钮(带有向右箭头的正方形)。将显示一个弹出菜单。选择"selection segue"下的"senddatafromchildtoparent"。请记住,只有当您不使用NavigationController的"后退"按钮返回父级时,这才有效,因为导航栏的"后退"按钮不会调用上述方法。可能有一种方法可以让back按钮调用该方法,但我没有研究过它。
在导航回ParentViewController之前,请确保在ChildViewController中设置了"数据"或"UserLat"属性。在导航回ParentViewController之前,可以使用ChildViewController中的以下方法执行任何最后一分钟的设置。尽管从代码的外观来看,您不需要它,因为在mapview方法中设置了"userlat"。
1 2 3 4 | - (void)prepareForSegue:(UIStoryboard *)segue sender:(id)sender { // Code for preparation before segue back to parent. } |
如果视图控制器嵌入在导航控制器中,并且您希望在按下后退按钮时将数据从子对象发送到父对象,则可以使用另一种方法。但从你的问题来看,我不确定这是否适合你。