FROG_WOMAN(FROGWOMAN)@長崎

http://blog.livedoor.jp/frog_woman から移転

Swift4アプリ作成「TODOリストアプリ」続き1

frogwoman.hatenablog.jp の続き

追加として、テキスト欄で改行時にキーボードを下げる処理を追加

改行時にキーボードを下げるにはデリゲートプロトコルを採用しないといけないので、 まず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を扱うにはUITableViewDelegateUITableViewDataSourceプロトコルを追加します 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

並び替えは以下のような感じ

このUITableViewってだいぶ面倒な感じがする.......

参考URL

yuu.1000quu.com

qiita.com

http://docs.fabo.io/swift/uikit/006_uitableview.html

himaratsu.hatenablog.com