我在目标c中有一个具有便捷功能的UIBaseClassViewController类,现在我切换到swift,并且试图将其代码转换为swift。该功能给我带来的问题是
+(UIBaseClassViewController*)getController
{
return [[[self class] alloc] initWithNibName:NSStringFromClass([self class]) bundle:[NSBundle mainBundle]];
}
我能够将其转换,但无法正常工作
static func getController() -> Self
{
print("sam controller class = \(String(describing:self))")
print("SAM controller = \(self.init(nibName: String(describing:self), bundle:Bundle.main))")
return self.init(nibName: String(describing:self), bundle:Bundle.main)
}
输出:
sam controller class = UILoginViewController
SAM controller = <Swift_And_Node.UIBaseClassViewController: 0x7f8a4ee13830>
创建的对象的类型为UIBaseClassViewController。它可以很好地加载笔尖,但是由于对象无法访问UILoginViewController中的函数,因此该对象崩溃了,因为UIBaseClassViewController应用程序崩溃。
如何使它创建子类的对象而不是父类。在这种情况下,UILoginViewController
为了更好地理解显示添加代码:
UIBaseClassViewController :
class UIBaseClassViewController: UIViewController {
static func getController() -> Self
{
print("sam controller class = \(String(describing:self))")
print("SAM controller = \(self.init(nibName: String(describing:self), bundle:Bundle.main))")
var object = self
return self.init(nibName: String(describing:self), bundle:Bundle.main)
}
}
UILoginViewController :
class UILoginViewController: UIBaseClassViewController {}
第三个需要UILoginViewController的控制器:
UILoginViewController.getController()
答案 0 :(得分:0)
您必须在所需的视图控制器类上调用此静态函数,或者根本不使其变为静态。请参见下面的示例,以了解它在Swift中的工作方式。
class ParentView: UIView {
static func printSelf() {
print(String(describing: self))
}
}
class ChildView: ParentView {}
ParentView.printSelf() // Prints ParentView
ChildView.printSelf() // Prints ChildView
答案 1 :(得分:0)
结果是我们不需要为控制器对象提到笔尖和束...我从目标c搬到了那里,这些东西是必需的。
使用
[[UILoginViewController alloc] init]
应用程序将显示黑屏。
我们很快就可以使用UILoginViewController(),它将自动将nib与控制器对象相关联。
所以要回答我刚才使用的问题
self.init()
代替
self.init(nibName: String(describing:self), bundle:Bundle.main)