2012-03-24 2 views
0

이 작업을 수행하는 데 정말 어려움을 겪고 있습니다. DomainSelectionViewController 및 DomainViewController라는 연결된보기가있는 두 개의보기 컨트롤러가 있습니다. View Controller를 다루는 Apple 개발자 네트워크에 대한 자습서를 살펴 보겠습니다. 실행하려고하면 EXC_BAD_ACCESS 신호가 나타납니다.dismissViewControllerAnimated에 대한 호출시 EXC_BAD_ACCESS 오류 : 완료 : (iOS5)

DomainSelectionViewController.h

@class DomainViewController; 

@interface DomainSelectionViewController : UIViewController 

- (IBAction)domainSelected:(id)sender; 
- (IBAction)leaveDomain; 

@property (retain) DomainViewController * selectedDomain; 

@end 

domainSelected : 도메인을 나타내는 버튼에 연결되어 여기

각 파일의 관련 발췌. 인터페이스를 클릭하면 DomainViewController의 nib에 정의 된 뷰가 인터페이스의 현재 뷰를 성공적으로 대체합니다.

DomainSelectionViewController.m

@implementation 
- (IBAction)domainSelected:(id)sender { 
    NSLog(@"Domain Selected..."); 
    selectedDomain = [[DomainViewController alloc] initWithNibName:@"DomainView" bundle:nil]; 
    selectedDomain.domainSelectionContext = self; 
    [self presentViewController:selectedDomain animated:NO completion:nil]; 
} 

- (IBAction)leaveDomain { 
    NSLog(@"Leaving Domain..."); 
    NSLog(@"Presented Domain: %@", self.presentedViewController); 
    //selectedDomain.modalPresentationStyle = UIModalPresentationFullScreen; 
    [self dismissViewControllerAnimated:NO completion:nil]; 
} 

DomainViewController.h

#import <UIKit/UIKit.h> 
#import "DomainSelectionViewController.h" 

@class DomainSelectionViewController; 

@interface DomainViewController : UIViewController 

//@property (nonatomic, assign) DomainSelectionViewController * presentingViewController; 
@property (nonatomic, retain) DomainSelectionViewController * domainSelectionContext; 

@end 

DomainViewController.m

- (IBAction)exit:(id)sender { 
    NSLog(@"Leaving Domain..."); 
    if(self.presentingViewController) { 
     NSLog(@" Dismissing View Controller: %@.", self.presentingViewController); 
     [self.domainSelectionContext leaveDomain]; 
     //[self.presentingViewController dismissViewControllerAnimated:NO completion:nil]; 
     return; 
    } 
    else { 
     NSLog(@"Presenting view controller not set."); 
    } 
} 

domainview에는 "back"을 읽고 자체 exit : function에 연결된 버튼 하나만 포함되어 있습니다.이 함수는 대리자에 leaveDomain을 호출합니다. 이 버튼을 클릭하면 EXC_BAD_ACCESS 호출이 발생합니다. 비슷한 다른 게시물을 보면 EXC_BAD_ACCESS 오류는 일반적으로 할당 취소 된 개체를 호출 할 때 발생하지만 dismiss 호출 바로 전에 print 문은 개체가 아직 있으며 참조 할 수 있음을 보여줍니다. 나는 이것을 보면서 잘못 된 것을 쉽게 신을 수있는 것보다 더 많은 경험을 가진 누군가를 원했습니다. 완전성을 위하여

가 여기에 콘솔의 출력입니다 :

Attaching to process 26860. 
2012-03-24 19:23:45.601 domaintest[26860:f803] DomainSelectionView Initialized. 
2012-03-24 19:23:52.627 domaintest[26860:f803] Domain Selected... 
2012-03-24 19:24:14.187 domaintest[26860:f803] Leaving Domain... 
2012-03-24 19:24:14.188 domaintest[26860:f803] Dismissing View Controller: <DomainSelectionViewController: 0x688f9a0>. 
2012-03-24 19:24:14.188 domaintest[26860:f803] Leaving Domain... 
2012-03-24 19:24:14.188 domaintest[26860:f803] Presented Domain: <DomainViewController: 0x6891d90> 
Current language: auto; currently objective-c 
warning: Attempting to create USE_BLOCK_IN_FRAME variable with block that isn't in the frame. 
(gdb) 

답변

1

많은 시행 착오 끝에이 문제는보기 계층에서 더 높았습니다. 디자인은 첫 번째 (DomainSelectionViewController) 컨트롤러의 전망과 함께 자신의 뷰를 대체 완전히 비어 루트 뷰 컨트롤러를했다

self.window.rootViewController.view = domainSelectionViewController.view; 

의 최종 결과는 domainSelectionViewController이 domainViewController의 견해를 제시하지만, 해고하려고 할 수 있다는 것입니다 EXC_BAD_ACCESS가 발생했습니다. 난 아직도 모르겠지만 왜 그런, domainSelectionViewController 기본보기, 또는 rootViewController 가지고 변경이 현재 ViewDidAppear의 domainSelectionViewController 문제가 해결되었습니다.

0

오, 당신의 문제가있다. 당신을 파괴하려고하는대로, 이것은 당신이 원본이 아닌 뷰에 표시하려고하는 새로운 뷰 컨트롤러에 통합되어야하는 기능이

[self dismissViewControllerAnimated:NO completion:nil]; 

:

당신은 함수를 호출 루트보기.

대신

, 이렇게 :

DomainSelectionViewController.m

- (IBAction)leaveDomain { 
    NSLog(@"Leaving Domain..."); 
    NSLog(@"Presented Domain: %@", self.presentedViewController); 
    //selectedDomain.modalPresentationStyle = UIModalPresentationFullScreen; 
} 

DomainViewController.m

- (IBAction)exit:(id)sender { 
    NSLog(@"Leaving Domain..."); 
    if(self.presentingViewController) { 
     NSLog(@" Dismissing View Controller: %@.", self.presentingViewController); 
     [self.domainSelectionContext leaveDomain]; 
     //ADD THIS HERE 
     [self dismissViewControllerAnimated:NO completion:nil]; 

     return; 
    } 
    else { 
     NSLog(@"Presenting view controller not set."); 
    } 

}

이 방법 , 당신은 당신이 제시하는 뷰 컨트롤러를 제거합니다. 자기 사용하기.presentingViewController는 상위 뷰 컨트롤러가 그 아래에있는 선택보기를보기 위해 닫으려는 컨트롤러이기 때문에 작동하지 않습니다. 표시된 컨트롤러를 닫으면 흰색 화면이 표시됩니다.

희망이 있으면 행운을 빈다.

+0

나는 실제로 이것을 이전에 시도했지만 그 결과는 같습니다. (비록 실제로 뷰를 관리하는 루트 작업이되어야한다는 인상하에 있기 때문에 [self.presentedViewController dismissViewControllerAnimated : NO completion : nil] 호출로 leaveDomain 함수에서 수행 했더라도 문제가 발생했습니다. – fromClouds

+0

주로 modalViewControllers를 사용하여이 작업을 수행합니다. 매우 비슷한 방법이지만 작업에 문제가 발생하지 않았습니다. – David

+0

아, 그런데, 그렇지 않은 경우, 위의 메서드를 사용하여 자식 뷰 컨트롤러로 그 명령문을 옮기고, 그냥 당신을 위해 일할 수도 있습니다. 당신이 루트보기에서 self.presentedViewController를 사용하여 그것을 알지만, 같은 함수가 아닙니다. 당신의 프로그램이 작동하지 않으면 컨벤션이 정말로 중요하다고 생각하십시오. – David