Ios 未调用选择器视图函数
我正在制作一个包含一些文本字段的应用程序,一旦按下,文本字段应该会从底部弹出一个选择器视图,应该会显示我添加的一些数组,但不知怎的,在放入print语句后,我发现了最重要的两个功能Ios 未调用选择器视图函数,ios,swift,function,uipickerview,Ios,Swift,Function,Uipickerview,我正在制作一个包含一些文本字段的应用程序,一旦按下,文本字段应该会从底部弹出一个选择器视图,应该会显示我添加的一些数组,但不知怎的,在放入print语句后,我发现了最重要的两个功能 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? 及 我在picker视图中放置单词的代码不会运行。 我该如何解决这个问题?谢谢 import U
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
及
我在picker视图中放置单词的代码不会运行。
我该如何解决这个问题?谢谢
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
}
}
}
尝试返回每个条件,然后尝试调试它。可能它会起作用,而且您似乎错过了数据源。
标题:由于您也在使用viewForRow:
方法,所以未调用该方法,因为该方法不可能包含在同一个委托中。您只需使用其中一个
解决方案:在viewForRow:
中将label.text设置为在titleForRow:
中返回的字符串,并删除titleForRow:
方法。您有几个问题
您从未设置选择器的数据源
。添加dayPicker.dataSource=self
您已经实现了titleForRow
和viewForRow
。只实现其中一个
由于将UIPickerView
变量与UITextField
实例进行比较,因此所有if
语句都不会成功。我很惊讶你的代码居然能编译
要解决最后一个问题,需要设置所有文本字段的委托。然后实现textfielddebeginediting
delegate方法。在这种情况下,将属性设置为文本字段。然后在所有选择器视图方法中,将该文本字段属性与文本字段输出进行比较,以便知道哪个文本字段是当前文本字段。或者检查每个文本字段是否为第一响应者
例如:
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
}
}
最后一件事,确保您没有将这些方法中的一些放在另一个方法中。您发布的代码在错误的位置有一些大括号。我认为您缺少dayPicker.dataSource=self为什么要同时实现viewForRow
和titleForRow
?选择一个。我修复了代码的格式,这样您就可以解决扩展中的严重问题。您将大多数方法放在了我在答案末尾提到的第一个方法中。您是否验证了在每个文本字段的选择器中看到的值是否正确?您发布的代码(现在已删除,但基于当前选择的答案)可能只显示blockingString
数组中的数据,而不显示其他内容。数据源不会影响任何内容,但如果我粘贴到您的代码中,我会收到一个错误,函数预期返回值“Int”中缺少返回值或函数预期返回值“String”中缺少返回值@RyanDev将最后一个条件仅使用else而不是else if,如果将所有last else if放置到else,这仍然是最重要的same@RyanDev我已经更新了我帖子中的代码,请再试一次,现在它应该可以工作了:)我刚刚发布的代码实际上可以工作,它实际上可以工作!!
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]
}
}
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
}
}