Это хороший способ передать данные в пользовательское представление, а затем выполнить функцию? - PullRequest
0 голосов
/ 13 апреля 2019

Я создал собственный вид аксессуара для ввода, это кнопка отправки. Однако мне нужно передать данные в пользовательское представление, а затем выполнить дальнейшую функцию. Это хороший способ сделать это?

class SignUpViewController: UIViewController {

    @IBOutlet weak var phoneTF: SignLogTextField!
    @IBOutlet weak var EmailTF: SignLogTextField!
    @IBOutlet weak var PasswordTF: SignLogTextField!
    @IBOutlet weak var FBBtn: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        textFieldPreparation()
    }

    func textFieldPreparation(){
        EmailTF.inputAccessoryView = Bundle.main.loadNibNamed("SignSubmitBTN", owner: self, options: nil)?.first as! SignSubmitBTN

        phoneTF.inputAccessoryView = Bundle.main.loadNibNamed("SignSubmitBTN", owner: self, options: nil)?.first as! SignSubmitBTN

        PasswordTF.inputAccessoryView = Bundle.main.loadNibNamed("SignSubmitBTN", owner: self, options: nil)?.first as! SignSubmitBTN
    }
}

enter image description here

Я не уверен, как передать данные в пользовательское представление, или я должен сделать sign up в Outlet Action?

Это мой пользовательский вид

import UIKit

class SignSubmitBTN: UIView {
    @IBAction func submitAction(_ sender: Any) {
    }

    @IBOutlet weak var subBTN: UIButton!

    override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()
    }

    func setup(){}
}

Если мне нужно передать данные в пользовательское представление, должен ли я использовать протокол? Если я должен использовать протокол о том, как его использовать?

Ответы [ 3 ]

1 голос
/ 13 апреля 2019

Попробуйте это

    func loadFromNib() -> SignSubmitBTN {


 let bundle  = Bundle.main.loadNibNamed("SignSubmitBTN", owner: self, options: nil)?.first as! SignSubmitBTN
                return bundle
            }

В вашем viewcontroller вызов, как показано ниже:

    let customObj = loadFromNib()
    customObj.dataToGet = "Data to pass"
customObj.delegate = self
    EmailTF.inputAccessoryView = customObj

Если вы хотите передать данные из пользовательского класса, вам нужно использовать протокол делегирования, как предложено @Fogmeister.

Если вы хотите делегировать опцию

    public protocol menuOpen:  class {
        func openMenuAction(selectedValue : String)
    }
    class SignSubmitBTN: UIView {
    open var delegate:menuOpen?
 var dataToGet = ""

    @IBAction func submitAction(_ sender: Any) {

self.delegate.openMenuAction("test")

    }
    }

Затем добавьте метод делегата в ваш VC

class SignUpViewController: UIViewController,menuOpen{ 

    func openMenuAction(selectedValue : String) {
    //get your selected value here, you would better pass parameter in this method
    }
}
1 голос
/ 13 апреля 2019

Ваш CustomView - это просто класс в конце, так что вы можете сделать это в объектно-ориентированном режиме, для этого напишите функцию в вашем CustomView для передачи данных в него.Как и

   class SignSubmitBTN: UIView {
       var data: String!;
       public func setData(data: String) {
             self.data = data;
       }

       /// Other code
    }

. Чтобы установить данные после инициализации CustomView, вызовите функцию setData (params) для установки данных в нем.

1 голос
/ 13 апреля 2019

ОК ...

Я думаю, вы подходите к этому с неправильной стороны.Ответственность кнопки должна заключаться в том, чтобы сообщить вам, что пользователь нажал на нее, и ничего более.Кнопка не должна иметь дело со входом.

Но ... вы здесь на 90%.Еще несколько бит, чтобы добавить.

Вы можете обновить свою кнопку отправки, чтобы включить делегата и использовать делегата в вашем действии кнопки ...

import UIKit

// protocol
protocol SignInButtonDelegate: class {
    func signIn()
}

class SignSubmitBTN: UIView {
    // property for delegate
    weak var delegate: SignInButtonDelegate?        

    @IBAction func submitAction(_ sender: Any) {
        // this tells the delegate to sign in
        // it doesn't need to know how that happens
        delegate?.signIn()
    }

    @IBOutlet weak var subBTN: UIButton!

    override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()
    }

    func setup() {}
}

Затем в вашем контроллере представления высоответствовать протоколу делегата ...

extension SignUpViewController: SignInButtonDelegate {
    func signIn() {
        // here you already have access to all the data you need to sign in.
        // you are in the view controller here so just get the text from the username, password, etc...
    }
}

И затем установить контроллер представления в качестве делегата ...

func textFieldPreparation() {
    let signInButton = Bundle.main.loadNibNamed("SignSubmitBTN", owner: self, options: nil)?.first as! SignSubmitBTN
    signInButton.delegate = self

    // these are properties... they should begin with a lowercase letter
    emailTF.inputAccessoryView = signInButton 
    phoneTF.inputAccessoryView = signInButton 
    passwordTF.inputAccessoryView = signInButton 
}
...