스토리보드 - AppDelegate의 ViewController 참조
다음 시나리오를 고려합니다.저는 스토리보드 기반의 앱을 가지고 있습니다.ViewController 개체를 스토리보드에 추가하고, 이 ViewController의 클래스 파일을 프로젝트에 추가하고, IB ID 검사기에 새 클래스의 이름을 지정합니다.이제 AppDelegate에서 이 ViewController를 프로그래밍 방식으로 참조하려면 어떻게 해야 합니까?관련 클래스에 변수를 만들어 IBOutlet 속성으로 전환했지만 코드에서 새 ViewController를 참조할 수 있는 방법이 보이지 않습니다. 연결을 Ctrl+Drag로 끌 수 없습니다.
즉, AppDelegate 내에서 다음과 같이 기본 ViewController에 액세스할 수 있습니다.
(MyViewController*) self.window.rootViewController
하지만 스토리보드에 포함된 다른 ViewController는 어떻습니까?
다음에 대한 문서를 확인하십시오.-[UIStoryboard instantiateViewControllerWithIdentifier:]
이를 통해 IB Attributes Inspector에서 설정한 식별자를 사용하여 스토리보드에서 뷰 컨트롤러를 인스턴스화할 수 있습니다.
예제 코드를 추가하도록 편집됨:
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard"
bundle: nil];
MyViewController *controller = (MyViewController*)[mainStoryboard
instantiateViewControllerWithIdentifier: @"<Controller ID>"];
사용하는 경우XCode
5 당신은 다른 방법으로 그것을 해야 합니다.
- 다음 항목을 선택
UIViewController
에UIStoryboard
- 이동
Identity Inspector
오른쪽 상단 창에 - 확인:
Use Storyboard ID
확인란 - 에 고유한 ID를 작성합니다.
Storyboard ID
들판
그럼 코드를 작성하세요.
// Override point for customization after application launch.
if (<your implementation>) {
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main"
bundle: nil];
YourViewController *yourController = (YourViewController *)[mainStoryboard
instantiateViewControllerWithIdentifier:@"YourViewControllerID"];
self.window.rootViewController = yourController;
}
return YES;
일반적으로 시스템은 스토리보드를 사용하여 뷰 컨트롤러 인스턴스화를 처리해야 합니다.원하는 것은 viewController 계층 구조를 이동하여 다음에 대한 참조를 가져오는 것입니다.self.window.rootViewController
스토리보드를 올바르게 설정한 경우 이미 올바르게 초기화되어야 하는 뷰 컨트롤러를 초기화하는 것과 반대로,
그럼, 당신의.rootViewController
UINavigation Controller이며, 상단 뷰 컨트롤러에 무언가를 보내고 싶다면 AppDelegate에서 이 작업을 수행합니다.didFinishLaunchingWithOptions
:
UINavigationController *nav = (UINavigationController *) self.window.rootViewController;
MyViewController *myVC = (MyViewController *)nav.topViewController;
myVC.data = self.data;
Swift의 경우 다음과 매우 유사합니다.
let nav = self.window.rootViewController as! UINavigationController;
let myVC = nav.topViewController as! MyViewController
myVc.data = self.data
스토리보드가 로드되고 전체 스토리보드가 로드되는 일반적인 방식을 우회하지 않는 한 앱 대리인의 스토리보드 ID를 사용하여 뷰 컨트롤러를 초기화하면 안 됩니다.앱 딜러의 장면을 초기화해야 하는 경우 잘못된 작업일 가능성이 높습니다.예를 들어, 어떤 이유로 인해 데이터를 뷰 컨트롤러로 전송하고 싶어하는 경우, AppDelegate가 데이터를 설정하기 위해 뷰 컨트롤러 스택에 접근해서는 안 됩니다.그건 상관없는 일입니다.비즈니스는 rootViewController입니다.rootViewController가 자신의 자식을 처리하도록 합니다!따라서 info.plist 파일에서 스토리보드에 대한 참조를 제거하여 시스템에 의한 일반적인 스토리보드 로드 프로세스를 우회하는 경우, 최대로 rootViewController를 사용하여 인스턴스화할 수 있습니다.instantiateViewControllerWithIdentifier:
UINavigation Controller와 같은 컨테이너일 경우 루트일 수 있습니다.스토리보드에서 이미 인스턴스화된 보기 컨트롤러를 인스턴스화하는 것은 피해야 합니다.이것은 제가 자주 보는 문제입니다.간단히 말해서, 저는 받아들여진 답변에 동의하지 않습니다.포스터가 info.plist에서 스토리보드 로드를 제거하라는 의미가 아니라면 잘못된 것입니다. 그렇지 않으면 스토리보드 2개를 로드할 것이기 때문입니다. 이는 말이 안 됩니다.시스템이 루트 씬(scene)을 초기화하고 윈도우에 할당했기 때문에 메모리 누수가 아닐 수도 있지만, 사용자가 와서 다시 인스턴스화하고 다시 할당했습니다.앱의 시작이 상당히 좋지 않습니다!
UIStoryboard * storyboard = [UIStoryboard storyboardWithName:@"Tutorial" bundle:nil];
self.window.rootViewController = [storyboard instantiateInitialViewController];
iOS 13+의 경우
씬(scene) 딜러:
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options
connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = (scene as? UIWindowScene) else { return }
window = UIWindow(windowScene: windowScene)
let storyboard = UIStoryboard(name: "Main", bundle: nil) // Where "Main" is the storyboard file name
let vc = storyboard.instantiateViewController(withIdentifier: "ViewController") // Where "ViewController" is the ID of your viewController
window?.rootViewController = vc
window?.makeKeyAndVisible()
}
언급URL : https://stackoverflow.com/questions/8186375/storyboard-refer-to-viewcontroller-in-appdelegate
'sourcecode' 카테고리의 다른 글
dbms_lob.create temporary()의 요점은 무엇입니까? (0) | 2023.06.13 |
---|---|
RxJS 관찰 가능한 필터에서 정의되지 않음 (0) | 2023.06.13 |
데이터 프레임 정렬 후 인덱스 업데이트 (0) | 2023.06.13 |
클라우드 기능을 로컬로 실행하면 "functions.config() is not available" 오류가 나타남 (0) | 2023.06.13 |
배열의 마지막 요소를 삭제하지 않고 가져오는 방법은 무엇입니까? (0) | 2023.06.13 |