Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在Swift中实例化并显示viewController 问题_Ios_Objective C_Swift_Uiviewcontroller - Fatal编程技术网

Ios 在Swift中实例化并显示viewController 问题

Ios 在Swift中实例化并显示viewController 问题,ios,objective-c,swift,uiviewcontroller,Ios,Objective C,Swift,Uiviewcontroller,我开始在Xcode 6上查看新的Swift,并尝试了一些演示项目和教程。现在我被困在: 从特定情节提要实例化并呈现viewController 目标C溶液 如何在Swift上实现这一点?此答案上次是针对Swift 5.4和iOS 14.5 SDK修订的 这都是新语法和稍加修改的API的问题。UIKit的基本功能没有改变。绝大多数iOS SDK框架都是如此 let storyboard=UIStoryboard(名称:“myStoryboardName”,bundle:nil) 让vc=stor

我开始在
Xcode 6
上查看新的
Swift
,并尝试了一些演示项目和教程。现在我被困在:

从特定情节提要实例化并呈现
viewController

目标C溶液 如何在Swift上实现这一点?

此答案上次是针对Swift 5.4和iOS 14.5 SDK修订的


这都是新语法和稍加修改的API的问题。UIKit的基本功能没有改变。绝大多数iOS SDK框架都是如此

let storyboard=UIStoryboard(名称:“myStoryboardName”,bundle:nil)
让vc=storyboard.InstanceEviewController(带有标识符:“myVCID”)
self.present(vc,动画:true)
确保在情节提要内部的“情节提要ID”下设置
myVCID

用于实例化
UIViewController
的用户,但有以下例外情况:

致命错误:对类使用未实现的初始值设定项“init(coder:)”

快速提示:

在您试图实例化的目标
UIViewController
手动实现
required init?(coder-aDecoder:NSCoder)

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}
let loginVc = UIStoryboard.login.instantiateViewController(withIdentifier: "\(LoginViewController.self)") as! LoginViewController
如果你需要更多的描述,请参考我的答案

当我把它放在AppDelegate中时,它对我很有效

斯威夫特:

let viewController:UIViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("ViewController") as UIViewController
self.presentViewController(viewController, animated: false, completion: nil)
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)
目标C

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


阿卡西夫斯基的回答很好!但是,如果从显示的视图控制器返回时遇到一些问题,此替代方案可能会有所帮助。这对我有用

斯威夫特:

let viewController:UIViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("ViewController") as UIViewController
self.presentViewController(viewController, animated: false, completion: nil)
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];

如果你想以一种方式展示它,你应该像下面这样:

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

我知道这是一个旧线程,但我认为当前的解决方案(使用给定视图控制器的硬编码字符串标识符)非常容易出错

我已经创建了一个构建时脚本(您可以使用),它将创建一种编译器安全的方式,用于访问和实例化给定项目中所有情节提要中的视图控制器

例如,在Main.storyboard中名为vc1的视图控制器将实例化如下:

let vc: UIViewController = R.storyboard.Main.vc1^  // where the '^' character initialize the controller

如果您的Viewcontroller不使用任何storyboard/Xib,您可以按如下方式调用此特定VC:

 let vcInstance : UIViewController   = yourViewController()
 self.present(vcInstance, animated: true, completion: nil)
斯威夫特3


无论我尝试了什么,它都不适合我——没有错误,但我的屏幕上也没有新的视图控制器。不知道为什么,但将其包装在timeout函数中最终使其工作:

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)
}
Swift 4:

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let yourVC: YourVC = storyboard.instantiateViewController(withIdentifier: "YourVC") as! YourVC

我想建议一种更干净的方法。当我们有多个故事板时,这将非常有用

1.创建一个包含所有故事板的结构

struct Storyboard {
      static let main = "Main"
      static let login = "login"
      static let profile = "profile" 
      static let home = "home"
    }
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)
  }
}
2。像这样创建UIStoryboard扩展

struct Storyboard {
      static let main = "Main"
      static let login = "login"
      static let profile = "profile" 
      static let home = "home"
    }
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)
  }
}
将情节提要标识符作为类名,并使用下面的代码进行实例化

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}
let loginVc = UIStoryboard.login.instantiateViewController(withIdentifier: "\(LoginViewController.self)") as! LoginViewController

我创建了一个库,使用更好的语法可以更轻松地处理此问题:


只需更改Storyboard.swift,并让
视图控制器
符合
故事板

swift 4.2更新代码即可

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

let vc = self.storyboard!.instantiateViewController(withIdentifier: "CVIdentifier")
self.present(vc, animated: true, completion: nil)

您甚至可以省略
!;)您是否介意将
详细说明为UIViewController
?为什么这是必要的?
因为关键字用于类型转换。这与目标中的对象相同,我知道我可以省略它们,但这是一个冗长习惯的一部分:D作为
实例化的EWController标识符
返回
任何对象
id
在Swift中等效),我声明
vc
作为
UIViewController
,我必须将
任何对象
键入
UIViewController
。嗨,朋友们,我面临着一些不同的问题,此代码在模拟器上运行,而不是在iOS v7.1.2的ipad2上运行。“如果你不介意的话,帮我解决这个问题。”阿卡西夫斯基非常肯定地对你说。但有些人可能不这么认为。如果你想使用自定义启动器,你可以用super.init(nibName:nil,bundle:nil)调用super,whew会很好地加载,或者用他们的名字调用NIB文件。@user1700737我正在实例化viewController,它引用的是故事板,它执行initWithCoder,而不是initWithNib。参考这个问题嗨,朋友们,我面临着一些不同的问题,这段代码运行在模拟器上,而不是在我的ipad2上,它有iOS v7.1.2。如果你不介意帮我解决这个问题。@Indra你需要在stack上问另一个问题,给我链接,我很乐意帮助你!在Swift 1.2上,必须使
init(coder-aDecoder:NSCoder!)
为“必需”。因此,现在您必须编写以下内容:
required init(coder-aDecoder:NSCoder!)
我得到了这样的信息:“无法构造,因为它没有可访问的初始值设定项”。故事板所建立的出口和其他关系是losthats@nonobjc for?@StackRunner这将不适用于目标用户,请对您的答案进行解释。解释底层逻辑比给出代码更重要。它帮助作者和其他读者自己解决这个问题和类似的问题,同时为他们提供扩展编程技能所需的知识线索。