可重用的类代码

4

我的应用程序中有几个类做同样的事情并具有相同的实例变量:

// one of the many classes I have
// they all load nibs and update the frames of their views
class HelpView: UIView {
    @IBOutlet var view: UIView!

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
        NSBundle.mainBundle().loadNibNamed("HelpView", owner: self, options: nil)
        self.addSubview(self.view)
        self.view.frame = self.bounds
    }
}

我想避免重复的代码,因此考虑使用一个超类,这样所有的类都可以继承它。
// my new superclass all classes will inherit from
class ReusableView: UIView {
    @IBOutlet var view: UIView! // all subclasses have different views

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!

        // every class has a different nib name
        NSBundle.mainBundle().loadNibNamed("Nib name goes here", owner: self, options: nil)
        self.addSubview(self.view)
        self.view.frame = self.bounds
    }
}

问题在于,在nib文件加载之前,viewnil,因此似乎无法调用该超类的方法,因为你正在传递一个空对象。我该如何处理?

3
创建一个共享的工具类,编写一个函数并将nibName(字符串)、视图控制器的视图作为参数传递。在需要时调用此方法。通过这种方式,您可以消除代码的重复性。 - pkc456
3
在基类中添加抽象视图和名称属性。方法使用这些属性。派生类使用其独特的值来实现它们。 - dbugger
1个回答

2
这将有效:
class ReusableView: UIView {

    func getHelperView() -> UIView! {
        preconditionFailure("This method must be overridden") 
    } 

    func getNibName() -> String {
        preconditionFailure("This method must be overridden") 
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!

        // every class has a different nib name
        NSBundle.mainBundle().loadNibNamed(self.getNibName(), owner: self, options: nil)
        self.addSubview(self.getHelperView())
        self.getHelperView().frame = self.bounds
    }
}

class HelpView: ReusableView {
    @IBOutlet var view: UIView!

    override func getHelperView() -> UIView! {
         return view;
    } 

    override func getNibName() -> String {
         return "NibName";
    } 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接