2011-10-08 5 views
0

iOS 4 SDK가 포함 된 iPhone 3.1.3 앱을 개발 중입니다.iOS 4 SDK의 SuperView에서보기 제거

두 개의 ViewController, mainViewController 및 AboutViewController가 있습니다.

- (IBAction) aboutClicked:(id)sender 
{ 
    AboutViewController* aboutController = 
     [[AboutViewController alloc] 
     initWithNibName:@"AboutViewController" 
        bundle:nil]; 
    [self.view addSubview:aboutController.view]; 

    [aboutController release];  
} 

그리고이 mainViewController (AboutViewController.m 내부 코드)에 AboutViewController에서 돌아올 :

나는 AboutViewController (mainViewController.m 내부 코드)에 mainViewController에서 이동이 코드를 사용

- (IBAction) backClicked:(id) sender 
{ 
    [self.view removeFromSuperview]; 
} 

AboutViewController에서 뒤로 버튼을 클릭하면 EXC_BAD_ACCESS가 표시됩니다.

저는 윈도우 기반 응용 프로그램 템플릿을 사용하고 있습니다.

또한 [self.view removeFromSuperview]에 중단 점을 추가하려했지만 시도 할 수 없습니다.

이유를 알고 계십니까?

답변

0

EXC_BAD_ACCESS를 얻는 이유는 viewController의 뷰를 하위 뷰로 추가 한 후에 컨트롤러를 릴리스했기 때문에 터치 이벤트가 의도 한 viewController를보고 처리하지 못하기 때문입니다.

같은 아래의 릴리스 문 밖으로 의견과는

- (IBAction) aboutClicked:(id)sender 
{ 
    AboutViewController* aboutController = 
    [[AboutViewController alloc] 
    initWithNibName:@"AboutViewController" 
       bundle:nil]; 
    [self.view addSubview:aboutController.view]; 

//[aboutController release]; To avoid leaking consider creating aboutController variable at instance level and releasing it in the dealloc. 
} 
+0

-1,이 줄을 주석 처리하면 메모리가 누수됩니다. – Cyprian

+0

@ 키프로스 당신 말이 맞아요,하지만 난 그냥 문제가 소유자가 메모리를 관리하는 대체 메커니즘을 넣어 기대하고 오류를 일으키는 메모리 릴리스를 가리 키려고했습니다. 자, 내 대답을 업데이트주의. – Saran

+0

이것은 올바른 대답입니다. ViewController를 해제하면 SIGABRT 예외가 발생합니다. 당신 말이 맞아요 !! 고마워요! @ 키프로스, 당신은 -1 점을 제거하는 것을 고려해야합니다. 감사. – VansFannel

0

시도 :

[self presentModalViewController:aboutController animated:YES]; 

보기를 제시하기 :

[self dismissModalViewControllerAnimated:YES]; 

보기를 제거하려면 ...

+0

감사를 작동해야하지만 그것이 작동하지 않습니다. – VansFannel

+0

몇 번이나 나는 animated에 문제가 있었다 : presentModalViewController의 YES는 움직이게한다 : NO – yoprogramo

1

대신이 작업을 수행 :

- (IBAction) aboutClicked:(id)sender 
{ 
    AboutViewController* aboutController = 
     [[AboutViewController alloc] 
     initWithNibName:@"AboutViewController" 
        bundle:nil]; 
    [self presentModalViewController:aboutController animated:YES]; 

    [aboutController release];  
} 

그리고이 AboutViewController에서 main으로 돌아온다. 의 ViewController (AboutViewController.m 내부 코드) :

- (IBAction) backClicked:(id) sender 
{ 
    [[self parentViewController] dismissModalViewControllerAnimated:YES] 
} 
+0

고마워. 귀하의 대답은 작동하지만, ... 왜 내 코드가 실패하는지 압니까? – VansFannel

+1

정상적으로 작동해야합니다. 좀비를 사용하여 정확한 문제를 찾아야합니다. 내 생각 엔 당신은 AboutViewController의 dealloc 메서드에서 무언가를 과도하게 사용하고 있습니다. 좀비가 어떤 일이 일어나는지 알고 싶다면 악기를 사용해보십시오.UIButton과 같은 자동 레이아웃 된 UI 구성 요소를 할당 한 다음 내 View Controller의 dalloc 메서드에서 해제하려고하면이 오류가 발생합니다. 나는 당신에게 당신의 상황에 더 적합한 원인이 솔루션을 제공했습니다. – Cyprian

0

1) 변수 클래스 수준

2 aboutController 만드)의 구현에서)

(IBAction) backClicked:(id) sender

3을 처리하는 대리자 메서드 만들기 위임 전화

[aboutController.view removeFromSuperView]; 
관련 문제