代码之家  ›  专栏  ›  技术社区  ›  Marmelador

通过协议更改代理的属性

  •  0
  • Marmelador  · 技术社区  · 8 年前

    我有 controllingView ,需要在中更改属性 presentingView . 他们都在同一个地方 ViewController

    我可以让他们通过 演示视图 的代表 控制视图 . 但如果我能直接改变它的属性,它会更加优雅和灵活( 自从 我需要更改 演示视图 的属性的属性 )

    我在这个问题上看到了这一点: Accessing protocol property in Swift class
    但在 控制视图 使命感 delegate.propertyINeedToChange nil
    如何从委托对象更改委托的属性?

    代码如下:

    class MainViewController : UIViewController {
    
        var controllingView = ControllingView()
        let presentingView = PresentingView()
    
        override func loadView() {
            let view = UIView()
            view.backgroundColor = .white
    
            view.addSubview(controllingView)
            view.addSubview(presentingView)
    
            self.view = view
            controllingView.delegate = presentingView
        }
    }
    
    
    class ControllingView: UIView {
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
        }
    
        override init(frame: CGRect) {
            super.init(frame: frame)
            //ControlsView Setup
            self.backgroundColor = UIColor(displayP3Red: 0.9, green: 0.9, blue: 0.9, alpha: 1.0)
            setupViews()
        }
    
        let testSLDR = UISlider()
    
        var delegate: ControlsViewDelegate?
    
        func setupViews() {
            self.addSubview(testSLDR)
            testSLDR.addTarget(self, action: #selector(testSLDRchanged), for: .valueChanged)
        }
    
        @objc func testSLDRchanged() {
            delegate?.button?.backgroundColor = UIColor.red
        }
    }
    
    class PresentingView: UIView, ControlsViewDelegate {
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
        }
    
        override init(frame: CGRect) {
            super.init(frame: frame)
            let button = Button()
            self.addSubview(button)
    
        }
    
        var button: Button?
    
    }
    
    protocol ControlsViewDelegate {
        var button: Button? { get set }
    }
    
    
    class Button: UIButton { ... }
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   vadian    8 年前

    由于视图在同一视图控制器中初始化,因此不需要协议/委托

    • 删除协议和相关代码
    • 在里面 ControllingView 宣布弱者 Button 所有物

      weak var presentingButton : Button?
      
    • 将要设置代理的行替换为要分配按钮的行 PresentingView presentingButton 所有物

      controllingView.delegate = presentingView

      controllingView.presentingButton = presentingView.button
      
    • 在动作中更改颜色

      @objc func testSLDRchanged() {
          presentingButton?.backgroundColor = UIColor.red
      }