Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 子视图通知superview属性更改_Swift_Uiview - Fatal编程技术网

Swift 子视图通知superview属性更改

Swift 子视图通知superview属性更改,swift,uiview,Swift,Uiview,因此,我有一个自定义的UIView子类,它计算对它的接触量并将其存储在属性中。让我们称之为touchableView touchableView位于superview中,该superview具有用于显示该号码的标签。 我可以很好地访问touchableView的属性,但如何知道它何时发生了更改 正确的方法是什么 您可以使用模式来实现它我完全同意委托模式适合这种情况,我已经在代码中创建了一个示例: 例子: 假设,UIView的自定义子类称为CustomView。我们在CustomView.swi

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

touchableView
位于superview中,该superview具有用于显示该号码的标签。 我可以很好地访问
touchableView
的属性,但如何知道它何时发生了更改

正确的方法是什么

您可以使用模式来实现它

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


例子: 假设,
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)
    }
}
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)")
    }
}
下面是
ViewController.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)
    }
}
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)")
    }
}
现在,构建并运行该项目。您将看到
touchableViewDidStartChange
touchableViewDidEndChange
功能将在每次触摸
customView
时打印
touchableView
更改前后的值


它类似于使用
UITextFieldDelegate
UITextViewDelegate
UITableViewDelegate
,等等,对吗

有关协议和委托的详细信息


希望这对你有帮助

触摸的数量是多少?对不起,那是个奇怪的表达。触摸的次数是多少?或者是用户触摸的视图位置?这是在UIView上同时触摸的电流量。使用触摸开始计算触摸结束。