2017-02-20 205 views
1

我這樣的代碼:鍵盤不顯示(IOS)

- (void)setupSubViews { 
    [self addSubview:self.textView]; 
    [self addSubview:self.sendButton]; 

    [self.textView mas_makeConstraints:^(MASConstraintMaker *make) { 
     make.top.equalTo(5); 
     make.bottom.equalTo(-5); 
     make.leading.equalTo(9); 
    }]; 
    [self.sendButton mas_makeConstraints:^(MASConstraintMaker *make) { 
     make.centerY.equalTo(self); 
     make.trailing.equalTo(-9); 
     make.leading.equalTo(self.textView.mas_trailing).offset(7); 
     make.width.equalTo(60); 
     make.height.equalTo(40); 
    }]; 
} 

展示功能,使TextView的becomeFirstResponder

- (void)show { 
    UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow]; 
    [keyWindow addSubview:self]; 
    [self mas_makeConstraints:^(MASConstraintMaker *make) { 
     make.leading.trailing.equalTo(0); 
     make.bottom.equalTo(InputHeight); 
    }]; 
    [self.textView becomeFirstResponder]; 
} 

此視圖添加到keyWindow在mainScreen底部,當鍵盤的框架改變時,翻譯會隨着鍵盤改變。

- (void)keyboardWillChangeFrame:(NSNotification *)noti { 
    if (!self.textView.isFirstResponder) { 
     return; 
    } 
    NSValue *endFrame = noti.userInfo[@"UIKeyboardFrameEndUserInfoKey"]; 
    CGFloat endY = [endFrame CGRectValue].origin.y; 
    BOOL isBackToBottom = endY == UI_SCREEN_HEIGHT; 
    CGFloat needOffset = endY - (UI_SCREEN_HEIGHT + InputHeight); 

    if (isBackToBottom) { 
     [UIView animateWithDuration:0.25 animations:^{ 
      self.transform = CGAffineTransformIdentity; 
     } completion:^(BOOL finished) { 
      [self removeFromSuperview]; 
     }]; 
    } else { 
     [UIView animateWithDuration:0.25 animations:^{ 
      self.transform = CGAffineTransformMakeTranslation(0, needOffset); 
     }]; 
    } 
} 

使用案例: 的viewController有一個按鈕,點擊按鈕的動作是這樣的:

- (void)beginChat { 
    [self.inputView show]; 
} 

self.inputView是上述customView,

- (LiveChatInputView *)inputView { 
    if (!_inputView) { 
     _inputView = [LiveChatInputView new]; 
     _inputView.sendBlock = ^(NSString *string) { 
      .... 
     }; 
    } 
    return _inputView; 
} 

現在我的問題是,當我們在應用程序啓動後第一次調用show函數,鍵盤將不會顯示,但在第二次調用時調用show函數我,每件事情都很好。

如何處理這個問題,THX。

+0

第一次調用show函數時檢查self.textView是否爲零。 –

+0

您正在從設備或模擬器進行測試嗎?在SIM卡上它有一個常見的問題,即鍵盤有時無法正常工作。 – zero3nna

+0

@Fahad Jamal我確定self.textView不是零 – Archerlly

回答

0

我犯了一個錯誤,在keyboardWillChangeFrame:函數調用[self removeFromSuperview]

我以爲UIKeyboardWillChangeFrameNotification只能在鍵盤上表演一次張貼或隱藏,所以我放回行動的實施keyboardWillChangeFrame:,並通過endFrame.origin.y == UI_SCREEN_HEIGHT

在實際控制,但事實是: 當鍵盤顯示,NSNotificationCenter將發佈UIKeyboardWillChangeFrameNotification三次:

第一 enter image description here 第二 enter image description here 第三 enter image description here

提示: 僅第一次顯示應用推出後的鍵盤,三個以上的第一UIKeyboardWillChangeFrameNotification,該endFrame.origin.y等於UI_SCREEN_HEIGHT

我的解決辦法: 觀察UIKeyboardWillHideNotification,並在此回調中執行回退操作。

感謝這個問題的所有答案。

0

調用此方法並不能保證該對象將成爲第一響應者。

蘋果

Responder對象只能成爲在當前 響應者辭職第一響應狀態(canResignFirstResponder) 和新的響應可以成爲第一個響應的第一個響應者。

嘗試調用becomeFirstResponder像下面,

[self.textView performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0]; 
+0

THX,但它不適合我。在'[self.textView becomeFirstrespond]'之前',self.textView.canBecomeFirstResponder返回yes – Archerlly