Отклонение UIPickerView с кнопкой «Готово» на UIToolBar - PullRequest
4 голосов
/ 28 июня 2011

Я просто пробую, что лучше в отношении отклонения кнопки UIPickerView - на панели навигации или кнопки «Готово» на панели инструментов над окном выбора. Я реализовал обе кнопки и пытаюсь закрыть окно выбора и уволить первого респондента.

Как я могу отклонить UIPickerView с помощью кнопки «Готово» на панели инструментов?

Это мой код для UIToolBar:

UIToolbar* keyboardDoneButtonView = [[UIToolbar alloc] init];
keyboardDoneButtonView.barStyle = UIBarStyleBlack;
keyboardDoneButtonView.translucent = YES;
keyboardDoneButtonView.tintColor = nil;
[keyboardDoneButtonView sizeToFit];
UIBarButtonItem* doneButton = [[[UIBarButtonItem alloc] initWithTitle:@"Done"
                                                                style:UIBarButtonItemStyleBordered target:self
                                                               action:@selector(pickerDoneClicked:)] autorelease];

[keyboardDoneButtonView setItems:[NSArray arrayWithObjects:doneButton, nil]];

textField.inputAccessoryView = keyboardDoneButtonView;

Может ли кто-нибудь помочь мне с этим?

Ответы [ 3 ]

22 голосов
/ 28 июня 2011

У меня все получилось, хотя я уверен, что мое тестовое приложение намного проще в сравнении, поэтому, надеюсь, структура все еще работает для вас.

По сути, это все, что я сделал. У меня есть UIPickerView, UIDatePickerView и UITextField в IB. dataSource и delegate в pickerView связаны с владельцем файла, как и delegate textField.

В моем заголовке все они объявлены со следующей структурой

UISomething *object;
@property (nonatomic, retain) IBOutlet UISomething *object;

У меня также есть связанные протоколы (<UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate>). В файле реализации все синтезировано. Тогда в viewDidLoad у меня есть это.

- (void)viewDidLoad
{
    UIToolbar* keyboardDoneButtonView = [[UIToolbar alloc] init];
    keyboardDoneButtonView.barStyle = UIBarStyleBlack;
    keyboardDoneButtonView.translucent = YES;
    keyboardDoneButtonView.tintColor = nil;
    [keyboardDoneButtonView sizeToFit];
    UIBarButtonItem* doneButton = [[[UIBarButtonItem alloc] initWithTitle:@"Done"
                                                                    style:UIBarButtonItemStyleBordered target:self
                                                                   action:@selector(pickerDoneClicked:)] autorelease];

    [keyboardDoneButtonView setItems:[NSArray arrayWithObjects:doneButton, nil]];

    textField.inputAccessoryView = keyboardDoneButtonView;
    [datePicker removeFromSuperview];
    [pickerView removeFromSuperview];
    [super viewDidLoad];
}

Когда textField становится активным, я называю это

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    [self.view addSubview:pickerView];
    [self.view addSubview:datePicker];
}

Наконец, есть метод действия

- (IBAction)pickerDoneClicked:(id)sender {
    [datePicker removeFromSuperview];
    [pickerView removeFromSuperview];
    [textField resignFirstResponder];
}

Это все работает для меня. Все отображается и удаляется как следует. Так что, если повезет, это тоже поможет вам

2 голосов
/ 15 июня 2015

In Swift

lazy var inputToolbar: UIToolbar = {
    var toolbar = UIToolbar()
    toolbar.barStyle = .Default
    toolbar.translucent = true
    toolbar.sizeToFit()

    var doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Bordered, target: self, action: "inputToolbarDonePressed")
    var spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil)

    toolbar.setItems([spaceButton, doneButton], animated: false)
    toolbar.userInteractionEnabled = true

    return toolbar
}()

func inputToolbarDonePressed() {
    view.endEditing(true)
}

UITextFieldDelegate

func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
    textField.inputAccessoryView = inputToolbar

    return true
}
2 голосов
/ 28 июня 2011
-(void)pickerDoneClicked:(id)sender {
    [pickerView removeFromSuperview];
}

Или, если вы хотите отклонить его с помощью анимации, измените рамку просмотра с анимацией UIView, а затем удалите ее из суперпредставления.

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
[UIView setAnimationDelay:1.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

pickerView.frame = outOfScreenFrame;

[UIView commitAnimations];

где outOfScreenFrame находится где-то за пределами вашего окна приложения UIA.

...