返回

快速上手 iOS PickerView 选择器,三分钟帮你实现城市、日期、单行数据选择!

IOS

在 iOS 开发中,经常需要用到各种选择器来让用户选择数据。PickerView 是 iOS 中一种常用的选择器控件,可以用来实现各种各样的选择器,比如城市选择器、日期选择器和单行数据选择器。

PickerView 是一个滚动选择器,由多个组件组成。每个组件都有一个数据源,数据源可以是数组、字典或任何其他可以提供数据的对象。用户可以通过滚动组件来选择不同的数据。

实现 PickerView 选择器的方法有很多种,但最常见的方法是使用 AlterController。AlterController 是一个模态视图控制器,可以用来在当前视图控制器之上显示一个弹出窗口。

要使用 AlterController 来实现 PickerView 选择器,首先需要创建一个 AlterController 对象。然后,将 PickerView 添加到 AlterController 中。最后,将 AlterController 呈现出来。

以下是使用 AlterController 来实现 PickerView 选择器的代码示例:

let pickerView = UIPickerView()
let alertController = UIAlertController(title: "选择城市", message: nil, preferredStyle: .actionSheet)

pickerView.delegate = self
pickerView.dataSource = self

alertController.view.addSubview(pickerView)

let cancelAction = UIAlertAction(title: "取消", style: .cancel, handler: nil)
let doneAction = UIAlertAction(title: "确定", style: .default) { (action) in
    let selectedCity = pickerView.selectedRow(inComponent: 0)
    print("选择的城市是:\(selectedCity)")
}

alertController.addAction(cancelAction)
alertController.addAction(doneAction)

present(alertController, animated: true, completion: nil)

这段代码首先创建了一个 PickerView 对象和一个 AlterController 对象。然后,将 PickerView 添加到 AlterController 中。最后,将 AlterController 呈现出来。

当用户点击 AlterController 中的“确定”按钮时,就会触发 doneAction 方法。在 doneAction 方法中,我们可以获取用户选择的城市。

PickerView 不仅可以用来实现城市选择器,还可以用来实现日期选择器和单行数据选择器。实现方法与上面类似,只是需要修改一下 PickerView 的数据源和代理方法。

在使用 PickerView 时,可能会遇到数组越界的问题。这是因为 PickerView 的数据源是一个数组,而数组的索引是从 0 开始的。因此,如果数组的最后一个元素的索引是 n,那么 PickerView 的最后一个组件的索引就是 n-1。

如果在 PickerView 的代理方法中不进行边界检查,就可能会导致数组越界。为了避免数组越界,可以在 PickerView 的代理方法中进行边界检查。

以下是进行边界检查的代码示例:

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    if component == 0 {
        return cities.count
    } else {
        return districts[component - 1].count
    }
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    if component == 0 {
        return cities[row]
    } else {
        return districts[component - 1][row]
    }
}

这段代码首先检查 PickerView 的组件索引是否为 0。如果为 0,则返回城市数组的长度。否则,返回区县数组的长度。

然后,检查 PickerView 的行索引是否小于数组的长度。如果小于,则返回数组中相应元素的值。否则,返回 nil。

这样就可以避免数组越界的问题了。

PickerView 是一个非常强大的控件,可以用来实现各种各样的选择器。通过使用 AlterController,可以轻松地将 PickerView 添加到控制器中。在使用 PickerView 时,需要注意数组越界的问题,并进行相应的边界检查。