在找到这个问题和答案后,我想通过循环视图中的各种对象和设置参数来大大减小代码的大小。
我不能使用标记值,因为我不设置标记,除非在极少数情况下。我为所有UI元素设置了纯语言标识符。我将使用NSTextField作为示例,尝试为视图中的每个NSTextField设置委托。
import Cocoa
class ViewController: NSViewController, NSTextFieldDelegate {
@IBOutlet var myTextField1: NSTextField!
// ... and many, many more NSTextFields ...
override func viewDidLoad {
super.viewDidLoad()
let textFields = self.view.subviews.filter { $0.isKind(of: NSTextField.self) }
for textField in textFields {
if textField.identifier!.rawValue[textField.identifier!.rawValue.startIndex] != "_" { // Avoiding Swift assigned identifiers
textField.delegate = self
}
}
}
}
有人告诉我Value of type 'NSView' has no member 'delegate'
,这是有道理的,因为NSTextField的NSView实际上是被放入列表中的,而不是实际的NSTextField对象。
由于IBOutlet集合不适用于macOS,我不能简单地迭代一个集合来做我想做的事情。至少据我所知。
我假设目标是使textFields
具有[NSTextField]类型。
现在,你有filter
和is
(不会改变类型(
let textFields = self.view.subviews.filter { $0.isKind(of: NSTextField.self) }
您应该使用as?
将其更改为compactMap
(这确实会更改类型(。
let textFields = self.view.subviews.compactMap { $0 as? NSTextField }