您好,有人可以帮助我解决以下问题: 我有一个带有MKMapView的ViewController,当我弹出这个视图时一切都很好但是当我尝试将这个ViewController推回到我的NavigationController的堆栈中时,我的应用程序意外崩溃了。 我试图通过启用NSZombie解决这个问题,并且它在从xcode运行时工作正常,但是当我试图在模拟器(和我的iPhone)上运行它而不使用xcode时它仍然崩溃。我还尝试在ViewWillDissapear,ViewDidDissapear和dealloc中使我的mapview delegete nil,但我仍然有同样的问题。 任何人都可以帮我这个吗?
这是应用崩溃时的日志输出:
- [__ NSCFType observedViewControllerChange:]:无法识别的选择器发送到实例0x79a6f50 2012-09-14 11:28:13.878 * ** [456:12503] * 由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [__ NSCFType observedViewControllerChange:]:无法识别的选择器发送到实例0x79a6f50' * 第一次抛出调用堆栈: (0x19af022 0x179ecd6 0x19b0cbd 0x1915ed0 0x1915cb2 0x12c3a29 0x197a855 0x197a778 0x120819a 0x9d9c97 0xb810be 0xb813c7 0xb81436 0x931e49 0x931f34 0x6c0b54 0x1f2c509 0x18e6803 0x18e5d84 0x18e5c9b 0x30967d8 0x309688a 0x901626 0x46ad 0x2d55) 终止调用抛出异常(lldb)
我正在使用arc。以下是一些代码: 我在viewDidLoad函数中做了很多事情,我认为问题可能就在这里,这就是代码:
这是.h:
#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import <CoreLocation/Corelocation.h>
#import "AddressViewController.h"
#import "Utilities.h"
#import "MarqueeLabel.h"
#import "CustomButton.h"
@interface LocationViewController : UIViewController<MKMapViewDelegate,CLLocationManagerDelegate,UIGestureRecognizerDelegate>{
CLLocationManager *locationManager;
MKPointAnnotation *centerAnnotation;
int initialState;
NSDictionary * json;
bool google;
bool isBackgroundRunning;
double x;
CLLocationCoordinate2D selectedCoordinate;
MarqueeLabel *continuousLabel;
__weak IBOutlet CustomButton *cont;
UILongPressGestureRecognizer *lgr;
UIPanGestureRecognizer *panGesture;
UIPinchGestureRecognizer *pinchGesture;
UISwipeGestureRecognizer *swipeGesture;
__weak IBOutlet UIButton *myLoc;
BOOL first;
}
@property (strong, nonatomic) IBOutlet MKMapView *myMapView;
- (IBAction)showMe:(id)sender;
@property (strong, nonatomic) MKPointAnnotation *centerAnnotation;
@end
- (void)viewDidLoad
{
[super viewDidLoad];
first = YES;
initialState = YES;
nrGooglePosts = 0;
[self.myMapView setShowsUserLocation:YES ];
myMapView.centerCoordinate = myMapView.userLocation.coordinate;
locationManager = [[CLLocationManager alloc] init];
[locationManager setDelegate:self];
[locationManager setDistanceFilter:kCLDistanceFilterNone];
[locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
NSMutableArray *userL =[[NSUserDefaults standardUserDefaults] objectForKey:@"user"];
if([userL count] == 0) NSLog(@"user nu e salvat");
[[Utilities get] setName:[[userL valueForKey:@"name"] objectAtIndex:0]];
[[Utilities get] setPhone:[[userL valueForKey:@"phone"] objectAtIndex:0]];
[[Utilities get] setCode:[[userL valueForKey:@"code"] objectAtIndex:0]];
[[Utilities get] setUserId:[[userL valueForKey:@"userid"] objectAtIndex:0]];
centerAnnotation = [[MKPointAnnotation alloc] init];
MKPointAnnotation * pc = [[MKPointAnnotation alloc] init];
pc.coordinate = myMapView.centerCoordinate;
pc.title = @"Map Center";
pc.subtitle= [[NSString alloc] initWithFormat:@"%f, %f",pc.coordinate.latitude,pc.coordinate.longitude];
[self.myMapView addAnnotation:pc];
centerAnnotation = pc;
lgr= [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
lgr.minimumPressDuration=0.1;
lgr.allowableMovement = 5;
lgr.delegate = self ;
[myMapView addGestureRecognizer:lgr];
panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
panGesture.delegate = self;
[myMapView addGestureRecognizer:panGesture];
pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
pinchGesture.delegate = self;
[myMapView addGestureRecognizer:pinchGesture];
swipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
swipeGesture.delegate = self;
[myMapView addGestureRecognizer:swipeGesture];
NSMutableArray * arr=[[NSUserDefaults standardUserDefaults ] objectForKey:@"locationList"];
if([arr count]){
for(int i = 0 ; i < [arr count] ; i++ ){
NSMutableDictionary * adr = [[arr objectAtIndex:i] mutableCopy];
if(adr){
CLLocationDegrees lat = [[adr objectForKey:@"latitude"] doubleValue] ;
CLLocationDegrees lon = [[adr objectForKey:@"longitude"] doubleValue] ;
CustomMKAnnotation *ann = [[CustomMKAnnotation alloc] init ];
CLLocationCoordinate2D coord = { lat, lon };
ann.coordinate = coord;
ann.title = [adr objectForKey:@"street"] ;
ann.subtitle = [[NSString alloc] initWithFormat:@"Nr:%@ Bl:%@ Sc:%@",[adr objectForKey:@"number"],[adr objectForKey:@"bloc"],[adr objectForKey:@"scara"]];
MKAnnotationView *aux = [[MKAnnotationView alloc] initWithAnnotation:ann reuseIdentifier:nil];
UIImage *poza = [UIImage imageNamed:@"star.png"];
UIImageView *pic = [[UIImageView alloc] initWithImage:poza];
[aux addSubview:pic];
aux.canShowCallout = YES;
[myMapView addAnnotation:aux.annotation];
}
}
}
google = YES;
json = [self getLocationFromGoogleWithCoordinates:myMapView.userLocation.coordinate];
NSString *status = [[NSString alloc] initWithFormat:@"%@",[json objectForKey:@"status"]];
if([status compare:@"ZERO_RESULTS"] == 0 && [status compare:@"OVER_QUERY_LIMIT"] == 0)
{
google=NO;
NSLog(@"%@",status);
}
continuousLabel = [[MarqueeLabel alloc] initWithFrame:CGRectMake(32, 20, 191, 20) rate:50.0f andFadeLength:10.0f];
continuousLabel.marqueeType = MLContinuous;
continuousLabel.numberOfLines = 1;
continuousLabel.opaque = NO;
continuousLabel.enabled = YES;
continuousLabel.shadowOffset = CGSizeMake(0.0, -1.0);
continuousLabel.textAlignment = UITextAlignmentLeft;
continuousLabel.backgroundColor = [UIColor clearColor];
continuousLabel.font = [UIFont boldSystemFontOfSize:13];
continuousLabel.text = [[Utilities get] streetName];
[continuousLabel setBackgroundColor:[UIColor clearColor]];
[continuousLabel setTextColor:[UIColor whiteColor]];
continuousLabel.opaque = NO ;
myLoc.opaque=NO;
[myLoc setBackgroundColor:[UIColor clearColor]];
[self.view addSubview:continuousLabel];
[logoutButton setTitle:@"Log Out" forState:UIControlStateNormal];
[logoutButton addTarget:self action:@selector(logout:) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *logoutBarButton = [[UIBarButtonItem alloc] initWithCustomView:logoutButton];
self.navigationItem.leftBarButtonItem = logoutBarButton;
[self.navigationController.navigationBar setBackgroundColor:[UIColor clearColor]];
}
- (void) viewWillDisappear:(BOOL)animated
{
[self.navigationController setNavigationBarHidden:YES animated:animated];
[self stopTrackingLocation];
[myMapView removeAnnotations:myMapView.annotations];
self.myMapView.delegate = nil;
self.view = nil;
[super viewWillDisappear:animated];
}
- (void)stopTrackingLocation
{
if (myMapView.showsUserLocation)
{
// Crashes here
myMapView.showsUserLocation = NO;
}
}
答案 0 :(得分:1)
我认为你正在使用ARC。
嘿,伙计,不要这样做:self.view = NULL. //REMOVE THIS!!!!
你不能再次推UIViewController,因为没有与它相关的UIVIew。它会在UINavigationController中崩溃,因为实际上没有什么可以推动。
第二个问题,它不会造成崩溃,但却有一个地方。 您正在删除Map View委托。但是如果要再次推送此控制器,将禁用第二次时间映射视图。
您应该将此功能移至dealloc方法。 您应该在viewWillAppear:方法中显示用户位置,而不是在viewDidLoad中:因为此方法只会执行一次。当你第二次尝试推动你的UIVIewController时,它不会生效。所以请更改此功能:
- (void) viewWillAppear:(BOOL)animated{
[self.myMapView setShowsUserLocation:YES ];
}
- (void) viewWillDisappear:(BOOL)animated
{
[self.navigationController setNavigationBarHidden:YES animated:animated];
[self stopTrackingLocation];
[myMapView removeAnnotations:myMapView.annotations];
[super viewWillDisappear:animated];
}
-(void) dealloc{
self.myMapView.delegate = nil;
//In ARC we don't call [super dealloc]
}