在Swift中等效的控制器的自定义alloc

问题描述 投票:0回答:2

我有一个类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()
objective-c swift class subclass base-class
2个回答
0
投票

您必须在所需的视图控制器类上调用此静态函数,或者根本不使其静态。请参阅下面的示例,了解它在Swift中的工作原理。

class ParentView: UIView {
    static func printSelf() {
        print(String(describing: self))
    }
}
class ChildView: ParentView {}

ParentView.printSelf() // Prints ParentView
ChildView.printSelf() // Prints ChildView

0
投票

结果我们不需要提到控制器对象的nib和bundle ...我从目标c移动了,这些东西在那里是必要的。

[[UILoginViewController alloc] init] 

应用程序将显示黑屏。

在swift中,我们可以使用UILoginViewController(),它会自动将nib与控制器对象相关联。

所以回答我刚刚使用过的问题

self.init()

代替

self.init(nibName: String(describing:self), bundle:Bundle.main)
© www.soinside.com 2019 - 2024. All rights reserved.