【问题标题】:How to create multiple views by looping in UIKit?如何通过在 UIKit 中循环创建多个视图?
【发布时间】:2021-05-31 00:58:53
【问题描述】:
我想创建多个文本字段。
而不是做
let textfield1 = SecondTextfieldView()
let textfield2 = SecondTextfieldView()
let textfield3 = SecondTextfieldView()
let textfield4 = SecondTextfieldView()
let textfield5 = SecondTextfieldView()
let textfield6 = SecondTextfieldView()
let textfield7 = SecondTextfieldView()
let textfield8 = SecondTextfieldView()
let textfield9 = SecondTextfieldView()
let textfield10 = SecondTextfieldView()
let textfield11 = SecondTextfieldView()
let textfield12 = SecondTextfieldView()
let textfield13 = SecondTextfieldView()
let textfield14 = SecondTextfieldView()
let textfield15 = SecondTextfieldView()
let textfield16 = SecondTextfieldView()
let textfield17 = SecondTextfieldView()
let textfield18 = SecondTextfieldView()
let textfield19 = SecondTextfieldView()
let textfield20 = SecondTextfieldView()
我想循环播放它——让它简短而甜美。我如何在 UIkit (Swift) 中做到这一点?
***** 不在 SWIFTUI 中 *****
【问题讨论】:
标签:
ios
swift
uiview
uikit
【解决方案1】:
试试这个代码:
创建堆栈视图以添加所有多个视图
let stackView = UIStackView.init()
stackView.spacing = 2
stackView.distribution = .fillProportionally
stackView.axis = .vertical
self.view.addSubview(stackView)
stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 20).isActive = true
stackView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: 20).isActive = true
stackView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 20).isActive = true
stackView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -20).isActive = true
像这样创建子视图的创建循环:
for i in 0 ... 9 { // create 10 UIView
let view = UIView.init()
view.backgroundColor = colors[i] // sample color for see diffrence
// insert to stackView or etc for showing
stackView.addArrangedSubview(view)
}
创建分配给子视图的数组颜色:
var colors: [UIColor] = [.red, .black ,.blue,.green, .yellow, .brown, .red, .blue, .yellow, .brown]
输出:
【解决方案2】:
这是我在之前的项目中使用的一些示例代码:
private enum Feature: String {
case intro
case account
var selector: Selector {
switch self {
case .intro: return #selector(navigateToIntro)
case .account: return #selector(navigateToAccount)
}
}
}
override func loadView() {
let views = createButtons(for: .intro, .account)
view = createStackView(with: views)
}
private func createButtons(for features: Feature...) -> [UIView] {
features.map {
let button = UIButton(frame: CGRect(x: 0, y: 0, width: 100, height: 10))
button.setTitleColor(.systemBlue, for: .normal)
button.setTitle($0.rawValue.capitalized, for: .normal)
button.accessibilityIdentifier = $0.rawValue
button.addTarget(self, action: $0.selector, for: .touchUpInside)
return button
}
}
private func createStackView(with subViews: [UIView]) -> UIStackView {
let stackView = UIStackView(arrangedSubviews: subViews)
stackView.axis = .vertical
stackView.distribution = .fillEqually
stackView.alignment = .fill
stackView.spacing = 10
stackView.translatesAutoresizingMaskIntoConstraints = false
return stackView
}
它的设计目的是让您可以将项目放在顶部的枚举中并在 loadView() 中遍历它们,但您也可以使用 viewDidLoad() 来设置它们。