在将一个包含许多组合框的Android应用移植到iOS平台时,面临着一个挑战:iOS并没有内置的组合框控件。为了解决这个问题,设计了一个使用UITextField
和UIPickerView
来模拟组合框输入的解决方案,类似于Safari浏览器中HTML select字段的实现方式。
创建了一个UIViewController
的子类,其中包含了一个UITextField
和一个箭头图标,使其看起来像一个组合框。当用户触摸UITextField
时,会触发以下动作:
- (IBAction)showPicker:(id)sender {
pickerView = [[UIPickerView alloc] init];
pickerView.showsSelectionIndicator = YES;
pickerView.dataSource = self;
pickerView.delegate = self;
UIToolbar* toolbar = [[UIToolbar alloc] init];
toolbar.barStyle = UIBarStyleBlackTranslucent;
[toolbar sizeToFit];
UIBarButtonItem *flexibleSpaceLeft = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
UIBarButtonItem* doneButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(doneClicked:)];
[toolbar setItems:[NSArray arrayWithObjects:flexibleSpaceLeft, doneButton, nil]];
textField.inputView = pickerView;
textField.inputAccessoryView = toolbar;
}
在用户完成选择并点击“完成”按钮时,会调用以下方法:
- (void)doneClicked:(id)sender {
[textField resignFirstResponder];
}
附加的源代码文件iPhoneComboBox_src.zip
包含了用于与现有项目集成的子类ControllerView
。iPhoneComboBox_demo.zip
包含了使用ComboBox ControllerView
的演示应用程序的源代码。
打开Xcode并创建一个“Single View Application”,命名为ComboBoxTest
。确保勾选了“Use Automatic Reference Counting”选项。下载并解压iPhoneComboBox_src.zip
到名为ComboBox
的文件夹中(双击zip文件)。将ComboBox
文件夹拖放到Xcode项目中,并确保勾选了“Copy items into destination group's folder”和“Create groups for any added folders”选项。
编辑ViewController.h
文件:添加#import "ComboBox.h"
,声明ComboBox* combo1;
。头文件应该如下所示:
#import
#import "ComboBox.h"
@interface ViewController : UIViewController {
ComboBox* combo1;
}
@end
编辑ViewController.m
文件,在viewDidLoad
方法中添加以下内容:
NSMutableArray* fruitsArray = [[NSMutableArray alloc] init];
[fruitsArray addObject:@"Apple"];
[fruitsArray addObject:@"Banana"];
[fruitsArray addObject:@"Orange"];
combo1 = [[ComboBox alloc] init];
[combo1 setComboData:fruitsArray]; //Assign the array to ComboBox
[self.view addSubview:combo1.view];
combo1.view.frame = CGRectMake(110, 69, 120, 31); //ComboBox location and size (x,y,width,height)