简体   繁体   中英

Update UIButton title with array data using UIPickerView selected row

This question has been covered before but I'm just not getting it.

I have three buttons to show a UIPickerView.

button1.addTarget(self, action: #selector(showPicker), for: .touchUpInside)
button2.addTarget(self, action: #selector(showPicker), for: .touchUpInside)
button3.addTarget(self, action: #selector(showPicker), for: .touchUpInside)

Depending on the button clicked, the picker data (modelData) and tag are updated.

@objc func showFilterPicker(sender: UIButton)
    if sender.tag == 238 {
        modelData = someStringArray1
        filterPickerView.reloadAllComponents()
        filterPickerView.tag = 2238
    } else if sender.tag == 239 {
        modelData = someStringArray2
        filterPickerView.reloadAllComponents()
        filterPickerView.tag = 2239
    } else if sender.tag == 240 {
        modelData = someStringArray3
        filterPickerView.reloadAllComponents()
        filterPickerView.tag = 2240
    }
}

To update the button title

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    if filterPickerView.tag == 2238 {
        button1.setTitle(modelData[row], for: .normal)
    } else if filterPickerView.tag == 2239 {
        button2.setTitle(modelData[row], for: .normal)
    } else if filterPickerView.tag == 2240 {
        button3.setTitle(modelData[row], for: .normal)
    }
}

However, this does not work.

Any suggestions or a more detailed example of the linked answers would be helpful, thanks.

--

view hierarchy

override func viewDidLoad() {
    view.addSubview(outerView)
    outerView.addSubview(scrollView)
    scrollView.addSubview(containerView)
    containerView.addSubview(button1)
    containerView.addSubview(button2)
    containerView.addSubview(button3)
    view.addSubview(pickerContainerView)
    pickerContainerView.addSubview(filterPickerView)
}

Here is a complete, functional example. No IBOutlets or IBActions, so just assign a new view controller to this class:

//
//  DeanViewController.swift
//  TestProj
//
//  Created by Don Mag on 8/20/19.
//

import UIKit

class DeanViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

    let button1: UIButton = {
        let b = UIButton()
        b.translatesAutoresizingMaskIntoConstraints = false
        b.backgroundColor = .red
        b.setTitle("Button 1", for: .normal)
        return b
    }()

    let button2: UIButton = {
        let b = UIButton()
        b.translatesAutoresizingMaskIntoConstraints = false
        b.backgroundColor = .red
        b.setTitle("Button 2", for: .normal)
        return b
    }()

    let button3: UIButton = {
        let b = UIButton()
        b.translatesAutoresizingMaskIntoConstraints = false
        b.backgroundColor = .red
        b.setTitle("Button 3", for: .normal)
        return b
    }()


    let filterPickerView: UIPickerView = {
        let v = UIPickerView()
        v.translatesAutoresizingMaskIntoConstraints = false
        return v
    }()

    let buttonStackView: UIStackView = {
        let v = UIStackView()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.axis = .vertical
        v.spacing = 8
        return v
    }()

    let containerView: UIView = {
        let v = UIView()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.backgroundColor = .cyan
        return v
    }()

    let pickerContainerView: UIView = {
        let v = UIView()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.backgroundColor = .green
        return v
    }()

    let scrollView: UIScrollView = {
        let v = UIScrollView()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.backgroundColor = .blue
        return v
    }()

    let data1 = ["One", "Two", "Three"]
    let data2 = ["This", "is", "a", "Test"]
    let data3 = ["A", "B", "C", "D", "E"]

    var modelData: [String] = [String]()

    override func viewDidLoad() {
        super.viewDidLoad()

        // add the 3 buttons to the stack view
        buttonStackView.addArrangedSubview(button1)
        buttonStackView.addArrangedSubview(button2)
        buttonStackView.addArrangedSubview(button3)

        // add the stack view to the container view
        containerView.addSubview(buttonStackView)

        // add the container view to the scroll view
        scrollView.addSubview(containerView)

        // add the picker view to its container view
        pickerContainerView.addSubview(filterPickerView)

        // add the picker container view to the scroll view
        scrollView.addSubview(pickerContainerView)

        // add the scroll view to the view
        view.addSubview(scrollView)

        // setup the constraints
        NSLayoutConstraint.activate([

            buttonStackView.topAnchor.constraint(equalTo: containerView.topAnchor, constant: 20.0),
            buttonStackView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor, constant: -20.0),
            buttonStackView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor, constant: 20.0),
            buttonStackView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor, constant: -20.0),

            filterPickerView.topAnchor.constraint(equalTo: pickerContainerView.topAnchor, constant: 20.0),
            filterPickerView.bottomAnchor.constraint(equalTo: pickerContainerView.bottomAnchor, constant: -20.0),
            filterPickerView.leadingAnchor.constraint(equalTo: pickerContainerView.leadingAnchor, constant: 20.0),
            filterPickerView.trailingAnchor.constraint(equalTo: pickerContainerView.trailingAnchor, constant: -20.0),

            containerView.topAnchor.constraint(equalTo: scrollView.topAnchor, constant: 20.0),
            containerView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor, constant: 20.0),
            containerView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor, constant: 0.0),

            pickerContainerView.topAnchor.constraint(equalTo: containerView.bottomAnchor, constant: 20.0),
            pickerContainerView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor, constant: 20.0),
            pickerContainerView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor, constant: 0.0),

            pickerContainerView.bottomAnchor.constraint(greaterThanOrEqualTo: scrollView.bottomAnchor, constant: 20.0),
            pickerContainerView.widthAnchor.constraint(equalTo: scrollView.widthAnchor, constant: -40.0),

            scrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
            scrollView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
            scrollView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor),
            scrollView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor),

            ])

        modelData = data1
        filterPickerView.tag = 1

        filterPickerView.dataSource = self
        filterPickerView.delegate = self

        button1.addTarget(self, action: #selector(btnTap(_:)), for: .touchUpInside)
        button2.addTarget(self, action: #selector(btnTap(_:)), for: .touchUpInside)
        button3.addTarget(self, action: #selector(btnTap(_:)), for: .touchUpInside)

    }

    @objc func btnTap(_ sender: UIButton) -> Void {

        if sender == button1 {
            modelData = data1
            filterPickerView.tag = 1
        } else if sender == button2 {
            modelData = data2
            filterPickerView.tag = 2
        } else {
            modelData = data3
            filterPickerView.tag = 3
        }

        filterPickerView.reloadAllComponents()

    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        var btn: UIButton?
        if pickerView.tag == 1 {
            btn = button1
        } else if pickerView.tag == 2 {
            btn = button2
        } else {
            btn = button3
        }
        btn?.setTitle(modelData[row], for: .normal)
    }

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

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return modelData.count
    }

}

Result:

在此处输入图片说明

Blue is the background color of the scroll view; Green is the background color of the picker container view Cyan is the background color of the buttons container view (the buttons are also embedded in a stack view)

Tapping each button changes the data in the picker, and selecting a row in the picker changes the title of the associated button.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM