gpt4 book ai didi

ios - 尝试通过工具栏关闭 UIPickerView 导致意外行为

转载 作者:行者123 更新时间:2023-11-29 05:30:48 24 4
gpt4 key购买 nike

我有一个 PickerView,它根据选择的文本字段来更新数组数据。我将一个工具栏附加到此 pickerView,以允许使用“完成”按钮来关闭选择器。但是,当点击时,“完成”按钮不会关闭选择器,而是重置选择器中的数据以选择第一个选项(它将其从选定的选项滚动回数组中的第一个选项)。完成按钮似乎并没有真正触发我指定的功能。我想知道我是否写错了 BarButtonItem。为了便于故障排除,我更改了“完成”和“取消”按钮的操作,以简单地打印到控制台,但这两个按钮都不会发生这种情况。有人可以看一下我的代码并告诉我为什么“完成”和“取消”按钮没有连接到我的函数。

我在 BarButtonItem 上弹出了几个错误,所有错误似乎都与操作:选项有关。对于每个错误,我都选择了推荐的修复方法。我浏览过这个网站和其他几个网站的教程,但这些没有帮助。就像我说的,我相信我只是在操作中有一些语法错误:部分没有找到我的函数

import UIKit

class MiniRAEBuilderViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate, UITextFieldDelegate {

// Create the textField outlets
@IBOutlet weak var lampTextField: UITextField!
@IBOutlet weak var battTextField: UITextField!
@IBOutlet weak var wireTextField: UITextField!
@IBOutlet weak var kitTextField: UITextField!

// create the pickerView
var pickerView = UIPickerView()

override func viewDidLoad() {
super.viewDidLoad()
navigationItem.largeTitleDisplayMode = .never
title = "\(modelName) Builder"

// set textField's delegate and inputView
lampTextField.delegate = self
lampTextField.inputView = pickerView
battTextField.delegate = self
battTextField.inputView = pickerView
wireTextField.delegate = self
wireTextField.inputView = pickerView
kitTextField.delegate = self
kitTextField.inputView = pickerView

// Set pickerView delegate and data source
pickerView.delegate = self
pickerView.dataSource = self

// create the tool bar for the pickerview
let toolBar = UIToolbar()
toolBar.barStyle = UIBarStyle.default
toolBar.isTranslucent = true
toolBar.sizeToFit()
// create the buttons for toolbar
let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItem.Style.plain, target: self, action: Selector(("doneButtonAction")))
let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace, target: nil, action: nil)
let cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItem.Style.plain, target: self, action: Selector(("cancelButtonAction")))
// set the toolbar to the pickerView
toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false)
toolBar.isUserInteractionEnabled = true
pickerView.addSubview(toolBar)

}

// this should be the action taken when the done button on picker view toolbar is tapped
@objc func doneButtonAction() {
print("why oh why")
self.view.endEditing(true)
}

// this should be the action taken when the cancel button on picker view toolbar is tapped
@objc func cancelButtonAction() {
print("this is cancel")
}

func textFieldDidBeginEditing(_ textField: UITextField) {
self.pickerView.reloadAllComponents()
}


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

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {

}

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

}

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

我期望“完成”按钮和“取消”按钮分别将打印语句打印到控制台,但它们只是将选择从用户选择的选项更改为数组中的第一个选项。

最佳答案

也许尝试将工具栏添加为文本字段的 inputAccessoryView,而不是将其添加为 pickerView 的 subview 。

E.G : lampTextField.inputAccessoryView = toolBar

另请尝试将选择器代码更改为

#selector(doneButtonTapped(_:))

并将 @objc 函数更改为

@objc func doneButtonAction(_ sender: UIBarButtonItem){}

它应该可以工作,因为这就是我使用 datePicker 为我的 textfField 之一执行此操作的方式,并且它按预期工作。

如果没有,我怀疑您实现的文本字段委托(delegate)方法可能是问题所在。在您的方法中添加一条 print 语句,以查看按下按钮时是否会触发该语句。

func textFieldDidBeginEditing(_ textField: UITextField) {
print("Triggered")
self.pickerView.reloadAllComponents()
}

关于ios - 尝试通过工具栏关闭 UIPickerView 导致意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57612481/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com