Ios 获取类名而不引用self
我想用默认的nib名称初始化UIViewController子类。我能想到的唯一方法就是获取当前的类名。但要做到这一点,我需要引用self,在调用super.initWithNib之前是不可能的Ios 获取类名而不引用self,ios,swift,cocoa-touch,uiviewcontroller,Ios,Swift,Cocoa Touch,Uiviewcontroller,我想用默认的nib名称初始化UIViewController子类。我能想到的唯一方法就是获取当前的类名。但要做到这一点,我需要引用self,在调用super.initWithNib之前是不可能的 init(managedObject: NSManagedObject){ let className = PSOClassNameFor(self) /// ERROR -> Cannot reference self self.managedObjec
init(managedObject: NSManagedObject){
let className = PSOClassNameFor(self) /// ERROR -> Cannot reference self
self.managedObject = managedObject
super.init(nibName:className, bundle: nil)
}
我不知道这个类的实际名称,因为这是一个包含多个子类的抽象类
是否有其他加载默认名称的方法
以下是正在使用的两个文件:
当我尝试用nil nibName初始化时,它会加载一个黑屏
init(){
super.init(nibName: nil, bundle: nil)
}
当我指定nib名称时,它会按预期工作:
init(){
super.init(nibName: "EntityCardViewController", bundle: nil)
}
也许我遗漏了一些明显的东西,但这在Xcode 6.4/Swift 1.2中运行良好:
import CoreData
class MySubVC: UITableViewController {
init(managedObject: NSManagedObject){
let className = self.dynamicType.description()
println(className) // Project_Name.MySubVC; not so bad; easily parsed
super.init(nibName: className, bundle: nil)
}
required init!(coder aDecoder: NSCoder!) {
super.init(coder: aDecoder)
}
}
对于Swift 3:
init() {
super.init(nibName: String(describing: type(of: self)), bundle: nil)
}
如果nib名称与类名相同,您可以传递nil作为nib名称。是的,但将nib设置为nil对我不起作用。更新问题为什么C++答案会应用?谢谢指点。区别在于我调用的是一个函数PSOClassName(self)。如果我引用self.dynamicType,编译器不会抱怨。我创建该函数是为了删除dynamicType描述的第一部分。谢谢,但要传递self,self的所有属性都必须可用,但这里self.dynamicType显然是特殊的,作为一个编译器实体,并保证在所有类属性之前初始化。但我相信你知道这一点,或者只是想出来了。有趣的是,Xcode不喜欢自动完成
dynamicType
。在调用超级初始值设定项之前,我不知道我可以引用self.dynamicType。只是用你的答案想出来了。我注意到它不会自动完成。它看起来是硬编码的。您可能需要添加更多的描述。这是一个很好的解决方案。我有一个UIViewController
,它本身不应该初始化。其中有几个VC
s子类,它们有自己的nib。现在我只需要在超类中实现一次。也适用于Swift 5.x!