【问题标题】:How to dealloc an UIView with MKMapView when I load another UIView当我加载另一个 UIView 时如何使用 MKMapView 解除 UIView
【发布时间】:2013-03-15 04:39:03
【问题描述】:

我正在做一个带有MKMapView 的应用程序,该应用程序有一个back button UIView,其中包含MKMapView,以便转到main menu没关系,但是当我想再次加载 UIViewMKMapView 我的应用程序崩溃时,它不会给出任何错误,只是崩溃并显示崩溃的机器代码,但它首先说:com.apple.CoreLocation.ConnectionClient.0x1e5d5220 然后是很多机器代码。

崩溃报告在这里:

我必须补充一点,第一次我加载 UIView100% 正常工作

感谢您的帮助。

PS:为什么我说dealloc?,因为我认为像dealloc 这样的操作可能会解决我的问题,并且与第一次运行时一样。

EDIT1: 我的- (void) viewDidLoad; 方法。

- (void)viewDidLoad
{
[super viewDidLoad];
NSString *response = [self sendPostToURL: @"http://hidden.php"
                                withPost: @"hidden"];
[self tratarXML: response];
yo = @"Posición actual";
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
self.locationManager.distanceFilter = kCLDistanceFilterNone;
[self.mapView setDelegate: self];
[self.mapView setZoomEnabled: NO];
[self.mapView setScrollEnabled: NO];
if ([CLLocationManager locationServicesEnabled])
{
    self.locationManager.delegate = self;
    self.mapView.showsUserLocation = YES;
    [self.mapView setMapType: MKMapTypeStandard];
    [self.mapView setUserTrackingMode: MKUserTrackingModeFollowWithHeading animated: NO];
    [self.locationManager startUpdatingLocation];
    //[self.locationManager startUpdatingHeading];
    self.mapView.userLocation.title = yo;
}
else
{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
                                                    message:@"Debe activar la localización en esta aplicación para funcionar"
                                                   delegate:self
                                          cancelButtonTitle:@"Aceptar"
                                          otherButtonTitles:nil, nil];
    [alert show];
}
}

EDIT2: 我的后退按钮代码:

- (IBAction) iniciar: (id)sender
{
if ([iniciar.title isEqualToString:@"Volver"])
{
    menuViewController *obj = [[menuViewController alloc] initWithNibName:@"menuViewController" bundle:nil withUser:user];
    [self presentViewController:obj animated:YES completion:nil];
}
else
{
    // censored
}

我使用的是简单的 *.xib 导航器,而不是情节提要等...

EDIT3: 加载MKMapView UIView的菜单按钮

- (IBAction) TEST: (id)sender
{
mapaViewController *obj = [[mapaViewController alloc] initWithNibName: @"mapaViewController" bundle: nil withUser: user];
[self presentViewController:obj animated:YES completion:nil];
}

【问题讨论】:

  • 请在mapsViewController添加相关代码。
  • 如果带有地图视图的控制器嵌入在导航控制器中,当您点击后退按钮时它将被释放(除非您正在做一些事情来保持指向它的强指针)。您可以通过在该控制器中实现 dealloc 来轻松测试这一点,并将日志语句放入其中以查看它是否被调用。
  • @Rikkles 你需要哪个代码?因为它没有告诉我任何行数,而且我第一次使用它时,它总是有效,所以我很困惑它出了什么问题。 @rdelmar 我没有使用任何强指针。 dealloc 方法不起作用,我刚刚输入了NSLog(@"a");,但我必须在那里做什么?因为我不能释放所有变量,因为 ARC 应该这样做。 ://
  • @rokimoki 有两种可能性 1)您的视图以某种方式过度发布 2)某个进程出现在前面,而另一个进程已经在进行。
  • 我有一个同步的 POST,(因此线程将等待完成帖子,然后再开始使用新代码) - 但我在所有视图中都有它,只是在 MKMapView UIView 中不起作用'不认为它已经过度发布,因为它没有任何意义并且可能是苹果的错误,但我认为错误的可能性是我的代码,顺便说一句,错误代码应该在 viewDidLoad 和/或 initWithNibName: 方法中,对吧?

标签: ios uiview mkmapview core-location crash-reports


【解决方案1】:

有 3 件事是错误的:

  1. 您的后退按钮代码不应调用presentViewController,而应调用dismissViewController。现在您正在视图控制器之后添加视图控制器!当您返回时,您希望摆脱视图控制器。
  2. 在返回按钮代码中,添加self.locationManager.delegate = nil;
  3. 同样,在返回按钮代码中,添加self.mapView.delegate = nil;

应该可以的。

【讨论】:

  • 感谢您的帮助,我不知道 dismissViewController :/,现在我有这个代码:if ([iniciar.title isEqualToString:@"Volver"]){ self.locationManager.delegate = nil; [self dismissViewControllerAnimated: YES completion:nil]; } 并且仍然崩溃....
  • 我错过了另一点:将 mapView 委托设置为 nil。但是您还必须在粘贴的代码之外执行其他操作,将视图控制器保存在内存中或类似的东西中。
  • 1) 如果我直接将这些变量设置为 nil? 2) 在模拟器中 100% 运行我的代码 3) 使用 mapView.delegate 到 nil 它正在运行,非常感谢。
【解决方案2】:

看起来您正在执行一系列 presentViewController 调用以从主菜单转到地图视图控制器,然后再返回主菜单。这不是应该做的。您可能根本不应该进行模态转换,但如果这样做,您应该让主菜单关闭地图视图控制器,而不是让地图视图控制器呈现另一个主菜单控制器。

更好的方法是使用导航控制器。主菜单应该是导航控制器的根视图控制器,您将按下以转到地图视图控制器。您将在导航栏中自动获得一个后退按钮,该按钮将带您返回(到同一实例)主菜单控制器。无需任何后退按钮代码。这一切在故事板中实现起来会容易得多。

【讨论】:

  • 我很确定,但我不知道怎么做(我知道我可以研究怎么做但我没有时间,而且我的公司正在强迫我做 iOS并且没有太多时间在没有太多时间的情况下同时学习和工作)。另一方面,我正在向某些视图发送一些要使用的变量,我知道有静态变量等等,但我不想使用它们,所以这就是我这样做的原因,感谢您的帮助,可能我会更改我的导航系统,对不起我的英语。
猜你喜欢
  • 2011-10-28
  • 1970-01-01
  • 1970-01-01
  • 2019-04-14
  • 2020-10-21
  • 1970-01-01
  • 1970-01-01
  • 2017-12-14
  • 1970-01-01
相关资源
最近更新 更多