Swift NavigationBar Нажмите «Назад», чтобы получить значения, почему? - PullRequest
2 голосов
/ 14 июля 2020

Я использую некоторые значения для выполнения некоторых расчетов. В целях тестирования я показываю в Label1 значение как строку, поскольку оно хранится как строка, а в Label2 я показываю приведенное значение как Double, поскольку они мне нужны в конце как двойники для моих вычислений.

странно то, что когда я обращаюсь к ViewController в первый раз, он не показывает никаких значений. Но если я go вернусь и снова нажму на него с помощью контроллера навигации, это действительно сработает. Но мне нужны значения сразу, потому что мое первоначальное намерение, как я уже сказал, состоит в том, чтобы не показывать какие-то ярлыки, а скорее делать с ними некоторые вычисления.

Я сделал небольшой гиф, чтобы показать вам, в чем проблема, но у меня есть проблема с добавлением фото. В основном происходит то, что я нажимаю на ViewController с метками, и ничего не отображается. Я go назад и снова нажимаю, и значения будут отображаться на этикетках.

Почему это так и как это можно сразу показать / сразу использовать для вычислений

Спасибо за Помогите. :)

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

1 Ответ

1 голос
/ 14 июля 2020

Вы вызываете UserService ahpPref в viewWillAppear вашего контроллера. НО вы пытаетесь поместить свое valueA (globaLajkpXc значение) на свой ярлык в viewDidLoad.

вашего контроллера. Что это значит? Знаете ли вы, какой из этих двух методов жизненного цикла контроллера вызывается и когда они вызываются?

Чтобы решить вашу проблему, пусть ваша метка присвоит код значения

label1.text = globaLajkpXc

переместите в завершение блок вашего ahpPrefviewWillAppear).

Вот документация Apple о жизненном цикле UIViewController: https://developer.apple.com/library/archive/referencelibrary/GettingStarted/DevelopiOSAppsSwift/WorkWithViewControllers.html

Также под этой строкой: globaLajkpXqpa = ajkpXqpa ?? "no Value"

добавьте вызов завершения, например:

completion([ahpPrios]).

Это должно заставить мой ответ выше работать.

...