【问题标题】:Swift, creating a Generic UIViewControllerSwift,创建通用 UIViewController
【发布时间】:2014-11-18 14:41:44
【问题描述】:

我正在尝试创建一个这样的类:

class MyClass<T:UIView>: UIViewController{


    override init()
    {
        super.init(nibName: nil, bundle: nil);
    }

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func loadView() {
        self.view = T();
        println("loadView")
    }

    override func viewDidLoad() {
        super.viewDidLoad();
        println("viewDidLoad")
    }

}

当我想这样使用我的课程时:

self.navigationController?.pushViewController(MyClass<UIView>(), animated: true)

永远不会调用 viewDidLoad 和 loadView 方法!!!

你知道为什么以及是否有某种方法可以做我想做的事。

提前致谢。

【问题讨论】:

  • 你的navigationController存在吗?你在屏幕上看到推送了吗?
  • @Bartek:是的,navigationController 存在,推送发生了。
  • @rintaro :谢谢,大概就是这样。最后 Swift 泛型有很多限制......非常失望
  • 看起来这是在 Xcode 7 中修复的

标签: ios generics swift uiviewcontroller


【解决方案1】:

如 OP cmets 中所述,泛型类无法在 Objective-C 中正确表示。

解决方法是将类用作属性。像这样:

class MyClass: UIViewController{

    let viewCls:UIView.Type

    init(viewCls:UIView.Type = UIView.self) {
        self.viewCls = viewCls
        super.init(nibName: nil, bundle: nil);
    }

    required init(coder aDecoder: NSCoder) {
        self.viewCls = UIView.self
        super.init(coder: aDecoder)
    }

    override func loadView() {
        self.view = viewCls();
        println("loadView")
    }

    override func viewDidLoad() {
        super.viewDidLoad();
        println("viewDidLoad")
    }

}

// and then
self.navigationController?.pushViewController(MyClass(viewCls: UIView.self), animated: true)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    相关资源
    最近更新 更多