Установить заголовок UIButton из выбранной строки UIPickerView в быстром - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь установить заголовок кнопки из выбранной строки из uipickerview.Однако я не могу найти правильное решение.

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

То, что я пробовал:

  • Глобальные функции (невозможно)не работает, потому что вы не можете указать кнопку, имя которой хотите изменить)
  • Dispatchqueue.main.async - Не обновил мой заголовок.Идея здесь в том, чтобы постоянно проверять наличие изменений строки.

Решение, которое я нашел здесь, находится в Obj-C.Я попытался преобразовать его в swift https://objectivec2swift.com/#/converter/code/, но безуспешно. Установить заголовок кнопки UIB из выбранной строки UIPickerView

@IBAction func CountryPickButton(_ sender: UIButton) {

        Global.setPickerDataSource(data:["Test","test2","test3"])
        Global.setPickerCompletionHandler(int:0)
        let popOverVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "PickerViewPopUpId") as! PickerViewController
        //CountryPickButtonDetector = sender as? UIButton
        self.addChild(popOverVC)
        popOverVC.view.frame = self.view.frame
        self.view.addSubview(popOverVC.view)
        popOverVC.didMove(toParent: self)
        popOverVC.callback { value in
        //CountryPickButton.title.text = value
        sender.setTitle(value, for: UIControl.State)
    }
    }

import UIKit
var test = ""

class PickerViewController: UIViewController {
    @IBOutlet weak var PickerView: UIPickerView!
    var callback : ((String) -> Void)?
    override func viewDidLoad() {
        super.viewDidLoad()
        //self.view.backgroundColor = UIColor.black.withAlphaComponent(0.8)
        PickerView.dataSource = self
        PickerView.delegate = self
        // Do any additional setup after loading the view.
    }
    @IBAction func ExitButton(_ sender: Any) {
        switch Global.pickerCompletionHandler {

        case 0:
            callback?(Global.pickerResult ?? "")
            Global.setProfileCountry(string:
                Global.pickerResult ?? "")
        default:
            print("nothing")

        }
        self.view.removeFromSuperview()
    }

}

extension PickerViewController: UIPickerViewDelegate, UIPickerViewDataSource {
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1 // can be more than 1 component like time/date/year
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return Global.pickerDataSource?.count ?? 1
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        //Global.pickerResult = Global.pickerDataSource?[row]
        Global.setPickerResult(result: Global.pickerDataSource?[row] ?? "Test" )
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return Global.pickerDataSource?[row]
    }


}

Глобалы

import Foundation

struct Global {
    static var pickerDataSource:[String]? = nil
    static var pickerResult:String? = nil
    static var pickerCompletionHandler:Int? = 0
    static var profileCountry:String? = nil

    static func setPickerDataSource(data:[String]) {
        Global.pickerDataSource = data
    }
    static func setPickerResult(result:String) {
        Global.pickerResult = result
    }
    static func setPickerCompletionHandler(int: Int) {
        Global.pickerCompletionHandler = int
    }
    static func setProfileCountry(string: String)
    {
        Global.profileCountry = string
    }
}

1 Ответ

0 голосов
/ 28 февраля 2019

Я не знаю, что это за Global, самое простое решение - расширить pickerCompletionHandler, но вот еще одно (простое):

  • ВPickerViewController добавить обратный вызов, передав значение String и не возвращая значения

    var callback : ((String) -> Void)?
    

    , и вызвать его в exitButton (пожалуйста, имена переменных и функций должны начинаться со строчной буквы)

    @IBAction func exitButton(_ sender: Any) {
        switch Global.pickerCompletionHandler {
    
        case 0:
            callback?(Global.pickerResult ?? "")
            Global.setProfileCountry(string:
                Global.pickerResult ?? "")
        default:
            print("nothing")
    
        }
        self.view.removeFromSuperview()
    }
    
  • В countryPickButton (снова: строчная буква) установите обратный вызов и установите sender в реальный тип.Обратный вызов устанавливает заголовок

    @IBAction func countryPickButton(_ sender: UIButton) {
    
        Global.setPickerDataSource(data:["Test","test2","test3"])
        Global.setPickerCompletionHandler(int:0)
        let popOverVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "PickerViewPopUpId") as! PickerViewController
        popOverVC.callback = { value in 
            sender.setTitle(value, for: .normal)
        }
    ...
    
...