在Swift中实例化和呈现viewController

E-R*_*die 290 objective-c uiviewcontroller ios swift

问题

我开始看一下新SwiftXcode 6,我尝试了一些演示项目和教程.现在我被困在:

实例化然后viewController从特定的故事板中呈现

Objective-C解决方案

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"myStoryboardName" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"myVCID"];
[self presentViewController:vc animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)

如何在Swift上实现这一目标?

aka*_*kyy 617

这一切都是新语法的问题,功能没有改变:

// Swift 3.0

let storyboard = UIStoryboard(name: "MyStoryboardName", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "someViewController")
self.present(controller, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)

如果您遇到问题init(coder:),请参阅EridB的回答.

  • `as`关键字用于类型转换.它与目标c中的`(UIViewController*)anObject`相同 (5认同)
  • 你甚至可以省略`;`!;)你介意在`as UIViewController`上详细说明吗?为什么这有必要? (3认同)
  • @akashivskyy绝对,对你而言.但也许不是一些人. (3认同)
  • 如果可以的话,我会吻你。 (2认同)

E-R*_*die 44

对于使用@ akashivskyy的答案进行实例化UIViewController并且有异常的人:

致命错误:在课堂上使用未实现的初始化程序'init(coder :)'

小建议:

required init?(coder aDecoder: NSCoder)在您的目的地手动实施您UIViewController尝试实例化的内容

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}
Run Code Online (Sandbox Code Playgroud)

如果你需要更多的描述,请参阅我的答案在这里

  • @ user1700737我正在实例化viewController,引用storyboard,它执行initWithCoder,而不是initWithNib.请参阅此问题http://stackoverflow.com/questions/24036393/fatal-error-use-of-unimplemented-initializer-initcoder-for-class/24036440#24036440 (4认同)

Abh*_*eet 19

此链接具有以下两种实现:

迅速:

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

目标C.

UIViewController *viewController = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil] instantiateViewControllerWithIdentifier:@"ViewController"];
Run Code Online (Sandbox Code Playgroud)

此链接具有用于在同一故事板中启动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)

}
Run Code Online (Sandbox Code Playgroud)


Nah*_*dan 14

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)
Run Code Online (Sandbox Code Playgroud)

OBJ-C:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MyStoryboardName" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"someViewController"];
[self.navigationController showViewController:vc sender:nil];
Run Code Online (Sandbox Code Playgroud)


小智 10

Swift 4.2更新的代码是

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


小智 7

// "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)
Run Code Online (Sandbox Code Playgroud)

当我把它放在AppDelegate中时,这对我来说很好


Ham*_*mid 7

如果你想以模态方式呈现它,你应该有类似下面的东西:

let vc = self.storyboard!.instantiateViewControllerWithIdentifier("YourViewControllerID")
self.showDetailViewController(vc as! YourViewControllerClassName, sender: self)
Run Code Online (Sandbox Code Playgroud)


vij*_*esh 6

我想建议一种更清洁的方法。当我们有多个故事板时,这将很有用

1.用你所有的故事板创建一个结构

struct Storyboard {
      static let main = "Main"
      static let login = "login"
      static let profile = "profile" 
      static let home = "home"
    }
Run Code Online (Sandbox Code Playgroud)

2. 像这样创建一个 UIStoryboard 扩展

extension UIStoryboard {
  @nonobjc class var main: UIStoryboard {
    return UIStoryboard(name: Storyboard.main, bundle: nil)
  }
  @nonobjc class var journey: UIStoryboard {
    return UIStoryboard(name: Storyboard.login, bundle: nil)
  }
  @nonobjc class var quiz: UIStoryboard {
    return UIStoryboard(name: Storyboard.profile, bundle: nil)
  }
  @nonobjc class var home: UIStoryboard {
    return UIStoryboard(name: Storyboard.home, bundle: nil)
  }
}
Run Code Online (Sandbox Code Playgroud)

将故事板标识符作为类名,并使用以下代码进行实例化

let loginVc = UIStoryboard.login.instantiateViewController(withIdentifier: "\(LoginViewController.self)") as! LoginViewController
Run Code Online (Sandbox Code Playgroud)


Sta*_*ave 5

无论我尝试什么,它对我来说都不起作用 - 没有错误,但我的屏幕上也没有新的视图控制器。不知道为什么,但将其包装在超时函数中最终使其工作:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.0) {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let controller = storyboard.instantiateViewController(withIdentifier: "TabletViewController")
    self.present(controller, animated: true, completion: nil)
}
Run Code Online (Sandbox Code Playgroud)