FROGWOMAN@長崎

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

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

frogwoman.hatenablog.jp 前回の続き

一応、「今日はここまでする」ってスケジュール立ててやってるのだけど

なかなか思うように上手くいってくれない

とりあえず今日の目標は「TODOの修正機能」を追加するでした。

できれば直接TODOリストの文字列を修正できるようにしようと思ってCustomCellのやり方をなんとか作ってみたのだけど

なんか微妙だなって思ったのでアラート画面を出してテキストボックスを配置することにしました

でももしかしたら直接編集できるようにするかもしれない(

まだ判定とか足りてないけどとりあえずできたのがこんな感じ

拘りとしてViewの部分もStoryboardを使わずSwiftコードで作りたかったので、Swiftコード部分の情報が出てこなくて梃子摺りました...

TableViewのCellのSwipeAction部分の実装に関しては分かりづらいし、サンプルがあっても古いしとかで同じように梃子摺ってる人が多いようでした

ある程度完成して良さそうなコードができたらQiitaかブログに書こうかなと思います

と言っても以下の参考URLを見れば大体分かるかと思います



参考URL
[ iOS アプリ ] UITableViewをコードで実装するときにあると便利なテンプレート ( swift 3 ) – Unknown Network

051 UITableViewに追加・削除機能を追加 · GitBook

045 TableViewのボタンの拡張 · GitBook

dev.classmethod.jp qiita.com amarron.blog 初めてでも分かる!カスタムセルをSwiftで使用する方法 | Yuuの悠々自適Blog


今度参考にしたいURL qiita.com

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

続く frogwoman.hatenablog.jp

Swift4アプリ作成「TODOリストアプリ」

2ヵ月前くらいにARKitが気になったのでメインのスマホをAndroid5からiPhone8にしました



因みに

El capitanではARKitが使えるXcode9が使えない為仕方なくmacOS sierraにアプデ

そして多分

この日からかな。Swiftの勉強をし始めました

Swift4から始めたことになったのですが、ネットでSwiftコードを検索するとシンタックスがだいぶ違うようで Swift4を勉強してもSwift2とか3とかは書ける気がしません...

と、ずっとSwift4の基礎を勉強していたのですが、そろそろアプリを作ってみようと思い Helloアプリとして王道な「TODOリストアプリ」を作ってみることにしました

アプリを作ることによって、ちゃんと理解できているか、 また、勉強を始めた頃はあまりよく分かっていなかった部分の理解を深めることが狙いです

また作っていくことによって新たな学びが出でくると思うので、知見を深める為でもあります

...と、早速色々と躓いた部分は出てきました

Optional Valueに関してはあやふやだったまま進めてた感じだったのですが、割と重要なとこだったみたいだったので学ぶ機会を作って良かったと思います



完成品



参考にさせて頂いた記事 mtomitomi.hatenablog.com qiita.com qiita.com



作成するにあたって、 TODOリストを検索してみると入力画面と一覧画面が別々になっているものが多かったのですが できればシンプルに入力画面と一覧画面を同じページにしたかったのでそれらの機能を同じページに置いてみました

ただ、入力内容が複雑になるとやっぱり入力欄が別である方が勝手が良いと思うので、その辺は考えてみようと思います

あとは、Storyboardを使わずにUIをコードで書くことを課題にしました

これはXcodeでのARでの表現にも繋がると思います (実際、AR上でUIを扱う際に躓いたのでアプリを作って基礎を固めようと思ったのもある)

そんな感じです、以上

続く

frogwoman.hatenablog.jp