我有一个类UIBaseClassViewController在目标c中具有方便的功能。现在我切换到swift,我正在尝试将它的代码转换为swift.the函数给我的问题是
+(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.it类型加载nib很好但是因为UIBaseClassViewController应用程序崩溃,因为它无法在UILoginViewController中找到UIBaseClassViewController中的函数。
在这种情况下,我如何使它创建子类的对象而不是parent.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()
您必须在所需的视图控制器类上调用此静态函数,或者根本不使其静态。请参阅下面的示例,了解它在Swift中的工作原理。
class ParentView: UIView {
static func printSelf() {
print(String(describing: self))
}
}
class ChildView: ParentView {}
ParentView.printSelf() // Prints ParentView
ChildView.printSelf() // Prints ChildView
结果我们不需要提到控制器对象的nib和bundle ...我从目标c移动了,这些东西在那里是必要的。
同
[[UILoginViewController alloc] init]
应用程序将显示黑屏。
在swift中,我们可以使用UILoginViewController(),它会自动将nib与控制器对象相关联。
所以回答我刚刚使用过的问题
self.init()
代替
self.init(nibName: String(describing:self), bundle:Bundle.main)