You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术问题:UIPickerView的Toolbar不可见(附ViewLoad调用的相关代码)

排查UIPickerView Toolbar不显示的问题

从你提供的代码片段来看,Toolbar无法显示通常是几个常见细节遗漏导致的,我帮你逐一分析并给出修复方案:


常见原因及修复步骤

1. 最核心问题:未将Toolbar加入视图层级

你创建了toolBar对象,但没有调用view.addSubview(toolBar)把它添加到当前视图的层级结构中——没有被添加到视图树里的控件,系统根本不会渲染它,这是最容易忽略的点。

2. Frame位置计算逻辑混乱

你的代码里把Picker的Y轴设为0(放在屏幕最顶部),而Toolbar的Y轴是self.view.frame.size.height - picker.frame.size.height -50,这会让两个控件的位置完全脱节:

  • Picker占据屏幕顶部300高度的区域
  • Toolbar则被放在屏幕中间偏下的位置(比如iPhone 8屏幕高度667的话,Y轴为667-300-50=317)

如果你的需求是把Picker和Toolbar一起放在屏幕底部(这是Picker的常规使用方式),应该调整两者的位置计算:

// 先计算Picker的Y位置:从屏幕底部往上300
let pickerHeight: CGFloat = 300
let pickerY = self.view.frame.size.height - pickerHeight
picker = UIPickerView(frame: CGRect(x: 0, y: pickerY, width: view.frame.width, height: pickerHeight))

// Toolbar放在Picker的正上方,Y位置是pickerY减去自身高度
let toolBarHeight: CGFloat = 50
let toolBarY = pickerY - toolBarHeight
let toolBar = UIToolbar(frame: CGRect(x: 0, y: toolBarY, width: view.frame.width, height: toolBarHeight))

3. Toolbar无内容导致视觉上“消失”

如果Toolbar是空的(没有设置items),且它的背景色和父视图背景色接近,会看起来像是没显示。你需要给Toolbar至少添加一个功能按钮(比如“完成”按钮):

// 创建完成按钮
let doneButton = UIBarButtonItem(title: "完成", style: .done, target: self, action: #selector(donePicker))
// 添加灵活空间让按钮靠右对齐
let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
toolBar.items = [flexibleSpace, doneButton]

别忘了实现对应的按钮点击方法:

@objc func donePicker() {
    view.endEditing(true)
    // 这里可以添加你点击完成后的业务逻辑
}

4. AutoLayout覆盖了Frame设置

如果你的视图控制器使用了AutoLayout,而你没有设置translatesAutoresizingMaskIntoConstraints = true,那么你手动设置的frame会被AutoLayout的约束覆盖,导致控件位置错误或不显示。可以在创建Picker和Toolbar时加上这行代码:

picker.translatesAutoresizingMaskIntoConstraints = true
toolBar.translatesAutoresizingMaskIntoConstraints = true

完整修复后的示例代码

private func createPickerView(){
    // 定义控件高度常量
    let pickerHeight: CGFloat = 300
    let toolBarHeight: CGFloat = 50
    
    // 计算控件Y轴位置(放在屏幕底部)
    let pickerY = self.view.frame.size.height - pickerHeight
    let toolBarY = pickerY - toolBarHeight
    
    // 创建并配置PickerView
    picker = UIPickerView(frame: CGRect(x: 0, y: pickerY, width: view.frame.width, height: pickerHeight))
    picker.showsSelectionIndicator = true
    picker.delegate = self
    picker.dataSource = self
    picker.translatesAutoresizingMaskIntoConstraints = true
    view.addSubview(picker)
    
    // 创建并配置Toolbar
    let toolBar = UIToolbar(frame: CGRect(x: 0, y: toolBarY, width: view.frame.width, height: toolBarHeight))
    toolBar.barStyle = .default
    toolBar.tintColor = UIColor(red: 14.0/255, green: 122.0/255, blue: 254.0/255, alpha: 1.0) // 补全你之前未写完的颜色值
    toolBar.translatesAutoresizingMaskIntoConstraints = true
    
    // 给Toolbar添加按钮
    let doneButton = UIBarButtonItem(title: "完成", style: .done, target: self, action: #selector(donePicker))
    let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
    toolBar.items = [flexibleSpace, doneButton]
    
    // 将Toolbar添加到视图层级
    view.addSubview(toolBar)
}

@objc private func donePicker() {
    view.endEditing(true)
    // 处理完成后的逻辑,比如获取选中值、隐藏Picker等
}

内容的提问来源于stack exchange,提问作者Ravindra Shekhawat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:39:17