将多个 UIView 名称管理到 switch...case Swift 语句中

Managing multiple UIViews names into switch...case Swift statement

我有一个带有多个名为 view0、view1、view2 的 UIView 的 UIViewController... 在解析队列之后,我的应用程序检索了一个 parsedArray,并且必须根据其值更改单个视图的背景颜色。为了避免长 if...else 例程,我想使用 switch...case 语句:那么,管理这些多个 UIView 的最佳方法是什么names 进入 switch...case 语句?延期?我知道我可以使用 Collection views 或 UIStackViews,但我已经有很多方法专注于单个 UIViews,顺便说一句,我想学习管理类型名称(如 UIView)中的多个名称的最佳方法。谢谢!

    func colorViews() {
    
    for i in 0...21
    {
        switch (parsedArray[i]) {
        case "0": viewX.backgroundColor = .systemRed // HERE X MUST BE i
        default:
             viewX.backgroundColor = .systemGreen // HERE X MUST BE i
        }

    }
    

如果您不想更改当前结构,一个解决方案是可以使用视图 ID。当您生成您的 viewX 时,只需向其添加一个与视图编号具有相同值的 id。

这是一个示例:

extension UIView {

    var id: String? {
        get {
            return self.accessibilityIdentifier
        }
        set {
            self.accessibilityIdentifier = newValue
        }
    }

    func view(withId id: String) -> UIView? {
        if self.id == id {
            return self
        }
        for view in self.subviews {
            if let view = view.view(withId: id) {
                return view
            }
        }
        return nil
    }
}

之后您可以像这样访问您的观点:

let view = UIView.view(withId: 0)

要么将您的视图放在数组中,要么创建一个函数,returns您是给定索引的视图。

数组方法如下所示:

private var nodeViews: [UIView] {
    return [
        view0, view1, view2, view3, view4, view5,
        view6, view7, view8, view9, view10, view11,

        view12, view13, view14, view15, view16, view17,
        view18, view19, view20, view21, view22, view23
    ]
}

你的方法会像

private func refreshNodeColors() {
    let nodes = self.nodeViews
    parsedArray.enumerated().forEach { index, value in
        guard index < nodes.count else { return } // More data in array than nodes supported
        nodes[index].backgroundColor = {
            switch value {
                case "0": return .systemRed
                default: return .systemGreen
            }
        }()
    }  
}

returns 带有索引的视图看起来像这样的函数

private func nodeWithIndex(_ index: Int) -> UIView? {
    switch index {
        case 0: return view0
        case 1: return view1
        // TODO: add other views here as well
        default: return nil
    }
}

你会像这样使用它

private func refreshNodeColors() {
    parsedArray.enumerated().forEach { index, value in
        guard let node = nodeWithIndex(index) else { return } // Node with this index does not exist
        node.backgroundColor = {
            switch value {
                case "0": return .systemRed
                default: return .systemGreen
            }
        }()
    }  
}

正如 Joakim 评论所建议的那样,解决方案比我想象的要简单:一个简单的名称数组,我 post 将其进一步参考。谢谢其他的建议,我会好好学习的

在控制器范围内:

var views = [UIView]()

在 viewDidLoad() 函数中:

views = [view0, view1, view2, view3, view4, view5, view6, view7, view8, view9, view10, view0b, view1b, view2b, view3b, view4b, view5b, view6b, view7b, view8b, view9b, view10b]

在 switch...case 语句中:

        for i in 0...21
    {
        switch (parsedArray[i]) {
        case "0":
            views[i].backgroundColor = .systemRed // HERE [i] CALLS SINGLE UIVIEW NAME!
        case "1":
            views[i].backgroundColor = .systemGreen // HERE [i] CALLS SINGLE UIVIEW NAME!
        default:
            print("DEFAULT!")
        }
    }