单个视图上的多个选择器视图
Multiple Picker Views on a single view
我按照以下 SO question 创建了多个选择器视图。
它可以工作,但不是我想要的那样。
我的要求:
我的视图将有多个按钮。点击每个按钮都会在 screen.Each 按钮的底部显示一个选择器视图,选择器视图将有不同的选项。见下图:
我做了什么:
到目前为止,我已经创建了两个按钮,然后将两个选择器视图添加到我的情节提要中。见下文
代码如下:
import UIKit
class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {
@IBOutlet var one: UIPickerView!
@IBOutlet var Two: UIPickerView!
var picker1Options = [String]()
var picker2Options = [String]()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
picker1Options = ["Option 1","Option 2","Option 3","Option 4","Option 5"]
picker2Options = ["Item 1","Item 2","Item 3","Item 4","Item 5"]
self.one.hidden = true
self.Two.hidden = true
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if (pickerView.tag == 1){
return picker1Options.count
}else{
return picker2Options.count
}
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if (pickerView.tag == 1){
return "\(picker1Options[row])"
}else{
return "\(picker2Options[row])"
}
}
@IBAction func oneShow(sender: AnyObject) {
self.one.hidden = false
}
@IBAction func twoShow(sender: AnyObject) {
self.Two.hidden = false
}
}
以上代码的输出为:
问题:
正如您在上图中看到的,虽然我可以显示不同的选择器视图,但它们没有正确显示。我希望每个选择器视图都显示在屏幕的底部。
另请注意,我正在使用 self.picker.hidden = true
来隐藏和取消隐藏选择器视图。 这是隐藏和取消隐藏选择器视图的正确方法吗?有没有更好的方法来实现这个功能?
在情节提要上,我是否应该将选择器视图放置在屏幕底部的彼此之上,以便它们在触发 self.picker.hidden = false
时始终显示在底部?
在故事板上实现多个选择器视图的正确方法是什么?
任何帮助将不胜感激。
您可以使用文本字段代替按钮,并将选择器视图添加为文本字段的输入视图。并且基于文本字段,您可以更改数组的内容并显示在 pickerview 中。
Please find image in that i used age picker and team picker.
编辑:
-(void) viewWillAppear:(BOOL)animated
{
[self.PickerVw removeFromSuperview];
txtAge.inputView = self.PickerVw;
txtSportName.inputView = self.PickerVw;
}
#pragma mark - UItextfield delegate Methods
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
arr1 = [NSMutableArray new];
if (textField.tag == 1)
{
int min = 9;
int max = 100;
for (int i = min ; i < max; i++)
{
[arr1 addObject:[NSString stringWithFormat:@"%d",(i+1)]];
}
[textField becomeFirstResponder];
self.picker.tag = 1;
}
if (textField.tag == 2)
{
[self.picker selectRow:0 inComponent:0 animated:NO];
arr1 = [arrSports mutableCopy];
[textField becomeFirstResponder];
self.picker.tag = 2;
}
[self.picker reloadAllComponents];
}
这里是关于 Apple shows/hides 和 datePicker
的 sample code,应该能为您指明正确的方向。
你在使用 UiPickerView 时犯了一些大的概念错误:
1.You 你的故事板中只需要一个 UIPickerView。
2.You 选择器视图只需要一个数据源(单击按钮时您将更改其中的值)。
我用你的代码做了一个例子,但要注意会有一些错误,因为我是在 NotePad++ 上写的(我面前没有 Mac)。
class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {
@IBOutlet var picker: UIPickerView!
var pickerOptions1 = [String]()
var pickerOptions2 = [String]()
var pickerOptions3 = [String]()
var dataSource;
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
pickerOptions1 = ["Option 1","Option 2","Option 3","Option 4","Option 5"]
pickerOptions2 = ["Item 1","Item 2","Item 3","Item 4","Item 5"]
pickerOptions3 = ["Something 1","Something 2","Something 3","Something 4","Something 5"]
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return dataSource.count;
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return "\(dataSiurce[row])"
}
@IBAction func showPickerOne(sender: AnyObject) {
dataSource = pickerOptions1;
[self.picker reloadAllComponents];
}
@IBAction func showPickerTwo(sender: AnyObject) {
dataSource = pickerOptions2;
[self.picker reloadAllComponents];
}
@IBAction func showPickerThree(sender: AnyObject) {
dataSource = pickerOptions3;
[self.picker reloadAllComponents];
}
}
我希望这能帮助您理解 ios 中选择器的概念。
我按照以下 SO question 创建了多个选择器视图。 它可以工作,但不是我想要的那样。
我的要求:
我的视图将有多个按钮。点击每个按钮都会在 screen.Each 按钮的底部显示一个选择器视图,选择器视图将有不同的选项。见下图:
我做了什么:
到目前为止,我已经创建了两个按钮,然后将两个选择器视图添加到我的情节提要中。见下文
代码如下:
import UIKit
class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {
@IBOutlet var one: UIPickerView!
@IBOutlet var Two: UIPickerView!
var picker1Options = [String]()
var picker2Options = [String]()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
picker1Options = ["Option 1","Option 2","Option 3","Option 4","Option 5"]
picker2Options = ["Item 1","Item 2","Item 3","Item 4","Item 5"]
self.one.hidden = true
self.Two.hidden = true
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if (pickerView.tag == 1){
return picker1Options.count
}else{
return picker2Options.count
}
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if (pickerView.tag == 1){
return "\(picker1Options[row])"
}else{
return "\(picker2Options[row])"
}
}
@IBAction func oneShow(sender: AnyObject) {
self.one.hidden = false
}
@IBAction func twoShow(sender: AnyObject) {
self.Two.hidden = false
}
}
以上代码的输出为:
问题:
正如您在上图中看到的,虽然我可以显示不同的选择器视图,但它们没有正确显示。我希望每个选择器视图都显示在屏幕的底部。
另请注意,我正在使用 self.picker.hidden = true
来隐藏和取消隐藏选择器视图。 这是隐藏和取消隐藏选择器视图的正确方法吗?有没有更好的方法来实现这个功能?
在情节提要上,我是否应该将选择器视图放置在屏幕底部的彼此之上,以便它们在触发 self.picker.hidden = false
时始终显示在底部?
在故事板上实现多个选择器视图的正确方法是什么?
任何帮助将不胜感激。
您可以使用文本字段代替按钮,并将选择器视图添加为文本字段的输入视图。并且基于文本字段,您可以更改数组的内容并显示在 pickerview 中。
Please find image in that i used age picker and team picker.
编辑:
-(void) viewWillAppear:(BOOL)animated
{
[self.PickerVw removeFromSuperview];
txtAge.inputView = self.PickerVw;
txtSportName.inputView = self.PickerVw;
}
#pragma mark - UItextfield delegate Methods
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
arr1 = [NSMutableArray new];
if (textField.tag == 1)
{
int min = 9;
int max = 100;
for (int i = min ; i < max; i++)
{
[arr1 addObject:[NSString stringWithFormat:@"%d",(i+1)]];
}
[textField becomeFirstResponder];
self.picker.tag = 1;
}
if (textField.tag == 2)
{
[self.picker selectRow:0 inComponent:0 animated:NO];
arr1 = [arrSports mutableCopy];
[textField becomeFirstResponder];
self.picker.tag = 2;
}
[self.picker reloadAllComponents];
}
这里是关于 Apple shows/hides 和 datePicker
的 sample code,应该能为您指明正确的方向。
你在使用 UiPickerView 时犯了一些大的概念错误:
1.You 你的故事板中只需要一个 UIPickerView。
2.You 选择器视图只需要一个数据源(单击按钮时您将更改其中的值)。
我用你的代码做了一个例子,但要注意会有一些错误,因为我是在 NotePad++ 上写的(我面前没有 Mac)。
class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate { @IBOutlet var picker: UIPickerView! var pickerOptions1 = [String]() var pickerOptions2 = [String]() var pickerOptions3 = [String]() var dataSource; override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. pickerOptions1 = ["Option 1","Option 2","Option 3","Option 4","Option 5"] pickerOptions2 = ["Item 1","Item 2","Item 3","Item 4","Item 5"] pickerOptions3 = ["Something 1","Something 2","Something 3","Something 4","Something 5"] } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { return 1 } func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return dataSource.count; } func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return "\(dataSiurce[row])" } @IBAction func showPickerOne(sender: AnyObject) { dataSource = pickerOptions1; [self.picker reloadAllComponents]; } @IBAction func showPickerTwo(sender: AnyObject) { dataSource = pickerOptions2; [self.picker reloadAllComponents]; } @IBAction func showPickerThree(sender: AnyObject) { dataSource = pickerOptions3; [self.picker reloadAllComponents]; } }
我希望这能帮助您理解 ios 中选择器的概念。