如何在Swift for macOS中迭代子视图并返回对象类型



在找到这个问题和答案后,我想通过循环视图中的各种对象和设置参数来大大减小代码的大小。

我不能使用标记值,因为我不设置标记,除非在极少数情况下。我为所有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]类型。

现在,你有filteris(不会改变类型(

let textFields = self.view.subviews.filter { $0.isKind(of: NSTextField.self) }

您应该使用as?将其更改为compactMap(这确实会更改类型(。

let textFields = self.view.subviews.compactMap { $0 as? NSTextField }

最新更新