子视图通知房产变更的超级视图

时间:2017-05-25 11:06:15

标签: swift uiview

所以我有一个UIView的自定义子类,它计算触摸量并将其存储在属性中。让我们称之为touchableView

touchableView位于超级视图中,其中包含用于显示该数字的标签。 我可以访问touchableView的财产,但我怎么知道它何时发生了变化?

这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

我完全同意Taras Chernyshenko委托模式适合这种情况,我在代码中创建了一个示例:

实施例

假设您的UIView自定义子类名为CustomView。我们在CustomView.swift文件中包含以下代码:

protocol CustomViewDelegate: class {

    func touchableViewDidStartChange(_ customView: CustomView)
    func touchableViewDidEndChange(_ customView: CustomView)
}

class CustomView: UIView {

    private(set) var touchableView: Int = 0

    weak var delegate: CustomViewDelegate?

    override init(frame: CGRect) {
        super.init(frame: frame)

        addGestureRecognizer(
            UITapGestureRecognizer(target: self, action: #selector(tapGestureHandler(_:)))
        )
    }

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

    func tapGestureHandler(_ sender: UITapGestureRecognizer) {
        delegate?.touchableViewDidStartChange(self)
        touchableView += 1
        delegate?.touchableViewDidEndChange(self)
    }
}

以下是ViewController.swift文件中的代码:

class ViewController: UIViewController, CustomViewDelegate {

    private let customView: CustomView = CustomView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))

    override func viewDidLoad() {
        super.viewDidLoad()

        customView.delegate = self
        customView.center = view.center
        customView.backgroundColor = UIColor.yellow
        view.addSubview(customView)
    }

    //MARK: Custom View delegate methods
    func touchableViewDidStartChange(_ customView: CustomView) {
        print("Touchable View did start change: \(customView.touchableView)")
    }

    func touchableViewDidEndChange(_ customView: CustomView) {
        print("Touchable View did end change: \(customView.touchableView)")
    }
}

现在,构建并运行项目。您会看到touchableViewDidStartChangetouchableViewDidEndChange函数会在每次触摸touchableView时更改customView之前和之后的值。

它类似于使用UITextFieldDelegateUITextViewDelegateUITableViewDelegate等,对吗?

See here了解有关协议和代理的更多信息。

希望这能帮到你!

答案 1 :(得分:0)

您可以使用delegate模式来实现它