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