UITextField内的UIButton

问题描述:

我试图把一个UIButton放在UITextfield中,充当“完成”按钮来辞去响应者。我已经尝试了以下代码,当字段开始编辑UITextField中的done按钮时,leftView是可见的,但是如果我从datePicker中选择一个值或使用键盘(在模拟器中)进行任何文本输入,done按钮消失并显示右侧的clearButton。UITextField内的UIButton

现在看来似乎他们两人之间进行切换,我改变textFld.LeftViewMode,始终显示按钮,但不是想我......

在此先感谢!

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 


    txtFld = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 310, 25)]; 
    txtFld.placeholder = @"__/__/____"; 
    txtFld.font = [UIFont fontWithName:@"HelveticaNeue" size:11]; 
    txtFld.textAlignment = NSTextAlignmentCenter; 
    txtFld.contentVerticalAlignment = UIControlContentHorizontalAlignmentCenter; 
    txtFld.contentHorizontalAlignment = UIControlContentVerticalAlignmentCenter; 
    txtFld.clearButtonMode = UITextFieldViewModeWhileEditing; 
    txtFld.borderStyle = UITextBorderStyleRoundedRect; 

    UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    doneButton.bounds = CGRectMake(0, 0, 40, 20); 
    doneButton.frame = CGRectMake(0.0, 0.0, 40.0, 20.0); 
    doneButton.titleLabel.font = [UIFont fontWithName:@"HelveticaNeue" size:10]; 
    [doneButton setTitle:@"Done" forState:UIControlStateNormal]; 
    doneButton.imageEdgeInsets = UIEdgeInsetsMake(0, -16, 0, 0); 
    [doneButton addTarget:self action:@selector(resignResponder:) forControlEvents:UIControlEventTouchUpInside]; 
    doneButton.userInteractionEnabled = YES; 

    // Add button to the UITextField 
    txtFld.leftView = doneButton; 
    txtFld.leftViewMode = UITextFieldViewModeWhileEditing; 

    UIDatePicker *datePicker = [[UIDatePicker alloc] init]; 
    datePicker.datePickerMode = UIDatePickerModeDate; 
    [datePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged]; 
    [txtFld setInputView:datePicker]; 

    [self.view addSubview:txtFld]; 

} 

-(void)resignResponder:(UIButton *)sender{ 
     UITextField *associatedTxtFld = (UITextField *) sender.superview ; 
     if ([associatedTxtFld isFirstResponder]) { 
      [associatedTxtFld resignFirstResponder]; 
     } 
} 

-(void)datePickerValueChanged:(id)sender{ 
    UIDatePicker *picker = (UIDatePicker *)sender; 
    NSDateFormatter *formater = [[NSDateFormatter alloc]init]; 
    [formater setDateFormat:@"dd-MM-yyyy"]; 
    txtFld.text = [formater stringFromDate:picker.date]; 

} 
+0

你最好添加一个工具栏作为文本字段的inputAccessoryView。将完成按钮(以及可能的下一个和上一个按钮)添加到工具栏。这是一种更常见的方法。 – rmaddy 2013-03-18 20:01:40

下面的代码适合我。这可能是一个解决方案,以辞职你的选择视图

UITextField *dispayNameField = [UITextField alloc]init]; 
UIButton *userStatusButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    userStatusButton.frame=CGRectMake(0, 0, 20, 20); 
    [userStatusButton addTarget:self action:@selector(selectUserStatus) forControlEvents:UIControlEventTouchUpInside]; 
    displayNameField.rightViewMode = UITextFieldViewModeAlways; 
    displayNameField.rightView = _userStatusButton; 


-(void)selectUserStatus 
{ 
    displayNameField.inputView = _dataPickerView; 
    self.editUserProfileScrollView.scrollEnabled = YES; 
    UIActionSheet *actionSheetForDate = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil]; 
    [actionSheetForDate showInView:self.parentViewController.tabBarController.view]; 
    [actionSheetForDate setBounds:CGRectMake(0,0,320, 500)]; 
    UIDatePicker = [[UIDatePicker alloc]initWithFrame:CGRectMake(0, 50, 320, 216)]; 
    _dataPickerView.tag = 1; 
    _dataPickerView.showsSelectionIndicator = YES; 
    _dataPickerView.dataSource = self; 
    _dataPickerView.delegate = self; 
    [_actionSheetForDate addSubview:_dataPickerView]; 
    [_actionSheetForDate sendSubviewToBack:_dataPickerView]; 
    UIToolbar *pickerToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)]; 
    pickerToolbar.barStyle = UIBarStyleBlackTranslucent; 
    [pickerToolbar sizeToFit]; 
    UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(dismissActionSheetUserField)]; 
    UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil]; 
    UIBarButtonItem *btnBarCancel = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(dismissActionSheetUserField)]; 
    [pickerToolbar setItems:[NSArray arrayWithObjects:btnBarCancel,flexSpace,doneButton, nil] animated:YES]; 
    [_actionSheetForDate addSubview:pickerToolbar]; 
    displayNameField.inputAccessoryView = pickerToolbar; 
} 
+1

谢谢! rmaddy,Vinodh,我可能会改变主意并采取你建议的方法。 – Rubs 2013-03-19 12:11:30