2009-11-10 71 views
1

更新:的UIImagePickerController [takepicture]模式視野中消失無委託回調

這已經回答了。這是我自己的愚蠢,可能不值得再讀這個問題。大聲笑。

問:

右,所以我有這樣的UIViewController(主)子類,它具有的UIImagePickerController(攝像頭),它也有一個UIView(OverlayView的)。主設置相機配置爲只有自定義cameraOverlay相機,隱藏自定義控件e.t.c.

除了當我嘗試以編程方式拍攝照片時,所有顯示都可以正常工作。會發生什麼是overlayView調用主人,這觸發拍攝圖片,然後我聽到快門聲和虹膜關閉,相機似乎dismiss自己(我敢肯定沒有這樣做在我的代碼),然後我的viewDidAppear被調用我的主人再次。

任何人都有什麼想法發生了什麼?

-(void)viewDidLoad 
{ 
    NSLog(@"loading the view"); 
    //if the camera is on the device 
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) 
    { 
     //make one 
     camera = [[UIImagePickerController alloc] init]; 
     //setup some settings that we need 
     camera.sourceType = UIImagePickerControllerSourceTypeCamera; 
     camera.showsCameraControls = NO; 
     camera.navigationBarHidden = NO; 
     camera.toolbarHidden = YES; 
     camera.cameraViewTransform = CGAffineTransformScale(camera.cameraViewTransform, 1.03, 1.03); 
     //show it 
     overlayView = [[OverlayView alloc] initWithFrame:CGRectMake(0,0,320,480) withDelegate:self andController:self]; 
     camera.cameraOverlayView = overlayView; 
      camerashowing=NO; 

    } 
    else 
    { 
     alert = [[UIAlertView alloc] initWithTitle:@"No Camera Detected" message:@"The camera is broken or your device has no camera. Please close the application" delegate:self cancelButtonTitle:nil otherButtonTitles:nil, nil]; 
     [alert show]; 
     [alert release]; 
    } 
} 

-(void)viewDidAppear:(BOOL)animated 
{ 
    if (!cameraShowing) 
    { 
    NSLog(@"going to show camera"); 
    [self presentModalViewController:camera animated:NO]; 
    camerashowing = YES; 
    } 
} 



-(void)releaseShutter 
    { 
    [overlayView toolbarShowWarning]; 
    NSLog(@"going to show camera: %@", self); 
    [camera takePicture]; 

    } 

在一些人的幫助建議後,我可以說相機沒有被釋放。

我也設法通過檢查viewDidAppear方法中的bool值來阻止exec_bad_access第二次調用[presentmodal ....]。

我仍然有模態視圖消失,任何幫助,再次大聲笑的問題??

+1

請張貼一些代碼。 – Kobski

+0

你有exec_bad_access的堆棧跟蹤嗎? – rein

回答

2

我認爲你錯過了一個camera.delegate = self;

+5

我討厭自己。我愛你。感謝上帝的stackoverflow。 –

1

對於任何EXC_BAD_ACCESS錯誤,您通常會嘗試將消息發送到已發佈的對象。 BEST跟蹤這些的方法是使用NSZombieEnabled

這個作品永遠不會實際釋放一個物體,而是通過將其包裹爲一個「殭屍」並在其中設置一個標誌,表明它通常會被釋放。這樣,如果您嘗試再次訪問它,它仍然知道您發生錯誤之前是什麼樣的,並且通過這些信息,您通常可以回溯以查看問題所在。

當調試器有時在任何有用的信息上發現它時,它特別有助於後臺線程。

然而,非常重要的是要注意是,您需要100%確保這只是在您的調試代碼中,而不是您的分發代碼。因爲什麼都沒有發佈,你的應用程序將泄漏,泄漏和泄漏。提醒我要做到這一點,我把這篇日誌在我的appdelegate:

if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled")) 
    NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!"); 

如果您需要幫助找到確切路線,做一個構建與調試(CMD-Y),而不是建造 - 和 - 運行(CMD-R)。當應用程序崩潰時,調試器會向您顯示確切的線路,並結合NSZombieEnabled,您應該能夠準確找出原因。

0

檢查camera成員變量的值,你嘗試並顯示它之前:

NSLog(@"going to show camera: %@", camera); 

我懷疑這可能是被釋放的地方,但作爲coneybeare NSZombieEnabled會讓你追查。