Ios 当试图将数据从UIView传递到UIViewController时,我犯了什么错误?

Ios 当试图将数据从UIView传递到UIViewController时,我犯了什么错误?,ios,swift,Ios,Swift,我正在尝试为孩子们制作一个教育应用程序;到目前为止,屏幕上有一个“提示按钮”和一个UILabel,显示孩子要求提示的次数 按下提示按钮将显示一个弹出窗口(UIView),孩子可以通过按下另一个按钮确认他/她想要提示。现在,我希望将原始UILabel增加1,并在按下弹出UIView上的第二个按钮后,将这个新增加的数字保存为userDefaults 虽然我的代码设法将递增的数字保存为userDefaults,但UILabel在应用程序被终止并重新启动之前不会反映此更改 我会感激你的帮助;我不知道我错

我正在尝试为孩子们制作一个教育应用程序;到目前为止,屏幕上有一个“提示按钮”和一个UILabel,显示孩子要求提示的次数

按下提示按钮将显示一个弹出窗口(UIView),孩子可以通过按下另一个按钮确认他/她想要提示。现在,我希望将原始UILabel增加1,并在按下弹出UIView上的第二个按钮后,将这个新增加的数字保存为userDefaults

虽然我的代码设法将递增的数字保存为userDefaults,但UILabel在应用程序被终止并重新启动之前不会反映此更改

我会感激你的帮助;我不知道我错过了什么。(请务必让我知道,如果此问题不适合此网站,我将删除它。)

我的代码:

class ViewController: UIViewController {

    let hintButton: UIButton = {
        let button = UIButton()
        button.setTitle("Hint me!", for: .normal)
        button.backgroundColor = .systemBlue
        button.translatesAutoresizingMaskIntoConstraints = false
        button.addTarget(self, action: #selector(buttonPressed), for: .touchUpInside)
        button.layer.cornerRadius = 12
        return button
    }()

    @objc func buttonPressed() {
        let pop = Popup()
        self.view.addSubview(pop)
    }

    var numberOfHintsRequested: Int {
           get {
               return UserDefaults.standard.integer(forKey: "hintsRequestedSaved")
           }
           set {
               UserDefaults.standard.set(newValue, forKey: "hintsRequestedSaved")
           }
       }

    lazy var hintsAskedLabel: UILabel = {
        let label = UILabel()
        label.font = UIFont(name: "American Typewriter", size: 50)
        label.text = String(numberOfHintsRequested)
        label.translatesAutoresizingMaskIntoConstraints = false
        label.textAlignment = .center
        return label
    }()


    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        view.addSubview(hintButton)
        view.addSubview(hintsAskedLabel)

        NSLayoutConstraint.activate([
        hintButton.heightAnchor.constraint(equalToConstant: 80),
        hintButton.widthAnchor.constraint(equalToConstant: 150),
        hintButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
        hintButton.centerYAnchor.constraint(equalTo: view.centerYAnchor),

        hintsAskedLabel.heightAnchor.constraint(equalToConstant: 80),
        hintsAskedLabel.widthAnchor.constraint(equalToConstant: 80),
        hintsAskedLabel.bottomAnchor.constraint(equalTo: hintButton.topAnchor, constant: -180),
        hintsAskedLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor)

    ])

        }
    }
以下是我的观点:

class Popup: UIView {

    fileprivate let showHintButton: UIButton = {
        let button = UIButton()
        button.setTitle("Hint me NOW!!", for: .normal)
        button.backgroundColor = .systemBlue
        button.translatesAutoresizingMaskIntoConstraints = false
        button.addTarget(self, action: #selector(showHintButtonPressed), for: .touchUpInside)
        button.layer.cornerRadius = 12
        return button
    }()

    @objc func showHintButtonPressed() {
        print("ZABOOKA")
        ViewController().numberOfHintsRequested += 1
        let text = UserDefaults.standard.object(forKey: "hintsRequestedSaved")
        if let unwrappedText = text {
            ViewController().hintsAskedLabel.text = unwrappedText as? String
        } else {
         print("NEHEHEHE")
        }
        print(ViewController().numberOfHintsRequested)
        self.containerDisappear()
    }

    fileprivate let container: UIView = {
        let v = UIView()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.backgroundColor = .white
        v.layer.cornerRadius = 24
        return v
    }()

    @objc fileprivate func containerDisappear() {
            self.alpha = 0
    }

    @objc fileprivate func containerAppear() {
        self.alpha = 1
    }

    override init(frame: CGRect) {
        super.init(frame: frame)

        self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(containerDisappear)))
        self.backgroundColor = UIColor.gray
        self.backgroundColor?.withAlphaComponent(0.8)
        self.frame = UIScreen.main.bounds
        self.addSubview(container)

        container.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
        container.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
        container.widthAnchor.constraint(equalTo: self.widthAnchor, multiplier: 0.7).isActive = true
        container.heightAnchor.constraint(equalTo: self.heightAnchor, multiplier: 0.45).isActive = true

        container.addSubview(showHintButton)
        showHintButton.leadingAnchor.constraint(equalTo: container.leadingAnchor).isActive = true
        showHintButton.trailingAnchor.constraint(equalTo: container.trailingAnchor).isActive = true
        showHintButton.centerYAnchor.constraint(equalTo: container.centerYAnchor).isActive = true
        showHintButton.heightAnchor.constraint(equalTo: container.heightAnchor, multiplier: 0.15).isActive = true

        containerAppear()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("BAD")
    }
}

问题是每次都要创建一个新的
ViewController
对象。最好使用代理将此更改传达给您现有的
ViewController
参考

您可以在此处了解有关委托模式和协议的更多信息:

范例

protocol PopupDelegate: class {
    func popupViewDidTapActionButton(_ popup: Popup)
}

class Popup: UIView {

    weak var delegate: PopupDelegate?

    @objc func showHintButtonPressed() {
        delegate?.popupViewDidTapActionButton(self)
    }
}

class MyController: UIViewController {

    func showpopUp() {
        let pop = Popup()
        pop.delegate = self
    }
}

extension MyController: PopupDelegate {

    func popupViewDidTapActionButton(_ popup: Popup) {
        //UPDATE YOUR UI
    }
}

你犯了一个很常见的错误

ViewController()
的任何调用都会创建视图控制器的全新实例,在
showHintButtonPressed
中,您将创建三个不同的实例

一个快速的解决方案是回调闭包

弹出窗口中
添加属性

var callback : (() -> Void)?
替换

@objc func showHintButtonPressed() {
    print("ZABOOKA")
    ViewController().numberOfHintsRequested += 1
    let text = UserDefaults.standard.object(forKey: "hintsRequestedSaved")
    if let unwrappedText = text {
        ViewController().hintsAskedLabel.text = unwrappedText as? String
    } else {
     print("NEHEHEHE")
    }
    print(ViewController().numberOfHintsRequested)
    self.containerDisappear()
}

另一个错误是,您正在
ViewController
中将
Int
保存到
UserDefaults
,并将其作为
字符串
检索将始终失败


视图控制器中
更换

@objc func buttonPressed() {
    let pop = Popup()
    self.view.addSubview(pop)
}


您问题的标题是“当试图将日期从UIView传递到UIViewController时,我犯了什么错误?”。你的意思是问传递数据,而不是日期吗?@Duncac,谢谢你指出这一点。最好使用一个代表。我不同意,不是在斯威夫特。我很想听听你的想法,为什么不?(如果这不是最好的论坛,我理解,如果是的话,我道歉)简短回答:一个本地的Swift模式比一个必须像往常一样接受客观的优秀答案的模式更有效。(投票)。其他人则暗示了OPs代码的各种问题。在看到你的答案之前,我正准备发布一个更完整的答案。您涵盖了我要说的所有内容,并使用闭包提供了一个优雅的解决方案。
@objc func buttonPressed() {
    let pop = Popup()
    self.view.addSubview(pop)
}
@objc func buttonPressed() {
    let pop = Popup()
    pop.callback = { 
        var numberOfHints = self.numberOfHintsRequested
        numberOfHints += 1
        self.hintsAskedLabel.text = String(numberOfHints)
        self.numberOfHintsRequested = numberOfHints
    }
    self.view.addSubview(pop)
}