Swift 2.1 中的 NSClassFromString

Posted

技术标签:

【中文标题】Swift 2.1 中的 NSClassFromString【英文标题】:NSClassFromString in Swift 2.1 【发布时间】:2015-12-28 11:01:30 【问题描述】:

我想我阅读了大部分 SO 问题和 Google 对此的回答,但仍然无法正常工作。以这个代码为例:

import UIKit

class Person: NSObject 

    var name = "Pieter"



let PersonClass: AnyClass? = NSClassFromString("Person")
let person = PersonClass()
print(person.name)

NSClassFromString("Person") 更改为NSClassFromString("MyAppName.Person") 并没有什么不同。在 PersonClass 声明后面添加as! NSObject.Type 也不行。在类声明之前添加@obcj(Person 也不。

现实生活中的目标是从数据库中读取类名并相应地加载适当的故事板/UIViewController。所以我正在寻找一种将 UIViewController 类名作为字符串传递并用它实例化 UIStoryboard 的方法。

怎么做?

编辑:根据您的建议,这是我目前在现实生活中尝试的方法:

let storyboard = UIStoryboard(name: "MyStoryboard", bundle: nil)
let MyClassName = "MyApp.MyTableViewController"
let MyClass = NSClassFromString(MyClassName) as! UITableViewController.Type
let controller = storyboard.instantiateInitialViewController() as! MyClass

它给出了一个错误说"MyClass" is not a type。我无法删除它,否则我会收到无法从 AnyClass 转换的错误。

【问题讨论】:

您是否检查了来自***.com/questions/24030814/… 的所有答案?这个看起来很接近你想要的:***.com/a/32265287/1187415. 查看我帖子中的编辑... 【参考方案1】:

试试下面给出的代码

let viewController = storyboard?.instantiateViewControllerWithIdentifier("ViewController") as! ViewController

此代码允许您实例化情节提要视图控制器。 但是不能传递 View Controller 类名。

您必须传递视图控制器的情节提要标识符。 请查看下面的图片。

【讨论】:

亲爱的朋友,请阅读他的完整问题。他的现实生活目标是从情节提要中实例化视图控制器类。 在阅读完整问题之前请不要投反对票。 不,他不是。问题是他想从数据库中读取类名(而不是标识符)并实例化一个视图控制器。 亲爱的朋友,他想实例化这个类,他正在使用故事板。但是在使用情节提要时没有标识符就无法做到 不使用storyboard时,可以使用类名,但如果是storyboard,我们必须使用storyboard id来初始化。

以上是关于Swift 2.1 中的 NSClassFromString的主要内容,如果未能解决你的问题,请参考以下文章

Swift 2.1 中的块存储变量

如何将边框添加到从 Swift 2.1 中的故事板链接的 @IBAction 按钮?

在 Swift 2.1 中使用单例

多种协议的 Swift 类一致性(XCode 7、iOS 9、Swift 2.1)

swift Swift 2.1 Hello World测试

将版本更改为 Swift 1.2 而不是 Swift 2.1