将多个 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!")
}
}
我有一个带有多个名为 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!")
}
}