E-R*_*die 290 objective-c uiviewcontroller ios swift
我开始看一下新Swift的Xcode 6,我尝试了一些演示项目和教程.现在我被困在:
实例化然后viewController从特定的故事板中呈现
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的回答.
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)
如果你需要更多的描述,请参阅我的答案在这里
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中时,这对我来说很好
如果你想以模态方式呈现它,你应该有类似下面的东西:
let vc = self.storyboard!.instantiateViewControllerWithIdentifier("YourViewControllerID")
self.showDetailViewController(vc as! YourViewControllerClassName, sender: self)
Run Code Online (Sandbox Code Playgroud)
我想建议一种更清洁的方法。当我们有多个故事板时,这将很有用
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)
无论我尝试什么,它对我来说都不起作用 - 没有错误,但我的屏幕上也没有新的视图控制器。不知道为什么,但将其包装在超时函数中最终使其工作:
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)
| 归档时间: |
|
| 查看次数: |
294400 次 |
| 最近记录: |