Swift NavigationBar 按"Back" 获取值,为什么?
Swift NavigationBar Press "Back" to get values, why?
我正在使用一些值来执行一些计算。出于测试目的,我在 Label1 中将值显示为字符串,因为它存储为字符串,而在 Label2 中,我将转换值显示为 Double,因为我在计算的最后需要它们作为双精度值。
奇怪的是,当我第一次访问 ViewController 时,它没有显示任何值。但是,如果我返回并使用导航控制器再次点击它,它就会正常工作。但是我马上就需要这些值,因为我的初衷正如我所说,不是显示一些标签,而是用它进行一些计算。
我制作了一个小 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()
}
}
难道是因为全局变量?我知道这不是正确的方法,但出于我的目的,它绝对“没问题”
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]: https://i.stack.imgur.com/VKxaE.png
您正在控制器 viewWillAppear
中调用 UserService
的 ahpPref
。但是您正在尝试将 valueA
(globaLajkpXc
的值)添加到控制器 viewDidLoad
的标签中。
那是什么意思呢?您知道这两个控制器的生命周期方法中的哪一个被调用以及它们何时被调用吗?
为解决您的问题,让您的标签赋值代码
label1.text = globaLajkpXc
移入 ahpPref
的完成块(在 viewWillAppear
中)。
这是 Apple 关于 UIViewController 生命周期的文档:https://developer.apple.com/library/archive/referencelibrary/GettingStarted/DevelopiOSAppsSwift/WorkWithViewControllers.html
另外,在这一行下面:globaLajkpXqpa = ajkpXqpa ?? "no Value"
添加你的完成调用,例如:
completion([ahpPrios])
.
这应该使我的上述回答有效。
我正在使用一些值来执行一些计算。出于测试目的,我在 Label1 中将值显示为字符串,因为它存储为字符串,而在 Label2 中,我将转换值显示为 Double,因为我在计算的最后需要它们作为双精度值。
奇怪的是,当我第一次访问 ViewController 时,它没有显示任何值。但是,如果我返回并使用导航控制器再次点击它,它就会正常工作。但是我马上就需要这些值,因为我的初衷正如我所说,不是显示一些标签,而是用它进行一些计算。
我制作了一个小 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()
}
}
难道是因为全局变量?我知道这不是正确的方法,但出于我的目的,它绝对“没问题”
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]: https://i.stack.imgur.com/VKxaE.png
您正在控制器 viewWillAppear
中调用 UserService
的 ahpPref
。但是您正在尝试将 valueA
(globaLajkpXc
的值)添加到控制器 viewDidLoad
的标签中。
那是什么意思呢?您知道这两个控制器的生命周期方法中的哪一个被调用以及它们何时被调用吗?
为解决您的问题,让您的标签赋值代码
label1.text = globaLajkpXc
移入 ahpPref
的完成块(在 viewWillAppear
中)。
这是 Apple 关于 UIViewController 生命周期的文档:https://developer.apple.com/library/archive/referencelibrary/GettingStarted/DevelopiOSAppsSwift/WorkWithViewControllers.html
另外,在这一行下面:globaLajkpXqpa = ajkpXqpa ?? "no Value"
添加你的完成调用,例如:
completion([ahpPrios])
.
这应该使我的上述回答有效。