푸시 컨트롤러에서 RootViewController를 어떻게 얻습니까?
그래서 RootViewController에서 다음과 같이 뷰 컨트롤러를 푸시합니다.
[self.navigationController pushViewController : anotherViewController animated : YES];
그러나 anotherViewController
지금부터는 RootViewController에 다시 액세스하고 싶습니다.
노력하고있어
// (지금 anotherViewController 내부) /// RootViewController * root = (RootViewController *) self.parentViewController; // 아니. // 오류 RootViewController * root = (RootViewController *) [self.navigationController.viewControllers objectAtIndex : 0]; // 예!! 효과가있다
왜 이것이 효과가 있는지 잘 모르겠으며 최선의 방법인지 확실하지 않습니다. 누군가 당신이 RootViewController의 navigationController로 푸시 한 컨트롤러에서 RootViewController를 얻는 더 좋은 방법과 내가 한 방법이 신뢰할 수 있는지 여부에 대해 언급 할 수 있습니까?
UINavigationController 의 viewControllers 특성을 사용하십시오 . 예제 코드 :
// Inside another ViewController
NSArray *viewControllers = self.navigationController.viewControllers;
UIViewController *rootViewController = [viewControllers objectAtIndex:viewControllers.count - 2];
이것이 "백"뷰 컨트롤러를 얻는 표준 방법입니다. objectAtIndex:0
작동 하는 이유 는 액세스하려는 뷰 컨트롤러가 루트 컨트롤러이기도하기 때문입니다. 탐색이 더 깊다면 후면 뷰는 루트 뷰와 동일하지 않습니다.
스위프트 버전 :
var rootViewController = self.navigationController?.viewControllers.first
ObjectiveC 버전 :
UIViewController *rootViewController = [self.navigationController.viewControllers firstObject];
여기서 self는 UINavigationController에 포함 된 UIViewController의 인스턴스입니다.
거의 모든 대답에서 언급 된 것과 동일한 것의 약간 덜 추한 버전 :
UIViewController *rootViewController = [[self.navigationController viewControllers] firstObject];
귀하의 경우, 아마도 다음과 같은 일을 할 것입니다 :
UINavigationController 서브 클래스 내부 :
- (UIViewController *)rootViewController
{
return [[self viewControllers] firstObject];
}
다음을 사용할 수 있습니다.
UIViewController *rootViewController = [self.navigationController rootViewController];
편집하다
OP는 의견에 재산을 물었다.
원하는 경우 self.navigationController.rootViewController
헤더에 읽기 전용 속성을 추가하여 다음과 같은 방법 으로 액세스 할 수 있습니다 .
@property (nonatomic, readonly, weak) UIViewController *rootViewController;
신속한 확장에 관심이있는 모든 사람들에게 이것이 현재 사용중인 것입니다.
extension UINavigationController {
var rootViewController : UIViewController? {
return self.viewControllers.first as? UIViewController
}
}
@dulgan의 답변 외에도 항상 firstObject
over 를 사용하는 것이 좋습니다. objectAtIndex:0
처음에는 배열에 객체가 없으면 nil을 반환하지만 후자는 예외를 throw하기 때문입니다.
UIViewController *rootViewController = self.navigationController.rootViewController;
또는 이름이 지정된 카테고리를 작성하고 해당 UINavigationController+Additions
메소드를 정의 하는 것이 큰 장점 입니다.
@interface UINavigationController (Additions)
- (UIViewController *)rootViewController;
@end
@implementation UINavigationController (Additions)
- (UIViewController *)rootViewController
{
return self.viewControllers.firstObject;
}
@end
How about asking the UIApplication singleton for its keyWindow, and from that UIWindow ask for the root view controller (its rootViewController property):
UIViewController root = [[[UIApplication sharedApplication] keyWindow] rootViewController];
Here I came up with universal method to navigate from any place to root.
You create a new Class file with this class, so that it's accessible from anywhere in your project:
import UIKit class SharedControllers { static func navigateToRoot(viewController: UIViewController) { var nc = viewController.navigationController // If this is a normal view with NavigationController, then we just pop to root. if nc != nil { nc?.popToRootViewControllerAnimated(true) return } // Most likely we are in Modal view, so we will need to search for a view with NavigationController. let vc = viewController.presentingViewController if nc == nil { nc = viewController.presentingViewController?.navigationController } if nc == nil { nc = viewController.parentViewController?.navigationController } if vc is UINavigationController && nc == nil { nc = vc as? UINavigationController } if nc != nil { viewController.dismissViewControllerAnimated(false, completion: { nc?.popToRootViewControllerAnimated(true) }) } } }
Usage from anywhere in your project:
{ ... SharedControllers.navigateToRoot(self) ... }
'programing tip' 카테고리의 다른 글
pandas를 사용하여 파이썬으로 Excel 파일 읽기 (0) | 2020.06.28 |
---|---|
matplotlib의 날짜 눈금 및 회전 (0) | 2020.06.28 |
WHERE 절에서 대소 문자 구분 검색을 수행하는 방법 (SQL Server를 사용 중)? (0) | 2020.06.28 |
간단하게 유지하고 쿼리에서 여러 CTE를 수행하는 방법 (0) | 2020.06.28 |
정규식 및 메모장 ++에서 비 ASCII 문자를 모두 제거하려면 어떻게합니까? (0) | 2020.06.28 |