通过协议传递数据时,我在做什么错

时间:2019-04-05 02:37:07

标签: ios swift protocols

我正在尝试在viewControllers之间传递数据,但似乎有些问题。

我想将“布尔”设置为协议功能的第一个viewController以便能够在另一个屏幕中恢复。我在做错什么,我总是使用协议,但这次遇到了麻烦。

这就是我的做法:

//
//  ComboBoxNode.swift
//

import Foundation
import SWXMLHash


protocol ComboBoxNodeDelegate {
    func getCustomOption(data:Bool)
}

class ComboBoxNode: FormControlNode, IFormControlDataSource {


    var listType: String?
    var dataSource: String?
    var dataSourceValue: String?
    var dataSourceText: String?
    var hasCustomOption:Bool?
    var customOptionText: String?
    var ctrlDataSourceType: String?
    var parameters = [ParameterNode]()
    var staticList: FormControlStaticListNode?

    var delegate:ComboBoxNodeDelegate?

    override init(indexer: XMLIndexer) {
        super.init(indexer: indexer)

        guard let element = indexer.element else {
            preconditionFailure("Error")
        }


        let isCustomOption = element.bool(by: .hasCustomOption) ?? hasCustomOption

        if isCustomOption == true {
            self.delegate?.getCustomOption(data: hasCustomOption!)
        }


        self.readFormControlDataSource(indexer: indexer)
    }

    override func accept<T, E: IViewVisitor>(visitor: E) -> T where E.T == T {
        return visitor.visit(node: self)
    }
}

这就是我要在下一个屏幕上恢复的方式:

//  FormPickerViewDelegate.swift

import Foundation
import ViewLib
import RxSwift

class FormPickerViewDelegate: NSObject {

    var items = Variable([(value: AnyHashable, text: String)]()) {
        didSet {
            PickerNodeDelegate = self
            self.setDefaultValues()
        }
    }

    private var controlViewModel: FormControlViewModel
    private var customText:Bool?

    private var PickerNodeDelegate:ComboBoxNodeDelegate?

    init(controlViewModel: FormControlViewModel) {
        self.controlViewModel = controlViewModel
    }

    func getItemByValue(_ value: Any) -> (AnyHashable, String)? {

        if value is AnyHashable {
            let found = items.value.filter {$0.value == value as! AnyHashable}
            if found.count >= 1 {
                return found[0]
            }
        }

        return nil
    }
}


extension FormPickerViewDelegate:ComboBoxNodeDelegate {
    func getCustomOption(data: Bool) {
        customText = data
    }
}

3 个答案:

答案 0 :(得分:0)

不是在ThemeManager闭包中设置PickerNodeDelegate = self

didSet {}

将其分配给您的init()函数

   var items = Variable([(value: AnyHashable, text: String)]()) {
        didSet {
            PickerNodeDelegate = self
            self.setDefaultValues()
        }
    }

请注意,您还应该声明您的委托人为 init(controlViewModel: FormControlViewModel) { self.controlViewModel = controlViewModel PickerNodeDelegate = self } ,因为它是委托人,所以您的协议应符合类类型才能被削弱。

weak

答案 1 :(得分:0)

这里是一个例子,希望对您有所帮助!

protocol ComboBoxNodeDelegate {
    func getCustomOption(data:Bool) -> String 
}

class ViewOne:ComboBoxNodeDelegate {
    var foo:Bool = false
    var bar:String = "it works!"

    /** Return: String */
    func getCustomOption(data:Bool) -> String { //conform here to protocol
          // do whatever you wanna do here ...example
          self.foo = data // you can set
          return bar // even return what you want

    }

    //initialize
    func initalizeViewTwo() {
         let v2 = ViewTwo()
         v2.delegate = self //since `self` conforms to the ComboBoxNodeDelegate protcol you are allowed to set
    }


}

class ViewTwo { 
    var delegate:ComboBoxNodeDelegate?

    func getCustomOption_forV1() {
        let view2_foo = delegate.getCustomOption(data:true)
        print(view2_foo) // should print "it works!"
    } 
}

答案 2 :(得分:-1)

在Swift中传递的所有参数都是常量-因此您无法更改它们。

如果要在函数中进行更改,则必须声明您的协议以inout通过引用传递:

protocol ComboBoxNodeDelegate {
    func getCustomOption(data: inout Bool)
}

注意:您不能将常量(let)传递给此函数。它必须是一个变量-我认为您正在这样做!