2011-09-03 8 views
6

Burada, programımı hata ayıkladığımda, her zaman klavyeWillShow işlevinin yanıt vermediğini gördüm. sadece ilk kez, program tarafından çağrılacak. İşte benim kodum, kodumda neyin yanlış olduğunu bilmiyorum, fakat klavye ilk görüntülendiğinde, işlev iyi çalışıyor.keyboardWillShow

- (void)keyboardWillShow:(NSNotification *)notification { 

    /* 
    Reduce the size of the text view so that it's not obscured by the keyboard. 
    Animate the resize so that it's in sync with the appearance of the keyboard. 
    */ 


    NSDictionary *userInfo = [notification userInfo]; 

    // Get the origin of the keyboard when it's displayed. 
    NSValue* aValue = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey]; 

    // Get the top of the keyboard as the y coordinate of its origin in self's view's coordinate system. The bottom of the text view's frame should align with the top of the keyboard's final position. 
    CGRect keyboardRect = [aValue CGRectValue]; 
    keyboardRect = [self.view convertRect:keyboardRect fromView:nil]; 

    CGFloat keyboardTop = keyboardRect.origin.y; 
    CGRect newTextViewFrame = self.textview.frame; 

    newTextViewFrame.size.height = keyboardTop - self.view.bounds.origin.y; 

    // Get the duration of the animation. 
    NSValue *animationDurationValue = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey]; 
    NSTimeInterval animationDuration; 
    [animationDurationValue getValue:&animationDuration]; 

    // Animate the resize of the text view's frame in sync with the keyboard's appearance. 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:animationDuration]; 

    textview.frame = newTextViewFrame; 

    [UIView commitAnimations]; 
} 
- (void)keyboardWillHide:(NSNotification *)notification { 

    NSDictionary* userInfo = [notification userInfo]; 

    /* 
    Restore the size of the text view (fill self's view). 
    Animate the resize so that it's in sync with the disappearance of the keyboard. 
    */ 
    NSValue *animationDurationValue = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey]; 
    NSTimeInterval animationDuration; 
    [animationDurationValue getValue:&animationDuration]; 

    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:animationDuration]; 

// textview.frame = self.view.bounds; 
    [self save]; 

    [UIView commitAnimations]; 
} 

ve ben regist bildirim

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    [[NSNotificationCenter defaultCenter] 
    addObserver:self 
    selector:@selector(keyboardWillShow:) 
    name:UIKeyboardWillShowNotification 
    object:nil]; 
    [[NSNotificationCenter defaultCenter] 
    addObserver:self 
    selector:@selector(keyboardWillHide:) 
    name:UIKeyboardWillHideNotification 
    object:nil]; 

} 

ve ben firstresponder istifa

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    [self save]; 
    self.textview = nil; 
    self.title = nil; 
    self.tags = nil; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil]; 


} 

burada kaldırın burada

- (IBAction)save:(id)sender { 
    self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addNote)] autorelease]; 

    [textview resignFirstResponder]; 


} 

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{ 
    self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(save:)] autorelease]; 
    [self setUpUndoManager]; 

    return YES; 


} 

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField{ 
    [self save]; 
    return YES; 

} 
+1

Daha fazla bilgiye ihtiyacınız var, ilk cevaplayıcıyı serbest bırakır mısınız? Burada, vb –

+0

evet, FirstResponder istifa ikinci kez oluyor benim kodudur - (BOOL) textFieldShouldBeginEditing: (UITextField *) textField { self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemDone hedef: self eylem : @selector (kaydet :)] autorelease]; [self setUpUndoManager]; [textField resignFirstResponder]; return YES; } - (BOOL) textFieldShouldEndEditing: (UITextField *) textField { [kendini kurtarır]; [textField resignFirstResponder]; return YES; } – leoyfm

+0

klavye göstergesinde ikinci kez görüntülendiğinde, keyboardWillShow yöntemi otomatik olarak çağrılmıyor. Diğer bir deyişle, klavye açılırken klavyeWillShow yöntemi ilk kez çalıştırılır. Bundan sonra, bu yöntem bir daha asla kaçmaz. – leoyfm

cevap

5

sen olduğundan emin olun benim kodudur ob'ı kaldırmak için herhangi bir kod yazmamak server ..... Lütfen klavyeWillHide yöntemini de sağlayın ....

+0

Gözlemci viewDidUnload yönteminde kaldırın. Aslında, onu kaldırmama rağmen sorun hala var. – leoyfm

+0

viewDidUnload öğesindeki gözlemciyi kaldırma serin .... Bir şeyi anlamıyorum ... neden yazdınız [textField resignFirstResponder]; textFieldShouldBeginEditing ... hakkında biraz daha fazla bilgi verin ..... – Mohammad

+0

biraz garip olabilir. Kullanıcı sadece metin alanına dokunduğunda klavyenin kaybolmasını istiyorum. ama klavye görünür ve ortadan kaybolan eylem arasında bir çatışma olduğunu biliyorum. Bu yöntemi kodumdan kaldırırım. ama problem hala var. Neden ilk defa, her şey iyi değil. metin alanı kaydırma mükemmeldir. ama bundan sonra, metin alanı kaydırma yapmıyor. Ben hata ayıklama yoluyla, klavyewillshow yöntemi ilk kez sonra asla çalışmadı. klavyewillshow yönteminde yazdığım metin çerçevesi çerçevesini ayarlamak için kod. Böylece metin alanı ilk kez sonra kaymıyor. – leoyfm