【问题标题】:Swift NavigationBar Press "Back" to get values, why?Swift NavigationBar 按“返回”获取值,为什么?
【发布时间】:2020-11-03 19:56:31
【问题描述】:

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

可能是因为 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]: https://i.stack.imgur.com/VKxaE.png

【问题讨论】:

  • 我试图完全按照您所说的去做。 ```` override func viewDidLoad() { super.viewDidLoad() UserService.ahpPref(for: User.current) { (ahpPrios) in self.ahpPrios = ahpPrios print("This is our AHP PRIOS", ahpPrios) } self. label1.text = self.valueA self.label2.text =“(字符串(描述:self.valueB))”}````

标签: ios swift uinavigationcontroller viewcontroller viewwillappear


【解决方案1】:

您正在控制器的viewWillAppear 中调用UserServiceahpPref。但是您正试图将您的valueAglobaLajkpXc 的值)放入控制器的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]).

这应该使我的回答有效。

【讨论】:

  • 我按照你说的做了,结果没有
  • 查看我的编辑。在您的服务中添加完成调用。
  • 感谢您的回答,并对那个奇怪的评论感到抱歉。我以为我删除了它,今天早上想写一个合适的;)。我会尝试你所说的,但我仍然只能在重新加载情节提要时获得值。任何其他提示为什么这可能是问题?如果不是我当然会接受你的回答:)
  • 当然。我认为没有其他方法可以解决您的问题。我再次编辑了上面的答案。我犯了一个错误,valueA 是一个常量,它只获得一个值...重申解决方案和我在您的问题中发现的问题,首先,在您的 viewWillAppear 中执行label.text = globaLajkpXc 在打印语句之后在完成块内。然后在您的static func ahpPref 中调用完成。这现在应该真的让它工作了。
  • 谢谢!它真的奏效了!感谢您一直关注这个问题;)祝您有美好的一天!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-10
  • 1970-01-01
  • 2016-11-02
  • 2015-05-11
  • 2021-09-30
  • 2013-09-01
  • 2013-11-13
相关资源
最近更新 更多