UISegmentedControl:传回数据时段重叠

问题描述

感谢 Duncan C。我编辑了我的问题:

我有一个带有 3 个 SegmentedControl 段的 ViewControllerA,在 ViewControllerB 上您可以删除一个段并返回到 VCA。 当我这样做时,在 VCA 中,我在 3 个段(最初加载的 3 个段)上有 2 个段(删除后的新段)。

VCA before change

VCA after change

我知道这与视图周期有关,初始 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 的分段控制器的一段?

你不应该弄乱另一个视图控制器的视图。

您需要发布您的代码并解释用户如何在视图控制器之间导航,以便我们能够为您提供帮助。

(顺便说一句,那些巨大的分段控件看起来很荒谬。您应该将它们保留在标准高度。)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...