2010-07-01 4 views
1

Это довольно распространенная тема и содержит много ответов.панель инструментов на верхней панели клавиатуры с первым ответчиком

Ситуация: У меня есть полный экран (минус панель инструментов) UITextView с UIToolbar внизу. когда UITextView получает первого ответчика, я хочу, чтобы панель инструментов скользила вверх по клавиатуре и добавила кнопку «done», которая отменит клавиатуру.

До сих пор: У меня это полностью работающее, основанное на this example. За исключением того факта, что когда я положил [textView becomeFirstResponder]; в свой viewDidLoad, панель инструментов не оживляет. Даже если вызывается keyboardWillShow. Кто-нибудь есть идеи?

Код: Точно так же вы не должны проверить пример кода, это то, что происходит:

В viewDidLoad:

- (void)viewDidLoad { 
    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 
    [nc addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; 
    [nc addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; 
    [textView becomeFirstResponder]; 
     [super viewDidLoad]; 
} 

В keyboardWillShow:

- (void)keyboardWillShow:(NSNotification *)notification { 
NSLog(@"keyboard will show"); 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationCurve:[[[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]]; 
    [UIView setAnimationDuration:[[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]]; 

    UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone 
                      target:self 
                      action:@selector(keyboardDone)]; 
    NSMutableArray *toolbarItems = [NSMutableArray arrayWithArray:[toolbar items]]; 
    [toolbarItems addObject:doneButton]; 
    [toolbar setItems:toolbarItems]; 

    CGRect frame = self.view.frame; 
    frame.size.height -= [[[notification userInfo] objectForKey:UIKeyboardBoundsUserInfoKey] CGRectValue].size.height; 
    self.view.frame = frame; 
    [UIView commitAnimations]; 
} 

ответ

3

Попробуйте перевести -becomeFirstResponder на номер -viewWillAppear:animated: или -viewDidAppear:animated:. Я думаю, что -viewDidLoad обычно вызывается непосредственно перед добавлением представления в иерархию представлений.

+0

Вы удивительны! Спасибо. Он не работает в -viewWillAppear: анимированный: но он работает с -viewDidAppear: анимированный. Я не знал порядка, в котором эти загружены, так что спасибо за то, что вы научили меня чему-то новому сегодня. – RyanJM

0

Добавьте это в ваш код

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { 

    return YES; 
} 

-(BOOL)textViewShouldBeginEditing:(UITextView *)textView{ 

    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(doneBtnTapped:)]; 

    // I put the spacers in to push the doneButton to the right side of the picker view 
    UIBarButtonItem *spacer1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace 
                       target:nil action:nil]; 

    // I put the spacers in to push the doneButton to the right side of the picker view 
    UIBarButtonItem *spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace 
                       target:nil action:nil]; 

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

    // Plug the keyboardDoneButtonView into the text field... 
    textView.inputAccessoryView = keyboardDoneButtonView; 

    return YES; 
} 

- (void)doneBtnTapped:(id)sender { 
    [yourTextView resignFirstResponder]; 
} 

И его все сделано ...