ios - Swift NavigationBar 按 "Back"获取值,为什么?

标签 ios swift uinavigationcontroller viewcontroller viewwillappear

我正在使用一些值来执行一些计算。出于测试目的,我在 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

最佳答案

您调用UserServiceahpPref在您的 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/

相关文章:

ios - ViewController_iPad.xib 与 ViewController~ipad.xib

ios - 尝试删除最后一个元素时,带有子项的 SwiftUI (2.0) 列表崩溃

arrays - 如何在 iOS swift 中的字符串数组中查找子字符串的索引

ios - 如何关闭ModalViewControllerAnimated : YES

推送/弹出第二个 View Controller 后,iOS UI 导致崩溃

ios - UIButton 隐藏但工作

android - 保护移动应用程序调用的 API

ios - NSDateComponentsFormatter future 时间 +1.998730003833771 结果为 "1 second"字符串

ios - 如何在 segue 之前更新选定的行?

swift - 在将 Swift 2 转换为 Swift 3 期间寻找 "pointee"的替代品时出现问题