问题描述
感谢 Duncan C。我编辑了我的问题:
我有一个带有 3 个 SegmentedControl 段的 ViewControllerA,在 ViewControllerB 上您可以删除一个段并返回到 VCA。 当我这样做时,在 VCA 中,我在 3 个段(最初加载的 3 个段)上有 2 个段(删除后的新段)。
我知道这与视图周期有关,初始 ViewDidLoad 仍然存在,但即使通过 viewWillAppear 我仍然有这个结果。
这个项目不是真正的项目,只是为了解决我在初始项目中遇到的问题的测试。
我的 VCA 代码:
class VCA: UIViewController,Info {
// array which contains the name for the segmentedControl
var array = ["Peter","Bob","Jim"]
var segmentedControl: UISegmentedControl!
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
setView(array: array)
}
override func viewDidLoad() {
super.viewDidLoad()
}
// delegate protocol: receive data from VCB
func passData(array: [String]) {
self.array = array
}
func setView(array: [String]) {
segmentedControl = UISegmentedControl(items: array)
segmentedControl.selectedSegmentIndex = 0
segmentedControl.translatesAutoresizingMaskIntoConstraints = false
let button = UIButton(type: .system)
button.translatesAutoresizingMaskIntoConstraints = false
button.setTitle("OK",for: .normal)
button.addTarget(self,action: #selector(buttonTapped),for: .touchUpInside)
let stackView = UIStackView()
stackView.axis = .vertical
stackView.distribution = .fillEqually
stackView.spacing = 50
stackView.addArrangedSubview(segmentedControl)
stackView.addArrangedSubview(button)
view.addSubview(stackView)
stackView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
stackView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor,constant: 20),stackView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor,constant: -20),stackView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor,stackView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor,constant: -20)])
}
@objc func buttonTapped() {
let destinationVC = VCB()
destinationVC.array = array
destinationVC.infoDelegate = self
destinationVC.modalPresentationStyle = .fullScreen
present(destinationVC,animated: true,completion: nil)
}
}
我的 VCB 代码:
class VCB: UIViewController {
// array which contains the name of the segments
var array = [String]()
// delegate to send data back
var infoDelegate: Info!
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
}
override func viewDidLoad() {
super.viewDidLoad()
setView(array: array)
}
func setLabel(array: [String]) -> String {
var labelText = "the array contains"
for name in array {
labelText += " \(name)"
}
return labelText
}
func setView(array: [String]) {
let label = UILabel(frame: CGRect(x: 0,y: 0,width: 200,height: 50))
label.translatesAutoresizingMaskIntoConstraints = false
label.numberOfLines = 0
label.text = setLabel(array: array)
view.addSubview(label)
view.backgroundColor = .cyan
NSLayoutConstraint.activate([
label.centerYAnchor.constraint(equalTo: view.centerYAnchor),label.centerXAnchor.constraint(equalTo: view.centerXAnchor)])
let button = UIButton(type: .system)
button.setTitle("Delete the first name in the array",action: #selector(backTapped),for: .touchUpInside)
button.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(button)
NSLayoutConstraint.activate([
button.topAnchor.constraint(equalTo: label.bottomAnchor,constant: 40),button.centerXAnchor.constraint(equalTo: label.centerXAnchor)])
}
@objc func backTapped() {
array.remove(at: 0)
infoDelegate.passData(array: array)
dismiss(animated: true,completion: nil)
}
}
使用协议将数据发送回 VCB:
protocol Info {
func passData(array: [String])
}
有什么想法/帮助吗?
非常感谢
解决方法
我猜 VCA 是视图控制器 A,VCB 是视图控制器 B。你是说从 VCB 中删除了 VCA 的分段控制器的一段?
你不应该弄乱另一个视图控制器的视图。
您需要发布您的代码并解释用户如何在视图控制器之间导航,以便我们能够为您提供帮助。
(顺便说一句,那些巨大的分段控件看起来很荒谬。您应该将它们保留在标准高度。)