我为每个表行记录都有一个UIPickerView。这是在函数
下- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
这是
中的代码部分picker = [[UIPickerView alloc]initWithFrame:CGRectMake(280, -45, 30, 20)];
[picker setDelegate:self];
arrayColors = [[NSMutableArray alloc] init];
[arrayColors addObject:@"1"];
[arrayColors addObject:@"2"];
[arrayColors addObject:@"3"];
[arrayColors addObject:@"4"];
[arrayColors addObject:@"5"];
[arrayColors addObject:@"6"];
[arrayColors addObject:@"7"];
[arrayColors addObject:@"8"];
[arrayColors addObject:@"9"];
[arrayColors addObject:@"10"];
[cell addSubview:picker];
当我点击它们时,我希望弹出(作为模态视图)选择器。当我选择它应该关闭的值时。有可能吗?
答案 0 :(得分:0)
是的,这是可能的。您需要创建一个包含UIPickerView
和2 UIButton
,OK和Cancel的视图控制器类。并以模态呈现。当用户点击确定按钮时,您可以通过委托将UIPickerView
上带有所选值的事件发送到表视图控制器并关闭视图控制器。
答案 1 :(得分:0)
覆盖UITextField并实现以下方法。然后将数字选择器插入单元格,将其附加到您要修改的值(使用UITextFieldDelegate或更改事件),然后就完成了。
- (UIView *)inputAccessoryView {
UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone
target:self
action:@selector(resignFirstResponder)];
UIBarButtonItem *spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
toolbar.items = @[spacer, item];
return toolbar;
}
- (UIView *)inputView {
if ((self.minimumNumber == 0) && (self.maximumNumber == 0)) {
self.minimumNumber = 0;
self.maximumNumber = 9;
}
UIPickerView *pickerView = [[UIPickerView alloc] init];
pickerView.backgroundColor = [UIColor whiteColor];
pickerView.dataSource = self;
pickerView.delegate = self;
[pickerView selectRow:(self.number - self.minimumNumber) inComponent:0 animated:NO];
return pickerView;
}
- (NSInteger)number {
return [self.text integerValue];
}
- (void)setNumber:(NSInteger)number {
self.text = [NSString stringWithFormat:@"%d", (int)number];
}
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return 1;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
return self.maximumNumber - self.minimumNumber + 1;
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
return [NSString stringWithFormat:@"%d", (int)(row + self.minimumNumber)];
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
self.number = (row + self.minimumNumber);
}
答案 2 :(得分:0)
这里有很多问题。
对数据源中的每一行都有一个单独的选择器实例是没有意义的。更好的设计可以让您将选择器数据与行相关联,并在选择时将数据加载到公共选择器中。
例如,如果您正在制作一个应用程序来接受食物订单,您可以将每行代表一个类别(例如饮料,主餐,配菜,甜点等),并将每个类别与一系列选项链接起来那个类别。对于这个,NSDictionary将是内部数据存储的一个很好的选择:您的密钥将是类别(可能是常量NSStrings),值将是不同选项的NSArrays。您的表将由这些常量NSString类别的数组填充,因此当点击单元格时,您可以查找它所代表的类别,并使用它来获取可能选项的数组。
然后,您可以在单个UIPickerView上设置这些选项。采摘者很昂贵 - 他们占用大量内存并且有很多子视图。为选择器可能显示的每组选项创建不同的选择器是非常糟糕的做法。
当用户选择值时解雇UIPickerView是个坏主意。用户可以在途中停止选择一个项目(他们真正想要的那个)。在这种情况下,您的应用程序将难以使用并惹恼他们。另外,如果他们想在列表中选择第一个(默认)选项,你会怎么做?
可以模态呈现UIPickerViews。最好的方法可能是将选择器作为inputView添加到单元格中。不幸的是,UITableViewCell不接受inputView本身。您可以通过聪明的UIResponder并创建一个子类来解决这个问题,该子类允许您分配一个inputView并允许自己捕获输入焦点:
@interface InputViewCell : UITableViewCell
@property ( nonatomic, strong, readwrite ) UIView * inputView;
@end
@implementation InputViewCell
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated];
// Configure the view for the selected state
if( selected && !self.isFirstResponder )
{
[self becomeFirstResponder];
}
else
{
[self resignFirstResponder];
}
}
- (BOOL)canBecomeFirstResponder { return YES; }
@end