2016-11-28 4 views
4

私のアプリはフォームを表示し、いくつかのセルに情報を入力できるテキストフィールドがあります。セルが画面の一番下にある場合、セルは完全にブロックされます。つまり、あなたが回答している質問が表示されないことがあります。私のUITableViewはUIViewControllerに組み込まれています。キーボードがセルをブロックしないようにする

私はこの問題への回答を提案し、コードのいくつかを実装した多くのスレッドを調べました。私は、このメソッドの動作を得ることができる場合、私は私のコードが動作すると信じて:

func textFieldDidBeginEditing(_ textField: UITextField) { 
    if (self.tableView.contentOffset.y == 0) 
    { 
     self.tableView.scrollToRow(at: self.tableView.indexPath(for:), at: UITableViewScrollPosition, animated: true) 
    } 
} 

今、私はそれがself.tableView.indexPath(for:)に入力できるように、アクティブセルを取得する問題を解決しようとしています。

どうすればいいですか?これは、キーボードの上のビューを動かす正しい方法ですか?

+0

静的であればフォームは動的か静的かを教えてください。次にコードなしでそれを達成するための非常に簡単な方法がありますか? –

+0

私は[IQKeyboardManager](https://github.com/hackiftekhar/IQKeyboardManager)を使ってテキストフィールドを移動し、ブロックされないようにしました。これまでのところ、私にとってはかなり良い仕事をしてきました。 – NerdsGeeksGurus

+0

キーボード通知を使用してそのような問題に対処する –

答えて

0

私がこの記事への答えをチェック
iOS Support External Keyboard Without Displaying One

また、のtableViewのために、私はキーボードで適切にセルを表示するために、このようなものを使用します。あなたがのtableViewのtableFooterViewのためのUIを持っている場合は

func textFieldDidBeginEditing(_ textField: UITextField) { 
    tableView.isScrollEnabled = false 
    var path: IndexPath? 

    path = theIndexPathOfTheCellWithTheTextField 

    if path != nil { 
     let rect = CGRect(x: 0, y: 0, width: tableView.frame.width, height: tableView.frame.height) 
     tableView.tableFooterView = UIView(frame: rect) 

     UIView.animate(withDuration: 0.6, animations: { 
      [weak self] in 
      self?.tableView.scrollToRow(at: path!, at: .top, animated: false) 
     }, completion: nil) 
    } 
} 

func textFieldDidEndEditing(_ textField: UITextField) { 
    tableView.tableFooterView = UIView() 
    tableView.isScrollEnabled = true 
} 

は、コードのこの部分よりも、変更またはフッターのビューで使用可能なサイズに基づいて削除する必要があるかもしれません。

EDIT - 詳細情報: indexPathを作成するには、いくつかのオプションがあります。あなたがそうのような細胞の場所を知っていればあなただけのハードコードは次のことができます。

//This works where neither theRowInt or theSectionInt are negative. 
IndexPath(row: theRowInt, section: theSectionInt) 

//So this would be the first section/first row 
IndexPath(row: 0, section: 0) 

次の方法は、あなたがテキストフィールドを通じて見つけセル上でそれをベースに次のようになります。

let textFieldCell = textField.superview.superview.superview as! UITableViewCell 
let indexPath = self.tableView.indexPathForCell(textFieldCell) 

これがあることを想定して動作しますあなたはスーパービューの正しい数です。 textFieldをcontentViewに直接配置すると、これはiOS 7以降の正しい番号になります。クラッシュした場合、それが動作するまで.superviewsの数を変更するだけではありません。

他にも方法がありますが、あなたが自分自身を研究するよりも興味がある場合は、 Hereはこの問題に関するスタックオーバーフローポストです。

+0

どのようにしてTheIndexPathOfTheCellTextFieldを取得しますか?私が上記のコードを実行することができるかのように思えます。 –

+0

編集しようとしていることを確認してください。 – Sethmr

+0

私はこのソリューションを試してみましたが、私と他の人達との運がなかったのです。これも動作していません。テキストフィールドをクリックすると、tableviewはまったくスクロールしません。ほんの少しの情報。私が作成したカスタムテーブルビューセルを使用しています。 uitableviewは、私のUIコントロールの2つのビュー間に配置されています。私はそれが正しくスクロールに影響を与えるかどうかはわかりません。どのように私はこれをデバッグすることができますか? –

0

この問題の最も簡単な解決策は、UIViewControllerではなくUITableViewControllerをtableViewプロパティに使用することです。

それは自動的にあなたのためにそれを処理します。私はよくあなたがUITableViewControllerを使用することはできない場合があることを認識していますが、可能であれば、あなたはすべきです。通常のコントローラにUITableViewControllerを埋め込んだコンテナビューコントローラを使用すると、より複雑な状況でもこれを実現できます。viewWillAppearで

0

あなたはUIKeyboardWillShowとUIKeyboardWillHide通知を登録:その後、

NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name:NSNotification.Name.UIKeyboardWillShow, object: nil) 
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name:NSNotification.Name.UIKeyboardWillHide, object: nil) 

あなたは、キーボードのフレームを取得し、変更keyboardWillHideで、その後のtableView

func keyboardWillShow(notification: Notification) { 
    guard let keyboardFrame = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue else { return } 
     let convertedFrame = view.convert(keyboardFrame, from: nil) 
     tableView.contentInset.bottom = convertedFrame.height 
} 

のインセットを変更keyboardWillShowに一番下を0に戻し、必要に応じてtableViewを特定の行にスクロールして戻します。これは、それをtableViewの最上部に位置する最初の行にスクロールします。

func keyboardWillHide(notification: Notification) { 
    tableView.contentInset.bottom = 0 
    tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true) 
} 

それがレイアウトに影響を与えるコードを整頓あなたのTextFieldのデリゲートを保持しますので、それはまたそれを行うには良い方法です。

私は私はあなたが状況

deinit { 
    NotificationCenter.default.removeObserver(self, name: Notification.Name.UIKeyboardWillShow, object: nil) 
    NotificationCenter.default.removeObserver(self, name: Notification.Name.UIKeyboardWillHide, object: nil) 

    // If you don't have any other notifications you wan't to keep observing you can remove yourself from all observers by using this one line 
    // NotificationCenter.default.removeObserver(self) 
    } 
1

に応じてviewWillDisappearまたはdeinitでこれらを置くべき安全プレーするのではなく、キーボードの通知を含み、特定の通知のオブザーバとして自分自身を削除する必要がないことをどこかで読ん信じますNotificationCenterを使用します。

関連する問題