如果我将它作为子视图添加到我的 UIPickerView,是不是需要向我的 UIToolBar 添加约束?

Posted

技术标签:

【中文标题】如果我将它作为子视图添加到我的 UIPickerView,是不是需要向我的 UIToolBar 添加约束?【英文标题】:Do I need to add constraints to my UIToolBar if I'm adding it as a subview to my UIPickerView?如果我将它作为子视图添加到我的 UIPickerView,是否需要向我的 UIToolBar 添加约束? 【发布时间】:2020-01-21 03:10:00 【问题描述】:

我正在尝试以编程方式向我的UIPickerView 添加一个简单的“完成”按钮,而不使用情节提要。

当我尝试将toolBar 添加为UIPickerView 的子视图时,工具栏甚至不显示,并且出现一些与约束相关的错误。

知道如何将按钮添加到 PickerView 吗?

这是我的代码的 sn-p:

var timerImage = UIButton()
var timer = Timer()
var timerDisplayed = 0
let image1 = UIImage(named: "stopwatch")
let timePicker = UIPickerView()
let timeSelect : [String] = ["300","240","180","120","90","60","45","30","15"]

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

func pickerViewConstraints()
    timePicker.anchor(top: nil, leading: view.safeAreaLayoutGuide.leadingAnchor, bottom: view.safeAreaLayoutGuide.bottomAnchor, trailing: view.safeAreaLayoutGuide.trailingAnchor)


@objc func timeClock()
    toolBar.setItems([doneButton], animated: true)
    toolBar.sizeToFit()
    toolBar.isTranslucent = false
    toolBar.isUserInteractionEnabled = true
    toolBar.barStyle = .default

    view.addSubview(timePicker)
    timePicker.addSubview(toolBar)
    pickerViewConstraints()
    timePicker.backgroundColor = .white

    DispatchQueue.main.async 
        self.timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.Action), userInfo: nil, repeats: true)
        self.timerImage.setImage(nil, for: .normal)
    

【问题讨论】:

【参考方案1】:

不,您不需要添加约束。可以是这样的:

let space = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
let doneButton = UIBarButtonItem(title: buttonTitle, style: .done, target: self, action: #selector(doneButtonAction))
let cancelButton = UIBarButtonItem(title: cancelTitle, style: .plain, target: self, action: #selector(cancelButtonAction))
let barAccessory = UIToolbar(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: 44))
barAccessory.barStyle = .default
barAccessory.isTranslucent = true
barAccessory.barTintColor = .blue
barAccessory.setItems([cancelButton, space, doneButton], animated: false)
picker.addSubview(barAccessory)
self.view.bringSubviewToFront(picker)

希望对你有帮助...

【讨论】:

这是为我解决的问题。谢谢你。 '让 barAccessory = UIToolbar(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: 44))'【参考方案2】:

您需要为您的选择器视图设置一个 UIPickerViewDelegate 类型的委托。在这个委托中,实现委托方法pickerView:viewForRow:forComponent:reusingView

为选择器项提供您的自定义视图。

对于您提供的自定义视图,您可以根据需要进行设计,包括添加按钮。

【讨论】:

【参考方案3】:

看起来这只是一些小问题。这是我之前的做法:

    override func viewDidLoad() 
    super.viewDidLoad()

    createToolbar()

    // Toolbar for "done"
    func createToolbar() 
        let toolBar = UIToolbar()
        toolBar.sizeToFit()


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

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

        // Makes toolbar apply to text fields
        educationText.inputAccessoryView = toolBar
        politicalText.inputAccessoryView = toolBar
        drinkingText.inputAccessoryView = toolBar
        heightText.inputAccessoryView = toolBar
        schoolInput.inputAccessoryView = toolBar
    

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

您似乎没有从技术上“调用”工具栏/完成按钮,除非我只是没有看到那部分代码。我还在函数中嵌套了“完成”代码。

如果您使用的是文本字段,那么您应该能够按照“educationText.inputAccessoryView = toolBar”格式将上述所有代码应用于每个文本字段(教育、政治、饮酒等)。我希望这有帮助!祝你好运。

【讨论】:

以上是关于如果我将它作为子视图添加到我的 UIPickerView,是不是需要向我的 UIToolBar 添加约束?的主要内容,如果未能解决你的问题,请参考以下文章

我的子视图中的 UIButton 不起作用

自定义 UIButton + 子视图 = 无事件

当我将它添加到我的 html 文档时,向上/向下投票系统不起作用

如何控制子视图的大小和布局?

无法显示添加到 WKWebView 的子视图

如何为 UIAlert 指定大小