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

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

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