干扰UIView以添加新逻辑或扩展UIViewController

时间:2018-08-02 06:20:42

标签: ios swift inheritance uiview uiviewcontroller

我制作了一个应用,在其中,我需要使用占位符创建UITextView。我通过继承实现了这一点,并由他们自己作为委托创建了自己的UITextView类(在开始编辑和结束编辑时添加了一些逻辑)。

寻找有关Is it correct to put such logic into UIView?的信息,发现很多文章说您不应该这样做,但是找不到原因?

我尝试查找有关继承UIView类并为其赋予一些新逻辑(例如:选择颜色,字体,作为委托进行制造,计算布局尺寸等)是否正确的信息,或者尝试使用ViewControllers或自定义presenterControllers

在什么情况下应该使用继承,为什么?在不该做什么?最佳做法是什么?为什么是最佳做法?

将非常感谢您提供详细的解释。

示例:

class PlaceholderTextView: UITextView {

    override init(frame: CGRect, textContainer: NSTextContainer?) {
        super.init(frame: frame, textContainer: textContainer)
        setupViews()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setupViews()
    }

    private func setupViews() {
        self.delegate = self
        self.text = "Enter some text..."
        self.textColor = UIColor.lightGray
        self.font = UIFont.italicSystemFont(ofSize: 12)
    }
}

extension PlaceholderTextView: UITextViewDelegate {
    func textViewDidBeginEditing(_ textView: UITextView) {
        if self.textColor == UIColor.lightGray {
            self.text = nil
            self.textColor = UIColor.black
            self.font = UIFont.systemFont(ofSize: 12)
        }
    }

    func textViewDidEndEditing(_ textView: UITextView) {
        if self.text.isEmpty {
            self.text = "Enter some text..."
            self.textColor = UIColor.lightGray
            self.font = UIFont.italicSystemFont(ofSize: 12)
        }
    }
}

1 个答案:

答案 0 :(得分:0)

在这种情况下,您应该继承

当您想向现有类添加其他内容时,例如UITextView并没有提供textview类占位符,尽管它具有属性placeholder

其次是代码的可重用性。例如,在UITextField类中,您想为项目中的所有文本字段更改占位符rect,那么您就不会在每个视图控制器中更改占位符rect的属性,而是制作一个{{ 1}},并使用该类

将这种逻辑放入UIView是否正确?

如果您要进行一些自定义绘图,则必须重写UItextField子类中的逻辑,而必须重写Draw()的{​​{1}}方法