Swift: невозможно назначить возвращаемое значение функции для UILabel - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть ситуация, когда строка, возвращенная из вызова функции, присваивается тексту UILabel. Однако UILabel содержит пустое значение. Если бы я был назначить статическую строку, а именно. «Это тестирование» на UILabel напрямую работает. Внутри функции я могу напечатать возвращаемое значение

import Foundation
import Firebase
import UIKit
class checkLocation{
    var items = [addedItems]()

    func getLocationOfItem(textFieldText: (String)) -> String{
            let itemLet = addedItems()
            var location = ""
                   Database.database().reference().child("item").observe(.childAdded, with: { (snapshot) in

                       if let dictionary = snapshot.value as? [String: AnyObject]{

                           //itemLet.setValuesForKeys(dictionary)

                           itemLet.itemName = dictionary["itemName"] as? String
                           itemLet.itemLocation = dictionary["itemLocation"] as? String
                           itemLet.itemImageUrl = dictionary["itemImageUrl"] as? String
                           itemLet.itemTS = dictionary["itemTS"] as? String
                           itemLet.id = dictionary["id"] as? String


                         if(textFieldText == itemLet.itemName){
                            location = itemLet.itemLocation!
                            print(location)

                        }
                       }

                   }, withCancel: nil)

        return location
        }

}

Вызов программы

import UIKit
import Firebase

class checkLocationViewController: ViewController {


            @IBOutlet weak var itemNameInLctn: UITextField!
            @IBOutlet weak var itemLocationLbl: UILabel!


             var items = [addedItems]()

             var strLocation = "";

               override func viewDidLoad() {
                   super.viewDidLoad()
                   refItems = Database.database().reference().child("item")                   
               }


               @IBAction func getLocation(_ sender: UIButton) {                

                self.strLocation = checkLocation().getLocationOfItem(textFieldText: itemNameInLctn.text!)

                itemLocationLbl.text = strLocation

                //itemLocationLbl.text = strLocation

                    //print(itemNameInLctn.text)


               }

}

Любая помощь?

1 Ответ

0 голосов
/ 04 ноября 2019

func getLocationOfItem(textFieldText: (String)) -> String правильно возвращает location с начальным значением "".

Проблема, с которой вы сталкиваетесь, заключается в том, что вы вызываете асинхронную задачу из firebase внутри функции синхронизацииcall.

Вы можете реорганизовать вызов метода для асинхронного возврата требуемой строки, сделав следующие изменения:

func getLocationOfItem(textFieldText: String, completion: @escaping (_ itemLocation: String?) -> Void){
    let itemLet = addedItems()
    Database.database().reference().child("item").observe(.childAdded, with: { (snapshot) in

        guard let dictionary = snapshot.value as? [String: AnyObject] else {
            return completion(nil)
        }

        itemLet.itemName = dictionary["itemName"] as? String
        itemLet.itemLocation = dictionary["itemLocation"] as? String
        itemLet.itemImageUrl = dictionary["itemImageUrl"] as? String
        itemLet.itemTS = dictionary["itemTS"] as? String
        itemLet.id = dictionary["id"] as? String

        if(textFieldText == itemLet.itemName){
            completion(itemLet.itemLocation)
        } else {
            completion(nil)
        }

    }, withCancel: nil)

}

/// Usage

@IBAction func getLocation(_ sender: UIButton) {

    guard let itemNameInLocation = itemNameInLctn.text else { return }

    getLocationOfItem(textFieldText: itemNameInLocation) { [weak self] (itemLocation) in
        self?.strLocation = itemLocation
        self?.itemLocationLbl.text = itemLocation
    }
}

Примечание:

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

Пожалуйста, смотрите ссылкуниже для документации об указанном методе:

https://firebase.google.com/docs/database/ios/read-and-write#read_data_once

Если это было ваше намерение, то это лучший выбор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...