如何使用 TypedRowControllerType 在 Eureka 4.3 中创建自定义演示者行?

Posted

技术标签:

【中文标题】如何使用 TypedRowControllerType 在 Eureka 4.3 中创建自定义演示者行?【英文标题】:How can I use TypedRowControllerType to create a custom presenter row in Eureka 4.3? 【发布时间】:2018-12-08 11:18:16 【问题描述】:

我正在将一个旧项目迁移到 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 不是 nil,而是整个 VC 都被前面的某个视图覆盖,使我的选择器视图不可见:

如何在 Eureka 4.3 中创建自定义演示者行?我可以不用TypedRowControllerType了吗?

【问题讨论】:

【参考方案1】:

在这里您可以创建并链接两个推送行

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

【讨论】:

我不明白这是如何回答这个问题的。我的问题是我无法正确展示我的自定义 VC。正如我在问题中所说,它要么因类型转换错误而崩溃,要么我的视图被隐藏在一些奇怪的东西后面。

以上是关于如何使用 TypedRowControllerType 在 Eureka 4.3 中创建自定义演示者行?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?