Swift4アプリ作成「TODOリストアプリ」続き1
追加として、テキスト欄で改行時にキーボードを下げる処理を追加
改行時にキーボードを下げるにはデリゲートプロトコルを採用しないといけないので、 まずClassにUITextFieldDelegateを宣言し、テキストフィールドのdelegateプロパティにselfを設定します
class ViewController: UIViewController,UITextFieldDelegate
var textField:UITextField = UITextField() override func viewDidLoad() { textField.delegate = self }
あとは、改行が入力された時のデリゲートメソッドがあるのでメソッドと中の処理を記述すればOK
//改行の入力のデリゲートメソッド func textFieldShouldReturn(_ textField: UITextField) -> Bool { view.endEditing(true) //改行コードは入力しない return false }
今回は複数行入力する欄がないのでとりあえずこれだけ テキスト欄改行時じゃなくてEditボタン押した時とかも下げた方が良いだろうから割と面倒だな...
まだ試してないのですが以下の記事に色々なキーボードの下げ方が書かれているので参考にしたいなと思いました qiita.com
他に追加したとこは、Cellを並び替えできるようにしました UITableViewを扱うにはUITableViewDelegateとUITableViewDataSourceプロトコルを追加します UITableViewDelegateはテーブル操作のイベント処理、UITableViewDataSourceはテーブルのセクションやセルの値を設定するためのメソッドが定義されているプロトコルだそうです
class ViewController: UIViewController,UITextFieldDelegate,UITableViewDelegate,UITableViewDataSource {
あとはtableViewを作成してdelegateプロパティにselfを設定します
override func viewDidLoad() { super.viewDidLoad() //テーブルビューを作る let myTableView:UITableView let rect = CGRect(x:0,y:0,width:self.view.frame.width,height:self.view.frame.height) let myTableView = UITableView(frame:rect,style:.grouped) //テーブルビューのデリゲートを設定する myTableView.delegate = self // テーブルビューのデータソースを設定する myTableView.dataSource = self self.view.addSubview(myTableView) }
こんな感じですかね
因みに必須メソッド
// セルの個数を指定するデリゲートメソッド func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 0 } // セルに値を設定するデータソースメソッド func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "Cell") cell.textLabel?.text = "hoge" return cell }
最初、
移動されたデータを取得 let targetTitle = todoList?[sourceIndexPath.row] //CellValueを取得 if let index = todoList?.index(of:targetTitle!) { //元の位置のデータを配列から削除 todoList?.remove(at:index) //移動先の位置にデータを配列に挿入 todoList?.insert(targetTitle!, at: destinationIndexPath.row) }
って書いてて、そのままQiitaにあげたら 「それだと同じ文字列が渡ってきた時にどうなるの」ってコメントがきて あ、だめやん笑って気づきました..
テスト配列で同じ文字列を使ってなかったので気づけませんでした ってことで以下のように修正
//テスト配列 var todoList:[String] = ["todo01","todo02","todo01","todo03","todo04"] //並び替えが終わったタイミングで呼ばれるメソッド func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) { //sourceIndexPath にデータの元の位置、destinationIndexPath に移動先の位置 //CellValueを取得 if let targetTitle = todoList?[sourceIndexPath.row]{ //元の位置のデータを配列から削除 todoList?.remove(at:sourceIndexPath.row) //移動先の位置にデータを配列に挿入 todoList?.insert(targetTitle, at: destinationIndexPath.row) } }
あまりデリゲートの動きが分かってないので自信ないのですが、多分大丈夫だろうとこれをQiitaに載せました qiita.com
並び替えは以下のような感じ
良さそう pic.twitter.com/WEHt35c4cn
— 𝔽𝕣𝕠𝕘𝕎𝕠𝕞𝕒𝕟♂N ͣg ͣs ͣk ͥ (@FrogWomanJP) 2017年12月12日
このUITableViewってだいぶ面倒な感じがする.......
参考URL