Hello.
I'm developing an iPhone application that show the camera's view with this code:
-(void) displayAR {
[rootViewController presentModalViewController:[self cameraController] animated:NO];
[displayView setFrame:[[[self cameraController] view] bounds]];
}
And hide the camera's view with this code:
- (void) hideAR {
[[self locationManager] stopUpdatingHeading];
[[self locationManager] stopUpdatingLocation];
[[self accelerometerManager] release];
[rootViewController dismissModalViewControllerAnimated:YES];
}
When I call hideAR, I get an EXC_BAD_ACCESS with the following debugger screenshot:
Any advice?
UPDATE:
I've changed hideAR code with this and I'm getting the same error:
- (void) hideAR {
[rootViewController dismissModalViewControllerAnimated:YES];
}
I've checked rootViewController and it isn't nil.
As you can see on debugger's screenshot, the last method called (the first on the stack) is: [UIWindowController transitionViewDidComplete:fromView:toView]
.
Maybe, there is something accessing camera´s view after it was dismissed.
SECOND UPDATE
The class containing these methods is:
@implementation AugmentedRealityController
@synthesize locationManager;
@synthesize accelerometerManager;
@synthesize displayView;
@synthesize centerCoordinate;
@synthesize scaleViewsBasedOnDistance;
@synthesize rotateViewsBasedOnPerspective;
@synthesize maximumScaleDistance;
@synthesize minimumScaleFactor;
@synthesize maximumRotationAngle;
@synthesize centerLocation;
@synthesize coordinates = coordinates;
@synthesize debugMode;
@synthesize currentOrientation;
@synthesize degreeRange;
@synthesize rootViewController;
@synthesize cameraController;
- (id)initWithViewController:(UIViewController *)vc {
coordinates = [[NSMutableArray alloc] init];
coordinateViews = [[NSMutableArray alloc] init];
latestHeading = -1.0f;
debugView = nil;
[self setRootViewController: vc];
[self setDebugMode:NO];
[self setMaximumScaleDistance: 0.0];
[self setMinimumScaleFactor: 1.0];
[self setScaleViewsBasedOnDistance: NO];
[self setRotateViewsBasedOnPerspective: NO];
[self setMaximumRotationAngle: M_PI / 6.0];
CGRect screenRect = [[UIScreen mainScreen] bounds];
[self setDisplayView: [[UIView alloc] initWithFrame: screenRect]];
[self setCurrentOrientation:UIDeviceOrientationPortrait];
[self setDegreeRange:[[self displayView] bounds].size.width / 12];
[vc setView:displayView];
[self setCameraController: [[[UIImagePickerController alloc] init] autorelease]];
[[self cameraController] setSourceType: UIImagePickerControllerSourceTypeCamera];
[[self cameraController] setCameraViewTransform: CGAffineTransformScale([[self cameraController] cameraViewTransform], 1.13f, 1.13f)];
[[self cameraController] setShowsCameraControls:NO];
[[self cameraController] setNavigationBarHidden:YES];
[[self cameraController] setCameraOverlayView:displayView];
CLLocation *newCenter = [[CLLocation alloc] initWithLatitude:37.41711 longitude:-122.02528];
[self setCenterLocation: newCenter];
[newCenter release];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(deviceOrientationDidChange:)
name: UIDeviceOrientationDidChangeNotification
object:nil];
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
// Inicializa el gestor del GPS y el del acelerómetro.
[self startListening];
return self;
}
THIRD UPDATE
I've put some NSLog trace, and I see that displayAR is called after hideAR call. I also see that viewDidAppear
method on rootViewController
is also called after hideAR. Actually, viewDidAppear
is calling displayAR
.
Why is called viewDidAppear?
FOURTH UPDATE
I've found the line that is failing. This is the first line on displayAR
:
[rootViewController presentModalViewController:[self cameraController] animated:NO];
Any ideas? rootViewController
and cameraController
aren't nil.
FITH UPDATE
If you want to reproduce my error:
I'm using nielswh's iPhone-AR-Toolkit (you can download it here).
You can modify the ARKitDemo example include it with the library and try to dismissModalView.