有没有一种方法可以在 Swift 中将委托分配给同一 class 的多个对象一次?
Is there a way to assign delegate to more than one object of the same class just one time in Swift?
例如,我在视图控制器中放置了20个按钮,它们都继承自CommonButton,CommonButton继承自UIButton,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?
}
有几种方法:
就我个人而言,我会将 delegate
属性 设为 @IBOutlet
然后我可以在 IB 的“连接检查器”中指定委托权,而不是在代码中做任何事情,例如
@objc protocol CustomButtonDelegate: class { ... }
class CustomButton: UIButton {
@IBOutlet weak var delegate: CustomButtonDelegate?
...
}
或者,如果您真的想以编程方式执行此操作,当您在 IB 中为按钮创建插座时,您还可以创建一个“插座集合”:
@IBOutlet var buttons: [CustomButton]!
然后你可以控制-从IB中的控件拖到“助手”视图中的这个出口集合。
完成后,您可以遍历出口集合:
for button in buttons {
button.delegate = self
}
显然,您可以自己手动填充按钮数组,但同样,我会在 IB 中将按钮连接到这个“outlet collection”数组。
您可以将 IBOutletCollection
与不同的按钮标签结合使用。
例如,我在视图控制器中放置了20个按钮,它们都继承自CommonButton,CommonButton继承自UIButton,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?
}
有几种方法:
就我个人而言,我会将
delegate
属性 设为@IBOutlet
然后我可以在 IB 的“连接检查器”中指定委托权,而不是在代码中做任何事情,例如@objc protocol CustomButtonDelegate: class { ... } class CustomButton: UIButton { @IBOutlet weak var delegate: CustomButtonDelegate? ... }
或者,如果您真的想以编程方式执行此操作,当您在 IB 中为按钮创建插座时,您还可以创建一个“插座集合”:
@IBOutlet var buttons: [CustomButton]!
然后你可以控制-从IB中的控件拖到“助手”视图中的这个出口集合。
完成后,您可以遍历出口集合:
for button in buttons { button.delegate = self }
显然,您可以自己手动填充按钮数组,但同样,我会在 IB 中将按钮连接到这个“outlet collection”数组。
您可以将 IBOutletCollection
与不同的按钮标签结合使用。