На самом деле IntRow
и TextRow
строки будут принимать только тип, определенный для их ячеек , как показано ниже,
open class IntCell: _FieldCell<Int>, CellType
open class TextCell: _FieldCell<String>, CellType
это причина, по которой вам нужно извлечь значение из вашего IntOrString
перечисления type
, чтобы присвоить соответствующему cell's
row
.
Если вы хотите иметь строку, которая принимает ваш тип (IntOrString
), тогда вы должны согласовать свой новый тип с Equatable
как eureka cell
с типами допустимых значений, которые соответствуют Equatable
. Что-то, как показано ниже,
enum IntOrString: Codable, Equatable
Затем вы должны добавить новый cell
с create xib file
, как отмечено, для создания вашего пользовательского view
, показанного ниже,
А затем вы можете обновить IntOrStringTableViewCell
, как показано ниже,
import UIKit
import Eureka
class IntOrStringTableViewCell: Cell<IntOrString>, CellType {
@IBOutlet private weak var valueLabel: UILabel!
override func setup() {
super.setup()
self.updateValue()
}
override func update() {
super.update()
self.updateValue()
}
private func updateValue() {
guard let value = self.row.value else { return }
if case .integer(let int) = value {
self.valueLabel.text = "\(int)"
} else if case .string(let string) = value {
self.valueLabel.text = string
}
}
}
final class IntOrStringRow: Row<IntOrStringTableViewCell>, RowType {
required init(tag: String?) {
super.init(tag: tag)
self.cellProvider = CellProvider<IntOrStringTableViewCell>(nibName: "IntOrStringTableViewCell", bundle: Bundle.main)
}
}
Теперь, когда вы будете использовать эту строку, вы сможете назначить значение IntOrString
без каких-либо приведений
form +++ Section ("Values")
// dynamically generates rows
for values in defaultValueHolder {
form.last! <<< IntOrStringRow() {
$0.tag = values.name
$0.title = values.name
$0.value = values.IntOrString
}