取消后,Picker View不再出现,第二次单击文本字段

时间:2012-10-29 01:37:15

标签: objective-c ios uipickerview

这是一个简化的代码,只有一个文本字段的视图控制器我也更新了标题以反映更新的问题。

运行时,我单击文本字段,它会显示选择器视图,我可以单击选择器视图上的值,它会显示在文本字段中。当我按下导航栏上的“完成”按钮时,我现在可以忽略选择器视图。但是现在当我第二次单击文本字段时,我没有让选择器视图第二次弹出。

import

@interface MyPickerViewViewController : UIViewController <UIPickerViewDelegate,
                                                      UIPickerViewDataSource,
                                                      UITextFieldDelegate>

@end


@interface MyPickerViewViewController () {
    UIPickerView *_pv;
    NSArray *_array;
    IBOutlet __weak UITextField *_tf;
}

@end

@implementation MyPickerViewViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    _array = [NSArray arrayWithObjects:@"One", @"Two", @"Three", nil];

// Do any additional setup after loading the view, typically from a nib.
    _pv = [[UIPickerView alloc] initWithFrame:CGRectZero];
    _pv.dataSource = self;
    _pv.delegate = self;
    _tf.inputView = _pv;

    UIToolbar*  mypickerToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 56)];
    mypickerToolbar.barStyle = UIBarStyleBlackOpaque;
    [mypickerToolbar sizeToFit];
    NSMutableArray *barItems = [[NSMutableArray alloc] init];
    UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc]    initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
    [barItems addObject:flexSpace];
    UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(pickerDoneClicked:)];
    [barItems addObject:doneBtn];
    [mypickerToolbar setItems:barItems animated:YES];
    _tf.inputAccessoryView = mypickerToolbar;

    _tf.delegate = self;

}

- (void)pickerDoneClicked:(id)sender
{
    [_pv removeFromSuperview];
    [_tf.inputView removeFromSuperview];
    [_tf.inputAccessoryView removeFromSuperview];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

// Added this method and now the picker view comes up every time I
// click on the text field, even after I dismiss it. However, the
// picker view is in wrong place, so I just have to adjust the
// CGRect assigned to it.
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    [self.view addSubview:_tf.inputAccessoryView];
    [self.view addSubview:_tf.inputView];
    return NO;
}
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    NSLog(@"Hello there");
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    [textField resignFirstResponder];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

- (void)selectRow:(NSInteger)row inComponent:(NSInteger)component animated:(BOOL)animated
{

}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(    NSInteger)component
{
    return [_array objectAtIndex:row];
}

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 1;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    return _array.count;
}

- (void) pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    _tf.text = [_array objectAtIndex:row];
}    

@end

4 个答案:

答案 0 :(得分:0)

我想你错过了这个:

[datePicker removeFromSuperview];
[pickerView removeFromSuperview];

答案 1 :(得分:0)

您可以尝试:

[self.view endEditing:YES];

在您的操作方法

答案 2 :(得分:0)

请参阅此添加更新

// Added this method and now the picker view comes up every time I
// click on the text field, even after I dismiss it. However, the
// picker view is in wrong place, so I just have to adjust the
// CGRect assigned to it.
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{    
    [self.view addSubview:_tf.inputAccessoryView];
    [self.view addSubview:_tf.inputView];
    return NO;
}  

答案 3 :(得分:0)

以下是适用于选择器视图和工具栏的已调整CGRect。我想知道,如果挑选者视图有默认高度吗?

- (void)viewDidLoad
{
    [super viewDidLoad];

    _array = [NSArray arrayWithObjects:@"One", @"Two", @"Three", @"Four", nil];

// Do any additional setup after loading the view, typically from a nib.
    CGRect viewRect = [[UIScreen mainScreen] bounds];
    CGFloat pvHeight = 235;
    CGFloat pvYpos = viewRect.size.height - pvHeight;

    CGRect pvRect = CGRectMake(viewRect.origin.x, pvYpos, viewRect.size.width, pvHeight);
    _pv = [[UIPickerView alloc] initWithFrame:pvRect];
    _pv.dataSource = self;
    _pv.delegate = self;
    _tf.inputView = _pv;

    CGFloat tbYpos = pvYpos-44;
    UIToolbar*  mypickerToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, tbYpos, viewRect.size.width, 44)];
    mypickerToolbar.barStyle = UIBarStyleBlackOpaque;
    [mypickerToolbar sizeToFit];
    NSMutableArray *barItems = [[NSMutableArray alloc] init];
    UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
    [barItems addObject:flexSpace];
    UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(pickerDoneClicked:)];
    [barItems addObject:doneBtn];
    [mypickerToolbar setItems:barItems animated:YES];
    _tf.inputAccessoryView = mypickerToolbar;

    _tf.delegate = self;

}