如何在iOS中将数据从容器发送到父视图控制器?

时间:2014-02-25 19:17:45

标签: ios objective-c

我正在尝试将数据从容器(子视图)发送到父级。在另一个视图控制器中,我能够使用

将数据从父级发送到子级
-(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_;

}

2 个答案:

答案 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.
}

如果您的视图控制器嵌入在导航控制器中,并且您希望在按下后退按钮时将数据从子节点发送到父节点,则可以使用另一种方法。但是从你的问题来看,我不确定你是否就是这种情况。