如何在 Swift for macOS 和 return 对象类型中迭代子视图

How to iterate through subviews in Swift for macOS and return object types

找到 后,我想我会尝试通过遍历视图中的各种对象并设置参数来显着减少代码的大小。

我无法使用标签值,因为我没有设置标签,除非在极少数情况下。我为所有 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 { [=12=].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 { [=13=].isKind(of: NSTextField.self) }

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

let textFields = self.view.subviews.compactMap { [=16=] as? NSTextField }