【问题标题】:Firebase restoring initial values in textfields after changing text valueFirebase 在更改文本值后恢复文本字段中的初始值
【发布时间】:2026-01-28 10:50:01
【问题描述】:

我正在使用 Firebase 练习 iOS (Swift)。第一个 viewcontroller 从 firebase db 中检索所有记录并从数组中填充 tableView。当用户从该表视图中选择一个项目时,会弹出一个新的视图控制器,将对象从 listView 视图控制器转移到详细视图控制器。数据已成功填充到字段中!

但是,当我尝试更新任何文本字段时,当我切换到另一个文本字段时,初始值会在编辑的文本字段中恢复。

我试图删除AllObservers...但没有任何效果。我什至删除了“import Firebase”和所有关联的对象,它仍然恢复了初始值。

我在这里缺少任何概念吗?

这是来自 ListViewController 的代码:

    override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated);

    self.activityIndicator.startAnimating();

    self.observeIngrdUpdates = ref.observeEventType(.Value, withBlock: { (snapshot) in
        self.ingredients.removeAll();

        for child in snapshot.children {
            var nutrition:String = "";
            var type:Int = 0;
            var desc:String = "";
            var img:String = "";
            var name:String = "";
            var price:Double = 0.0;

            if let _name = child.value["IngredientName"] as? String {
                name = _name;
            }

            if let _nutrition = child.value["NutritionFacts"] as? String {
                nutrition = _nutrition;
            }

            if let _type = child.value["IngredientType"] as? Int {
                type = _type;
            }

            if let _desc = child.value["UnitDescription"] as? String {
                desc = _desc;
            }

            if let _img = child.value["IngredientImage"] as? String {
                img = _img;
            }

            if let _price = child.value["IngredientPrice"] as? Double {
                price = _price;
            }

            let ingredient = Ingredient(name: name, type: type, image: img, unitDesc: desc, nutritionFacts: nutrition, price: price);
            ingredient.key = child.key;

            self.ingredients.append(ingredient);

        }
        self.tableView.reloadData();
    })
}

和 PrepareForSegue:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let destinationVC = segue.destinationViewController as! EditIngredientVC;
    if segue.identifier?.compare(SEGUE_EDIT_INGREDIENTS) == .OrderedSame {
        destinationVC.ingredient = ingredients[tableView.indexPathForSelectedRow!.row];
        destinationVC.controllerTitle = "Edit";
    } else if segue.identifier?.compare(SEGUE_ADD_INGREDIENT) == .OrderedSame {
        destinationVC.controllerTitle = "New";
    }
}

这是在 DetailViewController 中填充字段的代码:

override func viewDidLayoutSubviews() {
    lblControllerTitle.text = controllerTitle;
    if controllerTitle?.localizedCaseInsensitiveCompare("NEW") == .OrderedSame {
        self.segVegFru.selectedSegmentIndex = 0;

    } else {

        if ingredient != nil {
            self.txtIngredientName.text = ingredient!.name;
            self.txtUnitDesc.text = ingredient!.unitDesc;
            self.segVegFru.selectedSegmentIndex = ingredient!.typeInt;
            self.txtNutritionFacts.text = ingredient!.nutritionFacts;
            self.txtPrice.text = "\(ingredient!.price)";
        }
    }
}

感谢大家的帮助。

【问题讨论】:

    标签: ios swift firebase firebase-realtime-database swift2.2


    【解决方案1】:

    这可能是因为您将 textField 填充代码放在 viewDidLayoutSubviews() 方法中。 每次视图控制器中视图的布局发生变化时都会触发此方法。

    将它移动到 viewDidLoad() 应该没问题。

    它被恢复为以前的值的原因是因为。您正在从“成分”对象填充 textField.text。该成分将保留与您从先前视图控制器传递的相同值。直到你在某个时候改变它。

    顺便说一句,Firebase 很酷,我也喜欢它:)

    【讨论】:

    • 非常感谢,我不知道 viewDidLayoutSubviews 方法。即使我不更改视图大小,它是如何运行的,还是认为值也会触发该方法?
    • 激活文本字段时会发生许多视图更改。我不知道具体是哪些,但它会影响多个视图布局。 textField、键盘等中的光标