2016-05-02 4 views
0

FirebaseでiOS(Swift)を練習しています。最初のviewcontrollerはfirebase dbからすべてのレコードを取り出し、配列からtableViewに移入します。ユーザがそのテーブルビューからアイテムを選択すると、新しいビューコントローラが、オブジェクトをリストビュービューコントローラからディテールビューコントローラにセグをポップアップする。データはフィールドに正常に取り込まれます!Firebaseはテキスト値を変更した後のテキストフィールドの初期値を復元します

しかし、テキストフィールドのいずれかを更新しようとすると、別のテキストフィールドに切り替わると、編集されたテキストフィールドに初期値が復元されます。

AllObserversを削除しようとしましたが、何も機能しませんでした。私も "インポート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)"; 
     } 
    } 
} 

ありがとうございましたすべてあなたの助けになります。

答えて

0

これはおそらく、あなたのtextFieldにコードを設定するのは、viewDidLayoutSubviews()メソッドにあるからです。 このメソッドは、ビューのレイアウトがビューコントロールで変更されるたびにトリガーされます。

viewDidLoad()に移動してください。これで問題はありません。

以前の値に戻す理由は、次の理由によるものです。 「成分」オブジェクトからtextField.textを入力しています。成分は、以前のビューコントローラーから渡されたものと同じ値が保持されます。ある時点でそれを突然変異させるまで。

そしてFirebaseは非常にクールな方法で、私はあまりにもそれが好き:)

+0

おかげでたくさん、私はviewDidLayoutSubviews方法についてということを知りませんでした。私はビューのサイズを変更しない場合でも、それはどのように実行されるか、値はメソッドをトリガーするとも考えられますか? – Maz

+0

多くのビューの変更は、textFieldをアクティブにすると発生します。私は具体的にどのようなものかはわかりませんが、複数のビューレイアウトに影響します。テキストフィールド、キーボードなどのカーソル –

関連する問題