質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

3255閲覧

【Swift】UITableViewのTextFieldにキーボードを重ねないようにしたい

RagnAnet1373

総合スコア69

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/05/15 04:29

編集2017/05/15 06:08

###追記
関係ない所かもしれないのですが、画面外に表示されているセルに文字列を入力して
画面を上下に動かすと入力したセルがずれて動くという状態になっていることがわかりました。

###前提・実現したいこと
度々の質問大変申し訳ございません。
現在テーブルビューのカスタムセルにテキストフィールドを一つだけ設置し、
そのテキストフィールドに入力する際にキーボードが重なった場合
そのビューを上にずらして見えるようにするものを実現したいです

###発生している問題・エラーメッセージ
サイトを参考にし、以下のようにスクリプトしてみたのですが
アニメーション自体はするのですが、問題として
・選択した時点でアニメーションしない
・入力を始めるとゆっくりと画面の一番上にスクロールする
ということになり、入力しようとしているテキストフィールドの場所までアニメーションできませんでした

こちらのサイトを参考にしたのですが、やはりテーブルビュー並びにカスタムセルを使って動かす場合はまた違う設定をするのでしょうか・・・。

今回の悪いところ、または参考になるURLをご教示いただけると大変嬉しく思います。

宜しくお願い致します。
イメージ説明
``

@IBOutlet var firstTextField: UITextField!

サイトの中にありましたこの部分(画像のテキストフィールド)を接続しますと
Main.storyboard: error: Illegal Configuration:
The a outlet from the RandomController
to the Text_Custom is invalid.
Outlets cannot be connected to repeating content.

とでて繰り返し利用するものに直接接続はしてはならないというエラーが出てしまい、検索やライブラリなど探して見たのですがうまく起動させる方法を見つけられませんでした・・・。

swift

1//viewcontroller 2import UIKit 3 4class RandomController: UIViewController, UITableViewDelegate,UITableViewDataSource,InputTextTableCellDelegate,UITextFieldDelegate { 5 6 var delegate: InputTextTableCellDelegate! = nil 7 8 @IBOutlet weak var tableView: UITableView! 9 //@IBOutlet var textField: UITextField! 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 14 //デリゲートとデータソースを設定 15 tableView.delegate = self 16 tableView.dataSource = self 17 } 18 19 override func didReceiveMemoryWarning() { 20 super.didReceiveMemoryWarning() 21 } 22 23 24 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 25 return 10; 26 } 27 28 func numberOfSections(in tableView: UITableView) -> Int { // sectionの数を決める 29 return 1 30 } 31 32 33 func tableView(_ tableView: UITableView, cellForRowAt indexPath:IndexPath)->UITableViewCell{ 34 let cell: InputTextTableCell = tableView.dequeueReusableCell(withIdentifier: "InputTextCell",for: indexPath) as! InputTextTableCell 35 cell.delegate = self 36 return cell 37 } 38 39 // MARK: - UITableViewDelegate 40 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 41 return InputTextTableCell.height() 42 } 43 44 //セルの番号、並びにテキストフィールドの文字列を取得する 45 @nonobjc internal func textFieldDidEndEditing(cell: InputTextTableCell, value: NSString) -> () { 46 let path = tableView.indexPathForRow(at: cell.convert(cell.bounds.origin, to: tableView)) 47 NSLog("row = %d, value = %@", path!.row, value) 48 } 49 50 //テキストフィールドとキーボードが重ならないように移動 51 override func viewWillAppear(_ animated: Bool) { 52 53 super.viewWillAppear(animated) 54 self.configureObserver() 55 56 } 57 58 //入力が終わったら下げる 59 override func viewWillDisappear(_ animated: Bool) { 60 61 super.viewWillDisappear(animated) 62 self.removeObserver() // Notificationを画面が消えるときに削除 63 } 64 65 66 //Notificationを設定 67 func configureObserver() 68 { 69 let notification = NotificationCenter.default 70 notification.addObserver(self,selector:#selector(keyboardWillShow(notification:)),name: NSNotification.Name.UIKeyboardWillShow,object: nil) 71 notification.addObserver(self,selector:#selector(keyboardWillHide(notification:)),name: NSNotification.Name.UIKeyboardWillShow,object: nil) 72 } 73 74 //Notificationを削除 75 func removeObserver() 76 { 77 let notification = NotificationCenter.default 78 notification.removeObserver(self) 79 } 80 81 //キーボードが出た時、画面全体をずらしていく 82 func keyboardWillShow(notification: Notification?) 83 { 84 let rect = (notification?.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue 85 let duration: TimeInterval? = notification?.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as? Double 86 UIView.animate(withDuration: duration!,animations: { () in 87 let transform = CGAffineTransform(translationX: 0, y: -(rect?.size.height)!) 88 self.view.transform = transform 89 }) 90 } 91 92 //キーボードが消えた時に、画面を戻す 93 func keyboardWillHide(notification: Notification?) 94 { 95 let duration: TimeInterval? = notification?.userInfo?[UIKeyboardAnimationCurveUserInfoKey] as? Double 96 UIView.animate(withDuration: duration!,animations:{() in 97 self.view.transform = CGAffineTransform.identity 98 }) 99 } 100 101}

swift

1//custom cell 2import UIKit 3 4protocol InputTextTableCellDelegate { 5 func textFieldDidEndEditing(cell: InputTextTableCell, value: NSString) -> () 6} 7 8class InputTextTableCell: UITableViewCell,UITextFieldDelegate { 9 10 var delegate: InputTextTableCellDelegate! = nil 11 12 @IBOutlet weak var textField: UITextField! 13 14 override func awakeFromNib() { 15 super.awakeFromNib() 16 17 textField.returnKeyType = UIReturnKeyType.done 18 textField.delegate = self 19 } 20 21 override func setSelected(_ selected: Bool, animated: Bool) { 22 super.setSelected(selected, animated: animated) 23 } 24 25 static func height() -> CGFloat { 26 return 75.0 27 } 28 29 internal func textFieldShouldReturn(_ textField: UITextField) -> Bool { 30 textField.resignFirstResponder() 31 return true 32 } 33 34 internal func textFieldDidEndEditing(_ textField: UITextField) { 35 self.delegate.textFieldDidEndEditing(cell: self, value: textField.text! as NSString) 36 } 37}

###補足事項
Swift3、Xcode8.3で制作しております。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2017/05/15 04:35 編集

結局のところ、何を質問しているのでしょうか?
RagnAnet1373

2017/05/15 04:40

入力するためキーボードを出すとき、カスタムセル上のテキストフィールドが重ならないようにセルを上にずらしたい場合どのようにすればいいか、というところです。現在、実行した画面の一番下にある10番目のセルを入力しようとしても画面がうんともすんとも動かない状態です。
fuzzball

2017/05/15 04:56 編集

一番下以外は重ならないように画面を動かせているということでしょうか?
RagnAnet1373

2017/05/15 05:09

すいません、例を出したかったのですがわかりづらい表現になってしまい申し訳ございません・・・。現在全てのセルにおいてタップしてキーボードが出ると画面が動きません。文字を一つでも入力しようとキーボードをタップすると、入力しているところに最初行くのですが、その後一番上のメニューがあるところまでスライドしていきます。また、セルを入力した後セルの場所がずれ、あちこちと入力するとセルの内容が様々な場所へずれて行く状態になっています。また実機テストをするとアニメーションをしない状態になりました・・・。
t_obara

2017/05/15 07:33

そもそもですが、参考にしているものは、テキストフィールド単体をキーボードに合わせて移動しているもので、貴殿が実現したいものは、テキストフィールド単体ではなく、テーブルビュー自体を移動することではないのでしょうか。そうだとすると、テキストフィールドをテーブルビューと読み替えて実現を試みてはいかがでしょうか。あるいは、移動するのではなく、テーブルビューのサイズを変更するとか。
RagnAnet1373

2017/05/15 07:36

解釈の仕方を変えて調べたり考えたりするってことですね・・・、ありがとうございます。t_obaraさんの考え方を参考にもう一度調査・試行をしてみます。
fuzzball

2017/05/15 07:41

@t_obaraさん 参考にしている記事は、画面全体(self.view)を移動させています。
guest

回答2

0

自己解決

申し訳ございません。仕様を大幅に変更したため今回の質問は締めさせていただきます。

投稿2017/06/02 04:16

RagnAnet1373

総合スコア69

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

繰り返し利用するものに直接接続はしてはならないというエラーが出てしまい

ここだけ。Tableviewを置いているControllerのソースとは接続できないですね。
カスタムセル用のクラスを用意し、そのソース上で定義した変数であればアウトレット接続が可能です。

投稿2017/05/19 09:20

fromageblanc

総合スコア2724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問