[ios] Swift에서 viewController 인스턴스화 및 표시

발행물

에 대한 새로운 내용 Swift을 살펴보기 시작했으며 Xcode 6데모 프로젝트 및 자습서를 시도했습니다. 이제 나는 붙어있다 :

viewController특정 스토리 보드에서 인스턴스화 및 발표

오브젝티브 -C 솔루션

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"myStoryboardName" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"myVCID"];
[self presentViewController:vc animated:YES completion:nil];

스위프트에서 이것을 달성하는 방법?



답변

이 답변은 Swift 5.2 및 iOS 13.4 SDK 용으로 마지막으로 개정되었습니다.


그것은 모두 새로운 구문과 약간 수정 된 API의 문제입니다. UIKit의 기본 기능은 변경되지 않았습니다. 이것은 대다수의 iOS SDK 프레임 워크에 해당됩니다.

let storyboard = UIStoryboard(name: "myStoryboardName", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "myVCID")
self.present(vc, animated: true)

에 문제가있는 경우 EridB의 답변을init(coder:) 참조하십시오 .


답변

@akashivskyy의 답변 을 사용하여 인스턴스화 UIViewController하고 예외가있는 사람들의 경우 :

치명적인 오류 : 클래스에 구현되지 않은 초기화 프로그램 ‘init (coder :)’사용

빠른 팁 :

인스턴스화하려는 required init?(coder aDecoder: NSCoder)대상에서 수동으로 구현UIViewController

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

더 자세한 설명이 필요하면 여기 에서 내 대답을 참조 하십시오


답변

이 링크에는 두 가지 구현이 있습니다.

빠른:

let viewController:UIViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("ViewController") as UIViewController
self.presentViewController(viewController, animated: false, completion: nil)

목표 C

UIViewController *viewController = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil] instantiateViewControllerWithIdentifier:@"ViewController"];

이 링크에는 동일한 스토리 보드에서 뷰 컨트롤러를 시작하기위한 코드가 있습니다.

/*
 Helper to Switch the View based on StoryBoard
 @param StoryBoard ID  as String
*/
func switchToViewController(identifier: String) {
    let viewController = self.storyboard?.instantiateViewControllerWithIdentifier(identifier) as! UIViewController
    self.navigationController?.setViewControllers([viewController], animated: false)

}


답변

akashivskyy의 대답은 잘 작동합니다! 그러나 제시된 뷰 컨트롤러에서 돌아 오는 데 문제가있는 경우이 대안이 도움이 될 수 있습니다. 그것은 나를 위해 일했다!

빠른:

let storyboard = UIStoryboard(name: "MyStoryboardName", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("someViewController") as! UIViewController
// Alternative way to present the new view controller
self.navigationController?.showViewController(vc, sender: nil)

Obj-C :

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MyStoryboardName" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"someViewController"];
[self.navigationController showViewController:vc sender:nil];


답변

스위프트 4.2 업데이트 코드는

let storyboard = UIStoryboard(name: "StoryboardNameHere", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "ViewControllerNameHere")
self.present(controller, animated: true, completion: nil)


답변

// "Main" is name of .storybord file "
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
// "MiniGameView" is the ID given to the ViewController in the interfacebuilder
// MiniGameViewController is the CLASS name of the ViewController.swift file acosiated to the ViewController
var setViewController = mainStoryboard.instantiateViewControllerWithIdentifier("MiniGameView") as MiniGameViewController
var rootViewController = self.window!.rootViewController
rootViewController?.presentViewController(setViewController, animated: false, completion: nil)

AppDelegate에 넣을 때 잘 작동했습니다.


답변

모달로 발표하려면 다음과 같은 것이 있어야합니다.

let vc = self.storyboard!.instantiateViewControllerWithIdentifier("YourViewControllerID")
self.showDetailViewController(vc as! YourViewControllerClassName, sender: self)