Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.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 获取类名而不引用self_Ios_Swift_Cocoa Touch_Uiviewcontroller - Fatal编程技术网

Ios 获取类名而不引用self

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

我想用默认的nib名称初始化UIViewController子类。我能想到的唯一方法就是获取当前的类名。但要做到这一点,我需要引用self,在调用super.initWithNib之前是不可能的

    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!