有没有一种方法可以在Swift中仅一次将委托分配给同一类的多个对象?

问题描述

例如,我在视图控制器中放置了20个按钮,它们都继承自从UIButton继承的CommonButton,并且CommonButton遵循名为ButtonDelegate的协议,现在我想将委托分配给视图控制器中的按钮。有没有办法简化20个按钮的IBOutlet并将委托逐个分配给每个按钮的方法

解决方法

没有明确的方法。您可以将20个按钮存储到一个数组中,以备下次使用。

buttons = [btn0,.......,btn19]

for btn in buttons {
    btn.delegate = self
}

另一种方法,您可以使静态委托。当按钮事件触发时,请检查您的静态委托类型,并控制所有事情。

import UIKit

class ViewController1: UIViewController {
    var buttons: [CustomButton] = [CustomButton]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        loadUI()
    }
    
    func loadUI()  {
        buttons = (0..<5).map({ (index) -> CustomButton in
            let button = CustomButton()
            button.tag = index
            button.setTitle("\(index)",for: .normal)
            button.setTitleColor(.black,for: .normal)
            button.backgroundColor = UIColor.green
            return button
        })
        
        for (index,button) in buttons.enumerated()  {
            view.addSubview(button)
            button.translatesAutoresizingMaskIntoConstraints = false
            button.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
            if index == 0 {
                button.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
            }else {
                button.leftAnchor.constraint(equalTo: (buttons[index-1]).rightAnchor).isActive = true
            }
            if index == buttons.count - 1 {
                button.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
            }
            button.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
            button.widthAnchor.constraint(equalTo: (buttons[0]).widthAnchor).isActive = true
            button.addTarget(self,action: #selector(self.buttonEvent(_:)),for: .touchUpInside)
        }
        
        CustomButton.delegate = self
    }
    
    @objc func buttonEvent(_ button: UIButton) {
        if let viewController = CustomButton.delegate as? ViewController1 {
            print("tag: \(button.tag) viewController: \(viewController)")
        }
    }
}

extension ViewController1: CustomButtonProtocol {
}

protocol CustomButtonProtocol {
}

class CustomButton: UIButton {
    public static var delegate: CustomButtonProtocol?
}
,

有两种方法:

  1. 个人而言,我将delegate属性设为@IBOutlet,然后可以在IB的“连接检查器”中指定委托权限,而完全不必在代码中进行任何操作,例如

    @objc protocol CustomButtonDelegate: class { ... }
    
    class CustomButton: UIButton {
    
        @IBOutlet weak var delegate: CustomButtonDelegate?
    
        ...
    }
    

    enter image description here

  2. 或者,如果您真的想以编程方式执行此操作,则在IB中为按钮创建插座时,还可以创建“插座集合”:

    @IBOutlet var buttons: [CustomButton]!
    

    然后,您可以从IB中的控件 control 拖动到“助手”视图中的此插座集合。

    enter image description here

    一旦这样做,就可以遍历奥特莱斯购物集:

    for button in buttons {
        button.delegate = self
    }
    

    很明显,您可以自己手动填充按钮数组,但同样,我还是将按钮连接到IB中的这个“插座集合”数组。

,

您可以将IBOutletCollection与不同的标记一起用于按钮。