【问题标题】:Picker View Functions Not Called选择器视图函数未调用
【发布时间】:2018-07-24 13:29:32
【问题描述】:

我正在制作一个带有一些文本字段的应用程序,一旦按下,文本字段应该会从底部弹出一个选择器视图,并且应该显示我添加的一些数组,但不知何故,放上print语句后,我发现了最重要的两个函数,

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

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

我在选择器视图中放置单词的位置不运行代码。 我该如何解决?谢谢

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
        }
    }
}

【问题讨论】:

  • 我认为您缺少 dayPicker.dataSource = self
  • 为什么要同时实现viewForRowtitleForRow?选择一个。
  • 我修复了您的代码格式,以便您可以解决扩展程序中的严重问题。正如我的回答末尾提到的那样,您将大部分方法放在第一个方法中。
  • 您是否确认您确实在每个文本字段的选择器中看到了正确的值?您发布的代码(现在已删除,但基于当前选择的答案)可能只会显示来自 blockingString 数组的数据,而不会显示其他任何内容。

标签: ios swift function uipickerview


【解决方案1】:

你有几个问题。

  1. 您从不设置选择器的dataSource。添加dayPicker.dataSource = self
  2. 您已经实现了titleForRowviewForRow。只实现其中之一。
  3. 您的if 语句都不会成功,因为您将UIPickerView 变量与UITextField 实例进行比较。我很惊讶你的代码竟然能编译。

要解决最后一个问题,您需要设置所有文本字段的委托。然后实现textFieldDidBeginEditing委托方法。在那里,为文本字段设置一个属性。然后在您的所有选择器视图方法中,将该文本字段属性与您的文本字段插座进行比较,以便您知道哪个文本字段是当前文本字段。或者检查每个文本字段是否是第一响应者。

例子:

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

最后一件事,确保您没有将其中一些方法放入另一个方法中。您发布的代码在错误的位置有一些花括号。

【讨论】:

    【解决方案2】:

    titleForRow: 没有被调用,因为您还使用了 viewForRow: 方法,这根本不可能包含在同一个委托中。您只能使用其中之一。

    解决方案:在viewForRow: 中将label.text 设置为您在titleForRow: 中返回的字符串,并删除titleForRow: 方法。

    【讨论】:

      【解决方案3】:
      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]
          }
      }
      

      尝试返回每个条件,然后尝试调试它。也许它会起作用,但您似乎错过了数据源。

      【讨论】:

      • 数据源不会影响任何东西,但是如果我粘贴到您的代码中,我会收到错误,函数预期返回“Int”中缺少返回或函数预期返回“字符串”中缺少返回?
      • @RyanDev 把最后一个条件只用 else 而不是 else if 并且它会起作用
      • 我把所有的 else if 放到 else 中,还是一样
      • @RyanDev 我已经更新了我帖子中的代码再试一次,现在它应该可以工作了:)
      • 我刚刚发布了实际有效的代码,它实际上有效!!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 2014-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多