我正在尝试将数据从容器(子视图)发送到父级。在另一个视图控制器中,我能够使用
将数据从父级发送到子级-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
但是,我不确定如何将数据从子节点发送到父节点,特别是我正在尝试将属性userLat(它是容器的属性)发送给父节点。有什么建议吗?
PinViewController.m(父):
- (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.
}
MapWithinPinViewController(子,容器)
- (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_;
}
答案 0 :(得分:3)
Apple建议您在prepareForSegue中将父级设置为子级的委托。然后,子进程可以使用委托方法(自定义协议)与父进行通信。
答案 1 :(得分:0)
有几种方法可以完成这项任务,但是展开segues可能是最简单的。您将首先在父视图控制器中需要IBActon方法。当您从子视图控制器切换回父视图控制器时,将调用此方法。在您的情况下,将'userLat'替换为下面显示的'_data'实例变量。
在ParentViewController.m中添加以下方法......
- (IBAction)sendDataFromChildToParent:(UIStoryboardSegue *)segue
{
ChildViewController *childViewController = segue.sourceViewController;
_data = childViewController.data;
}
接下来,打开故事板并选择ChildViewController。按住Ctrl键,从按钮(用于导航回ParentViewController的按钮)拖动到视图控制器下方的停靠栏中的“退出”按钮(带有箭头的方框)。弹出菜单将显示。在“Selection Segue”下选择“sendDataFromChildToParent”。请记住,这只有在您不使用NavigationController的后退按钮切换回父级时才会起作用,因为导航栏后退按钮不会调用上面的方法。可能有一种方法可以让后退按钮调用该方法,但我还没有调查过它。
在您的ChildViewController中,请确保在导航回ParentViewController之前设置“数据”或您的“userLat”属性。在导航回ParentViewController之前,您可以在ChildViewController中使用以下方法执行任何最后一刻的设置。虽然从代码的外观来看,你不需要它,因为在mapView方法中设置了'userLat'。
- (void)prepareForSegue:(UIStoryboard *)segue sender:(id)sender
{
// Code for preparation before segue back to parent.
}
如果您的视图控制器嵌入在导航控制器中,并且您希望在按下后退按钮时将数据从子节点发送到父节点,则可以使用另一种方法。但是从你的问题来看,我不确定你是否就是这种情况。