当单击带有 TextField 的警报时,UIPickerView 更改为正常的 textField

Posted

技术标签:

【中文标题】当单击带有 TextField 的警报时,UIPickerView 更改为正常的 textField【英文标题】:UIPickerView changes to normal textField when clicked on alert with TextField 【发布时间】:2016-04-06 12:06:51 【问题描述】:

我有一个文本字段说 jobTextFiels,其 inputView 是 UIPickerView,inputAccessoryView 是 UIToolBar。单击完成按钮(在工具栏中)时,如果从选择器中选择的行包含文本“其他”,则会出现样式为 plainTextStyle 的警报。我的问题是,如果用户从选择器中选择“其他”并单击警报时的添加按钮,则 jobTextField 会出现普通键盘。我已经尝试了所有方法,即在可能的情况下退出此文本字段,但对我没有任何帮助。

-(void)viewDidLoad

    pickerView = [[UIPickerView alloc] init];
    pickerView.delegate = self;
    pickerView.dataSource = self;
    pickerView.showsSelectionIndicator = YES;
    pickerView.backgroundColor=[UIColor whiteColor];
    _jobTypeTxtFld.inputView = pickerView;
    _genderTxtFld.inputView = pickerView;

    UIToolbar* numberToolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 50)];
    numberToolbar.barStyle = UIBarStyleDefault;
    numberToolbar.items = [NSArray arrayWithObjects:
                           [[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(doneWithNumberPad)],
                           nil];
    [numberToolbar sizeToFit];
    _jobTypeTxtFld.inputAccessoryView = numberToolbar;
    _genderTxtFld.inputAccessoryView = numberToolbar;


- (void)doneWithNumberPad

    if (_jobTypeTxtFld.isFirstResponder) 
        if ([self.jobTypeTxtFld.text isEqualToString:@"Others"])
        
            [UITextFieldAnimation moveContainerToInitialPositionWithView:self.bgView];
            jobAlert = [[UIAlertView alloc]initWithTitle:@"Please enter your job type" message:nil delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Add",nil];
            jobAlert.alertViewStyle = UIAlertViewStylePlainTextInput;
            [jobAlert show];
        
        else
        
            [self.addrssTxtFld becomeFirstResponder];
        
    
    //[self.view endEditing:YES];


- (void)alertView:(UIAlertView *)alertview clickedButtonAtIndex:(NSInteger)buttonIndex

switch (buttonIndex)
    
        case 0:
        

        
            break;

        case 1:
        
            if (alertview == jobAlert) 
               // [_jobTypeTxtFld resignFirstResponder];
                [[jobAlert textFieldAtIndex:0] resignFirstResponder];
                if ([[jobAlert textFieldAtIndex:0].text isEqualToString:@""])
                
                    [UITextFieldAnimation getAlertWithTitle:@"Message" andMessage:@"Please enter your job type!"];
                    [[jobAlert textFieldAtIndex:0] resignFirstResponder];
                
                else
                
                    self.jobTypeTxtFld.text = [jobAlert textFieldAtIndex:0].text;
                    [[jobAlert textFieldAtIndex:0] resignFirstResponder];
                
                [_jobTypeTxtFld resignFirstResponder];
            
        
            break;
        default:
            break;
    

#pragma mark
#pragma mark <UIPickerViewDataSource>
#pragma mark

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView

    return 1;


#pragma mark - picker delegate
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component

    if(_jobTypeTxtFld.isFirstResponder)
    
        [self.jobTypeTxtFld setText:[jobTypeArr objectAtIndex:row]];

    
    else if(_genderTxtFld.isFirstResponder)
    
        NSArray *arr = @[@"Male",@"Female"];
        [self.genderTxtFld setText:[arr objectAtIndex:row]];
    



// tell the picker how many rows are available for a given component
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 

    if(_jobTypeTxtFld.isFirstResponder)
    
        return [jobTypeArr count];

    
    else
    
       return 2;
    




// tell the picker the title for a given component
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component 
    if(_jobTypeTxtFld.isFirstResponder)
    
        return [jobTypeArr objectAtIndex:row];

    
    else
    
        NSArray *arr = @[@"Male",@"Female"];
        return [arr objectAtIndex:row];
    


// tell the picker the width of each row for a given component
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component 
    int sectionWidth = 300;

    return sectionWidth;

【问题讨论】:

你想要什么效果? 在上面的屏幕截图中,不应该显示带有警报“请输入您的工作类型”uipickerview 的屏幕截图,并且在最后一个屏幕截图中 UIPIckerview 已更改为正常键盘,这是错误的。我想要的是当用户点击完成按钮时消失选择器。 删除doneWithNumberPad中的第二个if,这是弹出警报视图的地方。或者删除其中的所有内容并取消注释[self.view endEditing:YES]; 如果从选择器中选择了其他人,我想显示警报的功能是我要如何删除第二个。是的,我已经尝试取消注释 [self.view endEditing:YES] 但没有用。 尝试在alertview clickedButtonAtIndex中使用endEditing 提醒期间的选择器是因为_genderTxtFld仍然是firstResponder。 【参考方案1】:

点击完成按钮调用方法regisignFirstResponder。我希望这会对你有所帮助。

【讨论】:

我什么都试过了。我已经在可能的情况下退出了 textField,例如在完成按钮单击时,在警报视图单击时。但是当显示带有 textField 的警报时,它会再次出现。出现此问题是因为警报包含 TextField 那么你必须写一些条件使得包含文本字段的警报不会出现 您在哪个 ios 上遇到问题? 与iOS版本无关。这是因为带有 TextField 的 alertview 从 ios 8 alertview 被贬低,这就是为什么要问。可能会造成问题。

以上是关于当单击带有 TextField 的警报时,UIPickerView 更改为正常的 textField的主要内容,如果未能解决你的问题,请参考以下文章

单击按钮时刷新带有框架集的页面

当键盘出现并启用滚动时,TextField 向上移动

有一个带有链接 Javascript 的 HTML 文档我试图在单击提交按钮时添加一条警报消息。我该怎么做呢?

仅在单击完成按钮时将 UIPickerView 选择添加到 TextField

在路由后,TextField单击重建/重新加载小部件

iOS:UIAlertController 上的 textField 成为当前警报时的第一响应者