我正在使用一些值来执行一些计算。出于测试目的,我在 Label1 中将值显示为字符串,因为它存储为字符串,而在 Label2 中,我将转换后的值显示为 Double,因为最后我需要将它们作为 double 数进行计算。
奇怪的是,当我第一次访问 ViewController 时,它没有显示任何值。但是,如果我返回并使用导航 Controller 再次单击它,它实际上可以工作。但是我需要这些值,因为我的初衷正如我所说的那样,不显示一些标签,而是用它进行一些计算。
我制作了一个小 gif 来向您展示问题所在,但我在添加照片时遇到了问题。基本上发生的情况是,我单击带有标签的 ViewController 并且没有显示任何内容。我返回并再次按下,值将显示在标签中。
为什么会这样以及如何立即显示/立即用于计算
谢谢您的帮助。 :)
class AHPfinalPreferencesViewController: UIViewController {
var ahpPrios = [AHPPriorityStruct]()
let decoder = JSONDecoder()
@IBOutlet weak var label1: UILabel!
@IBOutlet weak var label2: UILabel!
let ajkpXc = globaLajkpXc
let ajkpXijr = globaLajkpXijr
let valueA = globaLajkpXc
let valueB = Double(globaLajkpXijr)
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
UserService.ahpPref(for: User.current) { (ahpPrios) in
self.ahpPrios = ahpPrios
print("This is our AHP PRIOS", ahpPrios)
for ahpPrio in ahpPrios {
print(ahpPrio)
}
print("this is the global ajk. ", self.ajkpXc)
}
}
override func viewDidLoad() {
super.viewDidLoad()
// Mark: - Get Data
label1.text = valueA
label2.text = "\(String(describing: valueB))"
// MARK: - Set Values for calculation
// setValues()
// ahpCalculation()
}
}
可能是因为 globalVariables 吗?我知道这不是正确的做法,但就我的目的而言,它绝对“没问题”import Foundation
import FirebaseAuth.FIRUser
import FirebaseDatabase
import FirebaseUI
import FirebaseAuth
import CodableFirebase
var globaLajkpXc: String = String()
var globaLajkpXijr: String = String()
var globaLajkpXqpa: String = String()
struct UserService {
static func ahpPref(for user: User, completion: @escaping ([AHPPriorityStruct]) -> Void) {
let ref = Database.database().reference().child("AHPRatings").child(user.uid)
ref.observe(DataEventType.value, with: { snapshot in
guard let value = snapshot.value else { return }
do {
let ahpPrios = try FirebaseDecoder().decode(AHPPriorityStruct.self, from: value)
print(ahpPrios)
// MARK: - lets store the values in the actual constants :)
let ajkpXc = ahpPrios.ajkpXc
let ajkpXijr = ahpPrios.ajkpXijr
let ajkpXqpa = ahpPrios.ajkpXqpa
globaLajkpXc = ajkpXc ?? "no Value"
globaLajkpXijr = ajkpXijr ?? "no Value"
globaLajkpXqpa = ajkpXqpa ?? "no Value"
} catch let error {
print(error)
}
})
}
}
[1]: /image/VKxaE.png
最佳答案
您调用UserService
的ahpPref
在您的 Controller 的 viewWillAppear
.但是你试图把你的 valueA
( globaLajkpXc
的值)到 Controller 的 viewDidLoad
中的标签.
那是什么意思?你知道这两个 Controller 的生命周期方法中的哪一个被调用以及它们何时被调用吗?
为了解决您的问题,让您的标签分配值(value)代码
label1.text = globaLajkpXc
移入您的 ahpPref
的完成 block (在 viewWillAppear
中)。这是 Apple 关于 UIViewController 生命周期的文档:https://developer.apple.com/library/archive/referencelibrary/GettingStarted/DevelopiOSAppsSwift/WorkWithViewControllers.html
此外,在此行下方:
globaLajkpXqpa = ajkpXqpa ?? "no Value"
添加您的完成调用,例如:completion([ahpPrios])
.这应该使我的回答高于工作。
关于ios - Swift NavigationBar 按 "Back"获取值,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62895879/