マンガ読書管理アプリの設計メモ(13)

●「よみたい画面」のデータを登録するところの機能を作りました。

1.StoryboardでUI部品をポチポチ配置する。

UITextViewは罫線が表示できないので、そこはコードで実装します。

        // TextViewの罫線
       memoTextView.layer.cornerRadius = 5
       memoTextView.layer.borderColor = UIColor.lightGray.cgColor
       memoTextView.layer.borderWidth  = 0.2
       memoTextView.layer.masksToBounds = true

あと、ボタンも軽く曲げたいので、拡張クラスを活用しています。
以下をクラス定義すると、Storyboardで丸めたりできます。便利!

import UIKit
@IBDesignable
class ButtonCustom: UIButton {
   
   @IBInspectable var textColor: UIColor?
   
   @IBInspectable var cornerRadius: CGFloat = 0 {
       didSet {
           layer.cornerRadius = cornerRadius
       }
   }
   
   @IBInspectable var borderWidth: CGFloat = 0 {
       didSet {
           layer.borderWidth = borderWidth
       }
   }
   
   @IBInspectable var borderColor: UIColor = UIColor.clear {
       didSet {
           layer.borderColor = borderColor.cgColor
       }
   }
}

2.登録メモのに入力時に、キーボードで隠れてしまうのでスライド処理

上で説明しませんでしたが、キーボードで入力エリアが隠れるのを防ぐため、本画面はScrollViewを配置しています。

タブバーがあるので、持ち上げる幅は要調整ですね。

    // キーボードの高さを取得する
       guard let userInfo = notification.userInfo as? [String: Any] else {
           return
       }
       guard let keyboardScreenEndFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else{
           return
       }

        // タブバー
       let tabBarController: UITabBarController = UITabBarController()
       let tabBarHeight = tabBarController.tabBar.frame.size.height
       
       // 持ち上げる高さ = キーボードの高さ + タブバーの高さ       
       let liftY = keyboardScreenEndFrame.height - tabBarHeight

3.登録ボタンで登録処理

登録ボタンにおいては、新規登録時と更新時で分けて処理することと、登録した後に前画面に戻る考慮もしています。(新規登録か更新時からは前画面の操作に応じてフラグを引き渡して保持しています)
メッセージは面倒なので、ALRTというライブラリを使ってます。

        // 新規登録時
       if self.editingFlag == false{
           let addBook = WantBooks()
           addBook.key = getNowDateString()
           addBook.title = title
           addBook.author = author
           addBook.publisher = pubulisher
           addBook.finishFlag = self.finishSwitch.isOn
           addBook.memo = memo
           addBook.createDay = getNowDayString()
           
           try! realm.write {
               realm.add(addBook)
               
               ALRT.create(.alert, title: "登録しました").addOK(){
               action, textFields in
                   self.navigationController?.popViewController(animated: true)
               }.show()
           }
       }
       // 更新時
       else{
           let results = realm.objects(WantBooks.self).filter("key == '\(self.wantBook.key)'").first
           
           try! realm.write {
               results?.title = title
               results?.author = author
               results?.publisher = pubulisher
               results?.finishFlag = self.finishSwitch.isOn
               results?.memo = memo
               
               ALRT.create(.alert, title: "更新しました").addOK(){
               action, textFields in
                   self.navigationController?.popViewController(animated: true)
               }.show()
           }
       }

4.登録したデータを画面戻ったら表示

viewWillAppearを使いました。

    /// 画面再表示
   override func viewWillAppear(_ animated: Bool) {
       super.viewWillAppear(animated)
       let realm = try! Realm()
       print(Realm.Configuration.defaultConfiguration.fileURL!)
       self.wantBooks = realm.objects(WantBooks.self).sorted(byKeyPath: "key", ascending: false)

       tableView.reloadData()
   }

これで登録した結果は画面遷移時に一覧に表示されます。


細かな部分はだいぶスキップしましたが、大筋の流れで説明しているので、読みやすさは改善されたような気もします。

この辺りはもっと詳しく、という話があれば、コメントいただければと思います!

素敵なアプリやサービスが作れるようにひとりで開発を頑張っています。応援してくれると嬉しいです!