Firebase 在更改文本值后恢复文本字段中的初始值
Firebase restoring initial values in textfields after changing text value
我正在使用 Firebase 练习 iOS (Swift)。第一个 viewcontroller 从 firebase db 检索所有记录并从数组填充 tableView。当用户从该表视图中选择一个项目时,会弹出一个新的 viewcontroller,将对象从列表视图 viewcontroller 转到详细信息 viewcontroller。数据已成功填充到字段中!
然而,当我尝试更新任何文本字段时,当我切换到另一个文本字段时,初始值会在编辑的文本字段中恢复。
我已经尝试删除所有观察者...但没有任何效果。我什至删除了 "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)";
}
}
}
谢谢大家的帮助。
这可能是因为您将 textField 填充代码放在 viewDidLayoutSubviews() 方法中。
每当 viewcontroller.
中的视图布局发生变化时,都会触发此方法
将其移动到 viewDidLoad() 应该没问题。
它被恢复到以前的值的原因是因为。您正在从 "ingredient" 对象填充 textField.text。该成分将保留您从以前的视图控制器传递的相同值。直到你在某个时候改变它。
顺便说一句,Firebase 非常酷,我也喜欢它:)
我正在使用 Firebase 练习 iOS (Swift)。第一个 viewcontroller 从 firebase db 检索所有记录并从数组填充 tableView。当用户从该表视图中选择一个项目时,会弹出一个新的 viewcontroller,将对象从列表视图 viewcontroller 转到详细信息 viewcontroller。数据已成功填充到字段中!
然而,当我尝试更新任何文本字段时,当我切换到另一个文本字段时,初始值会在编辑的文本字段中恢复。
我已经尝试删除所有观察者...但没有任何效果。我什至删除了 "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)";
}
}
}
谢谢大家的帮助。
这可能是因为您将 textField 填充代码放在 viewDidLayoutSubviews() 方法中。 每当 viewcontroller.
中的视图布局发生变化时,都会触发此方法将其移动到 viewDidLoad() 应该没问题。
它被恢复到以前的值的原因是因为。您正在从 "ingredient" 对象填充 textField.text。该成分将保留您从以前的视图控制器传递的相同值。直到你在某个时候改变它。
顺便说一句,Firebase 非常酷,我也喜欢它:)