Как я могу использовать TypedRowControllerType для создания пользовательской строки презентатора в Eureka 4.3? - PullRequest
0 голосов
/ 08 декабря 2018

Я перевожу старый проект на Swift 4, поэтому, естественно, я также обновился до Eureka 4.3.

В старом проекте есть пользовательская строка с именем LatitudeSelectorRow, которая представляет LatitudeSelectorController.

LatitudeSelectorRow раньше выглядело так:

final class LatitudeSelectorRow: SelectorRow<PushSelectorCell<CLLocationDegrees>, LatitudeSelectorController> {
    required init(tag: String?, _ initializer: ((LatitudeSelectorRow) -> ())) {
        super.init(tag: tag)
        initializer(self)

        // Focus on here!!
        presentationMode = PresentationMode.show(controllerProvider: ControllerProvider.storyBoard(storyboardId: "LatitudeSelector", storyboardName: "Main", bundle: nil), completionCallback: {
            _ in
        })
        displayValueFor = {
            ...
        }
    }

    required convenience init(tag: String?) {
        self.init(tag: tag)
    }
}

И LatitudeSelectorController выглядело так:

class LatitudeSelectorController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, TypedRowControllerType {

    /// A closure to be called when the controller disappears.
    public var onDismissCallback: ((UIViewController) -> ())?

    @IBOutlet var latitudePicker: UIPickerView!
    var row: RowOf<CLLocationDegrees>!
    var completionCallback: ((UIViewController) -> ())?
    ...

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        let degrees = latitudePicker.selectedRow(inComponent: 0)
        let minutes = latitudePicker.selectedRow(inComponent: 1)
        let seconds = latitudePicker.selectedRow(inComponent: 2)
        let negative = latitudePicker.selectedRow(inComponent: 3) == 1
        self.row?.value = (Double(degrees) + Double(minutes) / 60.0 + Double(seconds) / 3600.0) * (negative ? -1 : 1)
    }

В Eureka 4.3 это перестало работать.Это дает мне ошибку, говоря, что LatitudeSelectorController не может быть преобразован в SelectorViewController.

Я попытался обойти это путем изменения PresentationMode:

presentationMode = PresentationMode.segueName(segueName: "selectLatitude", onDismiss: nil)

VCуспешно показано, но я заметил, что свойство row равно nil.Это означает, что независимо от того, что я выберу в VC, значение строки не будет изменено.

Я также пытался заставить LatitudeSelectorController наследовать от SelectorRowController:

class LatitudeSelectorController: SelectorViewController<SelectorRow<PushSelectorCell<Double>>>

и вернулся к использованию PresentationMode.show.

На этот раз row не ноль, но весь VC покрыт некоторым видом спереди, что делает мой вид сборщика невидимым:

enter image description here

Как создать собственную строку докладчика в Eureka 4.3?Могу ли я больше не использовать TypedRowControllerType?

1 Ответ

0 голосов
/ 14 декабря 2018

Здесь вы можете создать и связать две строки push

<<< PushRow<String>() {
            $0.title = "Title"
            $0.tag = "title"
            $0.options = ["test"]//array values
            $0.value = ""
            $0.selectorTitle = "Choose title"
            $0.onChange { [unowned self] row in
                if row.value != nil{
                    //generate options here for second push row
                }
            }
            }.onPresent { from, to in
                to.dismissOnSelection = true
                to.dismissOnChange = true
            }

<<< PushRow<String>() { row in
            row.title = "new"
            row.selectorTitle = "Choose new"
            row.optionsProvider = .lazy({ (formViewController, completion) in
                row.options = //give new options here
                completion(row.options)
            })
            }.onPresent { from, to in
                to.dismissOnSelection = true
                to.dismissOnChange = true
                to.selectableRowCellUpdate = { cell, row in
                   //get the selected value here(row.selectableValue!) // customization
                }
            }
...