Swift4アプリ作成「TODOリストアプリ」続き2
frogwoman.hatenablog.jp 前回の続き
一応、「今日はここまでする」ってスケジュール立ててやってるのだけど
なかなか思うように上手くいってくれない
とりあえず今日の目標は「TODOの修正機能」を追加するでした。
できれば直接TODOリストの文字列を修正できるようにしようと思ってCustomCellのやり方をなんとか作ってみたのだけど
なんか微妙だなって思ったのでアラート画面を出してテキストボックスを配置することにしました
StoryboardでCustomCellれたけどコレジャナイ感があったので仕様を変える
— 吉田カエル@長崎 (@Frog_woman) 2017年12月13日
でももしかしたら直接編集できるようにするかもしれない(
まだ判定とか足りてないけどとりあえずできたのがこんな感じ
TODOアプリに修正機能追加ーー
— 吉田カエル@長崎 (@Frog_woman) 2017年12月13日
TableView関連ややこしや... pic.twitter.com/CIcYKifCZC
拘りとして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
追加として、テキスト欄で改行時にキーボードを下げる処理を追加
改行時にキーボードを下げるにはデリゲートプロトコルを採用しないといけないので、 まず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
Swift4アプリ作成「TODOリストアプリ」
2ヵ月前くらいにARKitが気になったのでメインのスマホをAndroid5からiPhone8にしました
iPhone8買ったー pic.twitter.com/mqP8A1GeGD
— 𝔽𝕣𝕠𝕘𝕎𝕠𝕞𝕒𝕟♂N ͣg ͣs ͣk ͥ (@FrogWomanJP) 2017年10月22日
因みに
さよならバイバイ El capitan pic.twitter.com/XSviRqr7cp
— 𝔽𝕣𝕠𝕘𝕎𝕠𝕞𝕒𝕟♂N ͣg ͣs ͣk ͥ (@FrogWomanJP) 2017年10月31日
El capitanではARKitが使えるXcode9が使えない為全てはmacOS sierra 以上にしか対応してないXcodeの為に pic.twitter.com/FefWs6Cn1n
— 𝔽𝕣𝕠𝕘𝕎𝕠𝕞𝕒𝕟♂N ͣg ͣs ͣk ͥ (@FrogWomanJP) 2017年10月31日
そして多分
この日からかな。Swiftの勉強をし始めました。挿入るだけ pic.twitter.com/KPQrzD927Q
— 𝔽𝕣𝕠𝕘𝕎𝕠𝕞𝕒𝕟♂N ͣg ͣs ͣk ͥ (@FrogWomanJP) 2017年11月6日
Swift4から始めたことになったのですが、ネットでSwiftコードを検索するとシンタックスがだいぶ違うようで Swift4を勉強してもSwift2とか3とかは書ける気がしません...
と、ずっとSwift4の基礎を勉強していたのですが、そろそろアプリを作ってみようと思い Helloアプリとして王道な「TODOリストアプリ」を作ってみることにしました
アプリを作ることによって、ちゃんと理解できているか、 また、勉強を始めた頃はあまりよく分かっていなかった部分の理解を深めることが狙いです
また作っていくことによって新たな学びが出でくると思うので、知見を深める為でもあります
...と、早速色々と躓いた部分は出てきました
Optionalのお勉強
— 𝔽𝕣𝕠𝕘𝕎𝕠𝕞𝕒𝕟♂N ͣg ͣs ͣk ͥ (@FrogWomanJP) 2017年12月11日
どこよりも分かりやすいSwiftの"?"と"!" https://t.co/vhjE3X2wER
分かりやすかった。でもOptional ValueにするかImplicitly Unwrapped Optionalにするかは慣れて判断するしかないのかなあ
— 𝔽𝕣𝕠𝕘𝕎𝕠𝕞𝕒𝕟♂N ͣg ͣs ͣk ͥ (@FrogWomanJP) 2017年12月11日
Optional Chainingはnilの場合には処理をキャンセルするんだなー便利そう
ifかelseで値が変わる変数を設定するSwiftっぽいやり方 https://t.co/fzMfPyc3CN
— 𝔽𝕣𝕠𝕘𝕎𝕠𝕞𝕒𝕟♂N ͣg ͣs ͣk ͥ (@FrogWomanJP) 2017年12月11日
Optional Valueに関してはあやふやだったまま進めてた感じだったのですが、割と重要なとこだったみたいだったので学ぶ機会を作って良かったと思いますif letってOptional Valueがnilの場合にってことか
— 𝔽𝕣𝕠𝕘𝕎𝕠𝕞𝕒𝕟♂N ͣg ͣs ͣk ͥ (@FrogWomanJP) 2017年12月11日
この辺最初に学んだ時、あんまり分かってなくて理解してなかったな...
完成品
王道としてSwiftでTODOアプリを作ってみた pic.twitter.com/aU5mekNeRS
— 𝔽𝕣𝕠𝕘𝕎𝕠𝕞𝕒𝕟♂N ͣg ͣs ͣk ͥ (@FrogWomanJP) 2017年12月11日
参考にさせて頂いた記事 mtomitomi.hatenablog.com qiita.com qiita.com
作成するにあたって、 TODOリストを検索してみると入力画面と一覧画面が別々になっているものが多かったのですが できればシンプルに入力画面と一覧画面を同じページにしたかったのでそれらの機能を同じページに置いてみました
ただ、入力内容が複雑になるとやっぱり入力欄が別である方が勝手が良いと思うので、その辺は考えてみようと思います
あとは、Storyboardを使わずにUIをコードで書くことを課題にしました
これはXcodeでのARでの表現にも繋がると思います (実際、AR上でUIを扱う際に躓いたのでアプリを作って基礎を固めようと思ったのもある)
そんな感じです、以上
続く