Как передать данные из UIViewsController в UIView, Swift - PullRequest
1 голос
/ 07 февраля 2020

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

//this is my UIViewController

final class PayParkingViewController: BaseViewController {
    @IBOutlet weak var amount: UITextField!
//for example I need this myAmount value to be passed in my UIView
myAmount = amount.text
}
//This is my UIView
final class PaymentChoice: UIView {

    @IBOutlet weak var mastercard: UIButton!
    @IBOutlet var contentView: UIView!


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

         commonInit()
     }

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

     private func commonInit() {
             Bundle.main.loadNibNamed(className, owner: self, options: nil)
         guard let content = contentView else { return }
         addSubview(content)
         content.frame = bounds
         content.autoresizingMask = [.flexibleWidth, .flexibleHeight]
     }
    @IBAction func mastercardIsSelected(_ sender: Any) {

// here I need myAmount value from my UIViewController

    }

Ответы [ 2 ]

0 голосов
/ 07 февраля 2020

Вы начинаете с создания свойства на контроллере представления, как это:

var completionHandler:((String) -> String)?

Это свойство Свойство завершение, которое имеет тип замыкания. Закрытие является необязательным, обозначается символом?, И подпись закрытия является (String) -> String. Это означает, что замыкание имеет один параметр типа String и возвращает одно значение типа String.

Еще раз, в контроллере представления вызовите замыкание, когда текст отправляется:

let myTextedAmount = completionHandler?(amount.text)

Затем в представлении вы можете определить замыкание следующим образом:

vc.completionHandler = { text in

    print("text = \(text)")

    return text
}
0 голосов
/ 07 февраля 2020

Вы должны рассмотреть реализацию методов действия в UIViewController, потому что для этого есть UIViewControllers.

Но если вам абсолютно необходимо реализовать метод действия в подклассе UIView, вы можете создать протокол и вызвать его как источник данных. как у нас есть UITableViewDatasource.

Пожалуйста, рассмотрите следующий пример для пояснения.

final class PaymentChoice: UIView {

//All your previous code
    weak var dataSource: PaymentChoiceDataSource?
    @IBAction func mastercardIsSelected(_ sender: Any) {
        print(dataSource?.amount)
    }
}


protocol PaymentChoiceDataSource: class {
    var amount: String { get }
}

final class PayParkingViewController: UIViewController, PaymentChoiceDataSource {
    var amountTextField: UITextField!
    var amount: String { return amountTextField.text! }
    var paymentChoiceView: PaymentChoice?

    func setupPaymentChoiceView() {
        amountTextField = UITextField(frame: CGRect.zero)
        amountTextField.text = "100"
        paymentChoiceView = PaymentChoice()
        paymentChoiceView?.dataSource = self
        paymentChoiceView?.mastercardIsSelected(amountTextField)
    }
}

let payParkingViewController = PayParkingViewController()
payParkingViewController.setupPaymentChoiceView()

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...