Search code examples
iosswiftfunctionuipickerview

Picker View Functions Not Called


I am making an app with some text fields, and once pressed, the text field is supposed to have a picker view pop up from the bottom, and is supposed to show some of the arrays that I have added, but somehow, after putting print statements, I found out the most important two functions,

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? 

and

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)

where I put the code where I put words on my picker view, doesn't run. How do I fix this? thanks

import UIKit

class ViewController: UIViewController{
    var blocking = [Automation.blockTime.quarterHour, .halfHour, .hour, .twoHour]
    var blockingString = ["Quarter Hour", "Half Hour", "Hour", "Two Hours"]
    var startTimeString = ["5:00AM","6:30AM","5:30AM","6:00AM","7:00AM","7:30AM","8:00AM","8:30AM","9:00AM","9:30AM","10:00AM"]
    var endTimeString = ["5:00PM","6:30PM","5:30PM","6:00PM","7:00PM","7:30PM","8:00PM","8:30PM","9:00PM","9:30PM","10:00PM"]
    var startTime = [300, 390, 330, 360, 420, 450, 480, 510, 540, 570, 600]
    var endTime = [Int]()

    @IBOutlet weak var block: UITextField!
    @IBOutlet weak var endOfSchedule: UITextField!
    @IBOutlet weak var StartOfSchedule: UITextField!
    @IBOutlet weak var AppointmentTextField: UITextField!
    @IBOutlet weak var prorityTextField: UITextField!
    @IBOutlet weak var GoButton: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        createPicker()
        createToolbar()
        for EachElemnt in startTime {
            endTime.append(EachElemnt + (12 * 60))
        }
    }

    func createPicker() {
        let dayPicker = UIPickerView()
        dayPicker.delegate = self

        endOfSchedule.inputView = dayPicker
        StartOfSchedule.inputView = dayPicker
        block.inputView = dayPicker

        //Customizations
        dayPicker.backgroundColor = UIColor.darkGray
    }

    func createToolbar() {
        let toolBar = UIToolbar()
        toolBar.sizeToFit()

        //Customizations
        toolBar.barTintColor = .black
        toolBar.tintColor = .white

        let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(ViewController.dismissKeyboard))

        toolBar.setItems([doneButton], animated: false)
        toolBar.isUserInteractionEnabled = true

        prorityTextField.inputAccessoryView = toolBar
    }

    @objc func dismissKeyboard() {
        view.endEditing(true)
    }
}

extension ViewController: UIPickerViewDelegate, UIPickerViewDataSource {
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        var returnment = Int()
        if pickerView == endOfSchedule {
            returnment = endTimeString.count
            return endTimeString.count
        }else if pickerView == StartOfSchedule {
            returnment = startTimeString.count
            return startTimeString.count
        }else if pickerView == block {
            returnment = blocking.count
            return blocking.count
        }

        return returnment

        func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {

            var returnment = String()
            if pickerView == endOfSchedule {
                returnment = endTimeString[row]

            }else if pickerView == StartOfSchedule {
                returnment = startTimeString[row]

            }else if pickerView == block {
                returnment = blockingString[row]

            }
            print(returnment)
            return returnment
        }

        func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
            if pickerView == endOfSchedule {
                endOfSchedule.text = endTimeString[row]
            }else if pickerView == StartOfSchedule {
                StartOfSchedule.text = startTimeString[row]
            }else if pickerView == block {
                block.text = blockingString[row]
            }
        }

        func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
            var label: UILabel

            if let view = view as? UILabel {
                label = view
            } else {
                label = UILabel()
            }

            label.textColor = .white
            label.textAlignment = .center
            label.font = UIFont(name: "Menlo-Regular", size: 17)
            if pickerView == endOfSchedule {
                label.text = endOfSchedule.text
            }else if pickerView == StartOfSchedule {
                label.text = StartOfSchedule.text
            }else if pickerView == block {
                label.text = block.text
            }

            return label
        }
    }
}

Solution

  • func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    
        if pickerView == endOfSchedule {
    
            return endTimeString.count
        }else if pickerView == StartOfSchedule {
    
            return startTimeString.count
        }else {
    
            return blocking.count
        }
    }                                                                             
    
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if pickerView == endOfSchedule {
            return endTimeString[row]
    
        }else if pickerView == StartOfSchedule {
            return startTimeString[row]
    
        }else  {
            return blockingString[row]
        }
    }
    

    Try to return with each condition and then try to debug it. Maybe it will work and it seems you missed dataSource.