Что я делаю не так при передаче данных через протокол - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь передать данные между viewControllers, но что-то не так.

Первый viewController Я хочу установить "Bool" для функции протокола, чтобы иметь возможность восстановить на другом экране. Что я делаю не так, я всегда использовал протоколы, но в это время у меня были проблемы.

Вот как я это делаю:

//
//  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 голосов
/ 05 апреля 2019

Вместо установки PickerNodeDelegate = self в didSet {} закрытие

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

Назначьте его в вашей функции init () вместо

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

Обратите внимание, вы также должны объявить, что ваш делегат равен weak, так как это делегат, ваш протокол должен соответствовать типу класса, чтобы быть ослабленным.

protocol ComboBoxNodeDelegate: class
...
weak var delegate: ComboBoxNodeDelegate?
0 голосов
/ 05 апреля 2019

Вот пример, надеюсь, это поможет!

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!"
    } 
}
0 голосов
/ 05 апреля 2019

Все параметры, передаваемые в Swift, являются константами - поэтому вы не можете их изменять.

Если вы хотите изменить их в функции, вы должны объявить свой протокол для передачи по ссылке с помощью inout:

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

Примечание: вы не можете передать константу (let) этой функции.Это должна быть переменная, которую, как я вижу, вы делаете!

...