10

UIViewController이 현재 표시되고 있는지 어떻게 확인합니까?UIViewController가 현재 표시되고 있는지 어떻게 확인합니까?

UIViewControllersNSNotifications을 듣고 있습니다 (표시되지 않은 경우에도 마찬가지 임). 그래서 저는 NSNotifications에서 NSNotificationCenter을 관찰하면서 백그라운드에서 10 UIViewController을 가질 수있었습니다. NSNotification이 게시되고 UIViewController으로 수신되면 현재 표시되고 있는지 확인하고 싶습니다. 그렇지 않으면 뷰를 표시 할 때 처리되도록 부울을 설정합니다. 현재 표시되고있는 경우 즉시 테이블 업데이트 등의 작업을 더 많이 수행합니다 ...

+0

어떻게하면보기 컨트롤러보기를 표시하고 있습니까? – tdubik

+0

@tdubik : pushViewController와 같은 전통적인 방식입니다. 나는 StoryBoard 또는 segues를 사용하지 않는다. – ikevin8me

+0

그런 경우에는'UINavigationController' 클래스에서'topViewController'를 확인할 수 있습니다. 또는 더 많은 것을 처리하고자한다면, 한 컨트롤러는'viewControllers' 배열을 열거합니다. – tdubik

답변

13

당신이 있는지 확인해야합니다 (다른보기의 적용 또는 숨겨진 플래그가 설정되어, 그것은 화면의 경계 해제 될 수 물론) 화면에 부착되는 계층 구조입니다 귀하의 viewcontroller는 navigationcontroller의 viewcontroller 배열 스택 위에 있습니다. 샘플 코드는 현재 뷰의 표시 여부를 확인하기 위해 viewWillAppear 방법 안에 이것을 사용할 수 있습니다

if (self.navigationController.topViewController == self) { 
    //the view is currently displayed 
} 

이다.

+1

@ DBD의 대답은 좀 더 일반적인 답변이며 질문 제목이 구체적이지 않기 때문에 향후 독자에게 도움이 될 것입니다. – Zedenem

1

viewWillDisappear에서 알림 수신기를 제거하고 viewWillAppear에 추가하지 않는 이유는 무엇입니까?

편집 : 그의 질문을 잘못 읽었습니다. 죄송합니다.

제안 된 답변 : viewDidDisappear 및 viewDidAppear에서 나만의 플래그 (BOOL)를 설정하십시오.

+0

제거 할 때 모든 알림을 놓치기 때문에이 기능이 작동하지 않습니다. – ikevin8me

+0

그러면 viewWillDisapear에 플래그 (BOOL)를 설정하면 뷰가 더 이상 표시되지 않음을 나타낼 수 있습니다. 알림을 받으면보기를 볼 수있는 플래그를 확인하십시오. – yuf

+0

알림이 오면 테이블을 새로 고침해야합니다. 그것이 오지 않는다면, 그렇게하기에는 너무 비싸다. 또한 같은 이유로 뷰가 다시 표시 될 때 테이블을 다시로드 할 필요가 없습니다. 즉 데이터가 동일하고 너무 비쌉니다. – ikevin8me

0

viewController.view.superview의 검사가 효과가 있다고 생각합니다.

+0

나는 정말로 이해하지 못한다. 어떻게 비교를합니까? – ikevin8me

+0

'if (viewController.view.superview! = nil)' – tdubik

+0

문제는보기가 수퍼 뷰에 첨부 될 수 있지만 수퍼 뷰가 창에 연결되지 않아 잠재적 인 허점이 작동하지 않을 수 있습니다. . – DBD

6

창이 창에 부착되어 있는지 확인하십시오. 이 nil이 아니라면 그것은

if (myViewController.view.window) { 
    // I'm attached to the window 
} else { 
    // not attached to the window 
} 
+1

닫기,하지만보기가 창에 있는지 여부를 확인하기 전에보기가로드되었는지 확인해야합니다 :'(self.isViewLoaded && self.view.window! = nil) ... ' –

+0

@rob. 그래 너가 옳아. 뷰 컨트롤러가로드되지 않고'view' 객체에 접근하면 느슨한 로딩이 일어나게됩니다. 이것은 실제로 사용할 준비가되지 않은 메모리에 물건을로드하는 것을 의미 할 수 있습니다. 여전히 올바른 답을 제시 할 수는 있지만 이상적인 성능보다 떨어집니다. 초기화되지 않은 뷰는 절대로 첨부되지 않으므로 뷰가로드 될 때만 알림이 추가된다는 가정을했습니다. 아직도 그것은 아마도 부적절한 가설이었을 것이고 다른 것이 없다면 진술되었을 것입니다. – DBD

+0

@ robmayoff의 변경 사항이 통합되어있어 이것이 정답 일 것입니다. – Bill

4

viewWillAppearviewWillDisappear 방법에 플래그를 사용할 수 있습니다.

1

각 ViewController에 제목을 지정한 다음 아래 코드에 따라 현재 ViewController의 제목을 가져옵니다.

NSString *currentController = self.navigationController.visibleViewController.title; 

Then check it by your title like this 

if([currentController isEqualToString:@"myViewControllerTitle"]){ 

    //write your code according to View controller. 

}