将数据传递给目标视图控制器[重复]

Posted

技术标签:

【中文标题】将数据传递给目标视图控制器[重复]【英文标题】:passing the data to a destination view controller [duplicate] 【发布时间】:2013-04-10 13:29:08 【问题描述】:

我实际上是在使用核心位置和地图工具包框架来获取用户点击按钮的位置。我有两个视图控制器。第一个是带有地图视图的普通视图控制器,所有核心定位过程都在其中完成,以及反向地理编码。 第二个是表格视图控制器,显示从地理编码和位置的经纬度获得的数据。

我得到的问题是我无法将当前位置的信息传递给下一个视图。但是,我可以传递我的地理编码值。这对我来说似乎很奇怪,任何帮助将不胜感激。

mapViewController.m

#import "mapViewController.h"

@interface mapViewController ()

    CLLocationManager *locationManager;
    CLGeocoder *geoCoder;
    CLPlacemark *placemark;
    addressViewController *view;


@end

@implementation mapViewController
@synthesize mapView;

- (void)viewDidLoad

    [super viewDidLoad];
    // Do any additional setup after loading the view.
    locationManager = [[CLLocationManager alloc]init];
    geoCoder = [[CLGeocoder alloc]init];
    self.addressOutlet.enabled = NO;



-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    if([segue.identifier isEqualToString:@"addressSegue"])
    
        view= segue.destinationViewController;

         // assigning the addressPlacemark the same value as the current placemark
        view.addressPlacemark = placemark;

        NSLog(@"this is perfectly executed");

    


-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation

    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(userLocation.coordinate, 600, 600);
    [self.mapView setRegion:region animated:YES];


-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations

    CLLocation *newOne = [locations lastObject];

    [locationManager stopUpdatingLocation];
    NSLog(@"the new location is : %@", newOne);
    NSLog(@"the latitude is %f", newOne.coordinate.latitude);
    NSLog(@"the speed is %.2f mps", newOne.speed);
    NSLog(@"at time : %@",newOne.timestamp);

//These 4 NSLog statements are returning the outputs as expected


 [geoCoder reverseGeocodeLocation:newOne completionHandler:^(NSArray *placemarks, NSError *error) 
        placemark = [placemarks objectAtIndex:0];
        NSLog(@"the current city is %@",placemark.locality);

        self.addressOutlet.enabled = YES;
        // view.currentLocation = [[CLLocation alloc]init];

        view.currentLocation = newOne;  // assigning currentLocation the same location as the newOne

        NSLog(@"the currentLocation object has the location : \n %@",view.currentLocation);
        //problem : the output of this NSLog gives Null
    ];


【问题讨论】:

你尝试过什么?有很多这样的问题。谷歌它! Xcode 标签只能用于有关 Xcode 工具本身的问题,而不是用于您碰巧使用 Xcode 的编程问题。 【参考方案1】:

问题出在

view.currentLocation = newOne;

在这种情况下,view 为零。当 prepareForSegue: 被调用时,视图被实例化。所以你能做的就是

tempLocation = newOne; // Store newOne in a temporary variable

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

if([segue.identifier isEqualToString:@"addressSegue"])

    view= segue.destinationViewController;

     // assigning the addressPlacemark the same value as the current placemark
    view.addressPlacemark = placemark;
     view.currentLocation = tempLocation;
    NSLog(@"this is perfectly executed");



【讨论】:

非常感谢 Anil :) 它有效.. 一个简单而完美的解决方案.. 谢谢..【参考方案2】:
    您不应该将addressViewController 保存在当前控制器中,因为它会保留他直到您再次执行segue。并且在某些执行点上,它至少是无用的,甚至是有害的。 view.currentLocation = newOne; // assigning currentLocation the same location as the newOne 此时的视图可以包含 nill,因此对其属性的任何分配都不正确。您应该将currentLocation 保存在当前视图控制器的属性中,然后在prepareForSegue 中将其设置为destinationViewController。 我不想谈论您的代码命名约定,但是当我看到以小写字母开头的类名时,我感到很困惑=)

【讨论】:

我理解@Ossir 的命名约定。正如你所提到的,我将彻底改变它们。我跟随他们就像我不应该做的财产一样。感谢您指出了这一点。为什么我没有早点意识到。而且,我是编程新手,因此会出现这些错误:(

以上是关于将数据传递给目标视图控制器[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 performSegue 将数据传递给目标视图控制器

如何将数据传递给其他视图? [关闭]

如何在将数据推送到导航堆栈之前将数据传递给视图控制器并加载它?

如何将数据传递给嵌套控制器(UIContainerView)?

CodeIgniter 将数据传递给视图

将数据传递给 viewController