嗨,任何人都可以帮我解决这个问题,我一直在关注这个问题上的很多问题,看起来有点复杂。我想设置一个选择器,通过触摸一个名为locationField的IBOutlet的文本字段来激活它。
我不想在我的故事板中添加选择器或工具栏和按钮,我宁愿以编程方式进行操作。
到目前为止,我有:
- (void)viewDidLoad
{
//populate picker arrays
locationPickerArray = [[NSArray alloc] initWithObjects:@"1",@"2",@"3",@"4",@"5", nil];
actionSheet = [[UIActionSheet alloc] initWithTitle:@"" delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];
[actionSheet showInView:self.view];
UIToolbar *pickerToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0,480,32)];
[pickerToolbar sizeToFit];
pickerToolbar.barStyle = UIBarStyleBlackTranslucent;
NSMutableArray *barItems = [[NSMutableArray alloc] init];
UIBarButtonItem *cancelBtn = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonSystemItemCancel target:self action:@selector(cancel_clicked:)];
[barItems addObject:cancelBtn];
UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
[barItems addObject:flexSpace];
UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(done_clicked:)];
[barItems addObject:doneBtn];
[pickerToolbar setItems:barItems animated:YES];
[actionSheet addSubview:pickerToolbar];
UIPickerView *picker = [[UIPickerView alloc] init];
picker.frame = CGRectMake(0, 44, 320, 216);
picker.delegate = self;
picker.dataSource = self;
picker.showsSelectionIndicator = YES;
[actionSheet addSubview:picker];
}
-(void)done_clicked:(id)sender
{
[actionSheet dismissWithClickedButtonIndex:0 animated:YES];
}
-(void)cancel_clicked:(id)sender
{
[actionSheet dismissWithClickedButtonIndex:0 animated:YES];
}
我对此有几个问题,它崩溃了:
* 由于未捕获的异常而终止应用 ' NSInvalidArgumentException',原因:' - [DetailsScreenViewController numberOfComponentsInPickerView:]:发送到无法识别的选择器 实例0xb505be0'
这是什么意思?
我的最后一个问题是,当点击我之前创建的iboutlet(位置字段)时,如何填充此选择器并将其分配给弹出窗口。
谢谢
答案 0 :(得分:1)
崩溃的原因是您已将[{1}}的实例指定为DetailsScreenViewController
的{{1}}和dataSource
而未实际实施这些方法协议。作业在这里进行:
delegate
特定崩溃告诉您尚未实施UIPickerView
picker.delegate = self;
picker.dataSource = self;
协议的一部分。您应该已经收到编译器实际警告。学习使用这些警告可能非常有用!无论如何,要修复它,为两种协议提供所有必需方法的实现。实现的细节将取决于您的应用程序的需求。如果您仍然需要帮助,请告诉我们。
关于你的第二个问题,我想现在将numberOfComponentsInPickerView:
置于UIPickerViewDataSource
内。我之前从未需要这样做,但这里有一个SO question,其中有很多背景的示例代码,不确定你是否已经读过那个。但我想你只是想等待你真正想要给选择者打电话的时间
UIPickerView
我认为你可以用 UIActionSheet
方法做到这一点,可能还有其他方法。我稍后会尝试做一些实验并更新这篇文章。
修改强>
如果您将视图控制器指定为您感兴趣的任何文本字段的委托,那么您可以实现此[actionSheet showInView:self.view];
方法:
UITextFieldDelegate
结束编辑
希望这有帮助,如果您有任何问题,请告诉我。