2011-04-28 5 views
1

뷰 컨트롤러간에 전환하는 데 내 앱 대리인을 사용하고 있습니다. 대리자가 서버의 메시지를 기반으로 더 이상보기 컨트롤러가 필요하지 않다고 결정하면 현재보기를 제거하고 다른보기로 바꿔야합니다. 현재 내 코드는 다음과 같습니다.더 이상 필요없는보기 컨트롤러를 제거하려면 어떻게합니까?

- (void) showFight: (NSNotification*) notification 
    { 
     if(self.window.rootViewController != self.fightViewController) 
     { 
      NSDictionary* dict = [notification userInfo]; 

       FightViewController *fightView = [[FightViewController alloc] 
                initWithNibName:@"FightViewController" bundle:nil]; 
       fightView.userId = _userId; 

       self.fightViewController = fightView; 
       [fightView release]; 
       [self.radarViewController.view removeFromSuperview]; // Doesn't work. 

       self.window.rootViewController = self.fightViewController; 
       [self.fightViewController showMonster:dict]; 

     } 
    } 

백그라운드에서 음향 효과를들을 수 있으므로보기 컨트롤러가 제거되지 않습니다.

언제든지 메모리에서 하나의보기 컨트롤러 만 필요하므로보기 컨트롤러를 완전히 파괴하고 싶습니다. 위의 코드에서 볼 수 있듯이 처음부터 매번 뷰 컨트롤러를 만들 계획입니다. 나는 이것을 부적절하게하고 있는가?

+0

self.myViewController = nil은 다른 유지 된 참조가없는 한 메모리에서 VC를 파괴합니다. – Felix

답변

2

여기서 문제는보기 컨트롤러를 공개하지 않는 것 같습니다. 당신은 그것의 슈퍼 볼에서 보기을 제거

[self.radarViewController.view removeFromSuperview]; 

: 실제로에서 코드에서 일어나는 일에 대해 생각해보십시오. 뷰 컨트롤러는 여전히 존재하며 뷰의 표시 내용과 사운드 재생 여부를 제어합니다.

간편한 방법 :보기 컨트롤러는 개체입니다. 그것에는 아이가있다. 그것은 또 다른 목표입니다. 다른 뷰에서 뷰를 제거하지만 제거 된 뷰를 제어하는 ​​객체는 여전히 존재합니다 (사실 뷰 객체도 마찬가지입니다). 당신이 전체 뷰 컨트롤러를 죽이고 싶어하는 경우

, 그 수퍼에서보기를 제거한 후이 전화 :

[self.radarViewController release];

또는 뷰 내가보고 가정합니다 유지 속성 (인 경우 코드) 당신은 또한 사용할 수 있습니다 자동으로 합성 세터에 당신을 위해 출시

self.radarViewContoller = nil;

.

뷰 컨트롤러가 해제되면 참조 카운트가 1 씩 감소합니다. 참조 횟수가 0에 도달하면 컨트롤러가 할당 취소됩니다.

0

지금까지 귀하의 문제는 서버에 새로운 ViewController를 추가하고 현재보기를 새로운 것으로 변경하는 것임을 이해했습니다. 보기. 먼저 참조가 뷰를 업데이트하는 데 도움이되지 않기 때문에 아래와 같이 뷰 컨트롤러를 추가해야합니다. 당신이 당신의 컨트롤러를 태그하고 있다면 이미 메모리에 존재하는 컨트롤러를 추가하기 전에 확인해야 제 생각에는

[self.window.rootViewController.view addSubview: self.fightViewController.view] 

, 그렇지 않으면 개체의 풀 누출됩니다. 그냥 메모리 누수에 반대하지 마라 !!

- (void) showFight: (NSNotification*) notification 
{ 
     UIView *fightView = (UIView *)[self.window.rootViewController.view viewWithTag: FIGHT_VIEW_TAG]; 
     if (self.window.rootViewController.view.tag != fightView.tag) { 

      NSDictionary* dict = [notification userInfo]; 
      FightViewController *fightView = [[FightViewController alloc] 
               initWithNibName:@"FightViewController" bundle:[NSBundle mainBundle]]; 

      //Remove the current view. 
      [self.window.rootViewController.view removeFromSuperview]; // If you're adding the fighting View in the root View, then why are you trying to remove current view through radar controller which has already added in the window (root view). 

      fightView.userId = _userId; 
      [fightView setTag: FIGHT_VIEW_TAG]; 
      [self.window.rootViewController.view addSubView: self.fightViewController.view]; 

      [self.fightViewController showMonster:dict]; 
      [fightView release]; 
    } 
} 

요구 사항이 다를 때까지 글로벌로 지정할 필요는 없습니다.

+0

View Controller에 태그를 지정 하시겠습니까? –

+0

예 컨트롤러에 w.r.t 특정 키에 태그를 지정하십시오. 예 : UIView * middleView = (UIView *) [self.viewviewWithTag : MIDDLEVIEW_TAG]; if (middleView! = nil) { [middleView removeFromSuperview]; } sectionViewController.view.frame = CGRectMake (0, 10, 320, 480); [sectionViewController.view setTag : MIDDLEVIEW_TAG]; [self.view addSubview : sectionViewController.view]; – Deminem

+0

지저분한 코드 모양에 대해서는 유감 스럽지만 주석에서 코드 들여 쓰기가 작동하지 않는 이유는 무엇입니까? – Deminem

관련 문제