2016-07-18 15 views
2

Ich habe Probleme, ein benutzerdefiniertes Objekt in Eureka Form zu verwenden, ich versuche, die Objekte aus einem Rest Service zu laden, ich benutze Alamofire, um die Optionen zu erhalten, Im mit Zeile .options.append die Daten zu füllen, und wenn ich die Zelle wählen erhalte ich einen Fehler Assertionsfehler: doppelten Tag GebäudePushRow mit benutzerdefiniertem Objekt mit Eureka Forms

hier ist meine Klasse, die

class Building: Mappable, Equatable { 
    var name_building: String? 
    var id_building: Int? 

    required init?(){ 
    } 

    required init?(_ map: Map){ 
    } 

    func mapping(map: Map) { 
     id_building <- map["id_building"] 
     name_building <- map["name_building"] 
    } 
} 

func == (lhs: Building, rhs: Building) -> Bool { 
    return lhs.id_building == rhs.id_building 
} 

zum gleichzusetzen Protokoll entspricht und hier ist die Formular

import UIKit 
import Eureka 
import CoreLocation 
import Alamofire 
import KeychainAccess 
import ObjectMapper 
import SnapKit 

class UserViewController: FormViewController { 


    override func viewDidLoad() { 
     super.viewDidLoad() 


     self.title = "Perfil del Usuario" 

     // Do any additional setup after loading the view. 
     form +++ Section("Datos Generales") 
      <<< NameFloatLabelRow("kName") { 
       $0.title = "Nombre" 
      } 
      <<< TextFloatLabelRow("kLastName") { 
       $0.title = "Apellidos" 
      } 
      <<< TextFloatLabelRow("kPhone") { 
       $0.title = "Teléfono" 
      } 
      <<< TextFloatLabelRow("kEmail") { 
       $0.title = "Email" 
       $0.disabled = true; 
      } 
      <<< SegmentedRow<String>("kGenre") { 
       $0.title = "Genero" 
       $0.options = ["Masculino", "Femenino"] 
      } 
      <<< CheckRow("kRider") { 
       $0.title = "¿Estoy dispuesto a dar Aventones?" 
       $0.value = true 
      } 

      +++ Section("Casa") 
      <<< LocationRow("kHome"){ 
       $0.title = "Casa" 
       $0.value = CLLocation(latitude: -34.91, longitude: -56.1646) 
      } 
      <<< TimeInlineRow("kHomeDepartureTime"){ 
       $0.title = "Hora de Salida" 
       $0.value = NSDate() 
      } 
      +++ Section("Trabajo") 
      <<< PushRow<Building>("kBuilding") { 
       $0.title = "Edificio" 
       $0.selectorTitle = "Donde Trabajas?" 
      } 
      <<< TimeInlineRow("kEnterTime"){ 
       $0.title = "Hora de Entrada" 
       $0.value = NSDate() 
      } 
      <<< TimeInlineRow("kExitTime"){ 
       $0.title = "Hora de Salida" 
       $0.value = NSDate() 
      } 
      +++ Section() 
      <<< ButtonRow() { (row: ButtonRow) -> Void in 
       row.title = "GUARDAR" 
       } .onCellSelection({ (cell, row) in 
        print("Salvando Informacion") 
        let nameRow: NameFloatLabelRow! = self.form.rowByTag("kName") 
        let lastNameRow: TextFloatLabelRow! = self.form.rowByTag("kLastName") 
        let phoneRow: TextFloatLabelRow! = self.form.rowByTag("kPhone") 
        let emailRow: TextFloatLabelRow! = self.form.rowByTag("kEmail") 
        let genreRow: SegmentedRow<String>! = self.form.rowByTag("kGenre") 
        let riderRow: CheckRow! = self.form.rowByTag("kRider") 
        let locationRow: LocationRow! = self.form.rowByTag("kHome") 
        let homeDepartureTimeRow: TimeInlineRow! = self.form.rowByTag("kHomeDepartureTime") 
        let buildingRow: PushRow<Building>! = self.form.rowByTag("kBuilding") 
        let buildingEnterTimeRow: TimeInlineRow! = self.form.rowByTag("kEnterTime") 
        let buildingExitTimeRow: TimeInlineRow! = self.form.rowByTag("kExitTime") 

        let user = User() 

        user.email = emailRow.value 
        user.name = nameRow.value 
        user.lastName = lastNameRow.value 
        user.genre = genreRow.value 
        user.phone = phoneRow.value 
        user.id_type = riderRow.value == true ? 1 : 2 
        user.homeDepartureDate = homeDepartureTimeRow.value 
        user.jobEnterTime = buildingEnterTimeRow.value 
        user.jobExitTime = buildingExitTimeRow.value 
        user.id_building = 3 

        let location = locationRow.value! as CLLocation 
        user.latitude = location.coordinate.latitude 
        user.longitude = location.coordinate.longitude 

        let JSONString = Mapper().toJSONString(user, prettyPrint: false) 
        let mappedObject = Mapper<User>().map(JSONString) 


        let request = "requesttoCreateUser" 

        Alamofire.request(.POST, request, parameters: Mapper().toJSON(user), encoding: .JSON) 
         .validate() 
         .responseJSON { response in 
          switch response.result { 
          case .Success: 
           print("Validation Successful") 
          case .Failure(let error): 
           print(error) 
          } 
        } 

       }) 

     self.getBuilding(); 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func getBuilding(){ 
     let buildingRow: PushRow<Building>! = self.form.rowByTag("kBuilding") 

     let request = "requestToGetBuildings" 

     Alamofire.request(.GET, request).responseArray { (response: Response<[Building], NSError>) in 

      let buildingsArray = response.result.value 

      if let buildingsArray = buildingsArray { 
       for building in buildingsArray { 
        buildingRow.options.append(building) 
       } 
      } 
     } 
    } 

} 

Und es stürzt hier in der Eureka Klasse BaseRow.swift

final func wasAddedToFormInSection(section: Section) { 
     self.section = section 
     if let t = tag { 
      assert(section.form?.rowsByTag[t] == nil, "Duplicate tag \(t)") 
      self.section?.form?.rowsByTag[t] = self 
      self.section?.form?.tagToValues[t] = baseValue as? AnyObject ?? NSNull() 
     } 
     addToRowObservers() 
     evaluateHidden() 
     evaluateDisabled() 
    } 
+0

Normalerweise Dies passiert, wenn Sie ein anderes Tag mit '" kName "' oder '" kLastName "' oder "kBuilding" haben, da der Fehler "Duplicate tag" lautet. Können Sie überprüfen, ob Sie keine weitere Zelle mit einem dieser Namen hinzufügen? –

+0

Nein, ich habe keine doppelten Tags, ich habe bereits zweimal überprüft – Angel

+0

können Sie alle Ihre ViewController Code? –

Antwort

1

Wie here erwähnt.

Alles, was Sie tun müssen, ist Ihr Modell CustomStringConvertible Protokoll anzupassen. Diese

ist, da die Standardimplementierung von SelectorViewController verwendet String (Option) als Tag für Ihre PushRow Reihen

So sollte Ihre Klasse wie folgt aussehen:

class Building: Mappable, Equatable,CustomStringConvertible { 
    var name_building: String? 
    var id_building: Int? 
    var description: String { 

     return name_building 
    } 
    required init?(){ 
    } 

    required init?(_ map: Map){ 
    } 

    func mapping(map: Map) { 
     id_building <- map["id_building"] 
     name_building <- map["name_building"] 
    } 
} 

func == (lhs: Building, rhs: Building) -> Bool { 
    return lhs.id_building == rhs.id_building 
} 
Verwandte Themen