gpt4 book ai didi

swift - 带自定义对象的 PushRow 和 Eureka 表单

转载 作者:搜寻专家 更新时间:2023-10-31 22:45:47 33 4
gpt4 key购买 nike

我在使用 Eureka Form 中的自定义对象时遇到问题,我正在尝试从 Rest 服务加载对象,我正在使用 Alamofire 获取选项,我正在使用 row.options.append 来填充数据,当我选择单元格时,出现错误断言失败:重复标记构建

这是我的类,它符合 Equatable 协议(protocol)

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

最佳答案

如前所述here .

您需要做的就是使您的模型符合 CustomStringConvertible 协议(protocol)。

This is because the default implementation of SelectorViewController uses String(option) as the tag for your PushRow rows

所以你的类应该是这样的:

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
}

关于swift - 带自定义对象的 PushRow 和 Eureka 表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38447228/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com