2016-07-18 5 views
2

У меня возникли проблемы с использованием пользовательского объекта в форме Eureka, я пытаюсь загрузить объекты из службы Rest, я использую Alamofire для получения параметров, Im using row .options.append заполнить данные, и когда я выбираю ячейку я получаю утверждение об ошибке не удалось: Дублированный тег BuildingPushRow с пользовательским объектом с формами Eureka

Вот мой класс, который соответствует Equatable протоколу

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 
} 

и вот Форма

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) 
       } 
      } 
     } 
    } 

} 

И Он врезается здесь в классе Eureka 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

нормально это происходит, когда у вас есть другой тег с «kName» или «kLastName» или «kBuilding», поскольку ошибка говорит «Duplicate tag», вы можете проверить, не добавили ли вы еще одну ячейку с любым из этих имен? –

+0

Nop, у меня нет дубликатов тегов, я уже дважды проверял – Angel

+0

могу ли вы опубликовать весь свой код viewController? –

ответ

1

Как уже упоминалось here.

Все, что вам нужно сделать, это согласовать вашу модель с протоколом CustomStringConvertible.

Это потому, что реализация по умолчанию SelectorViewController использует String (опция) в качестве тега для PushRow строк

Так что ваш класс должен выглядеть следующим образом:

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 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^