おーしまブログ

プログラミングやってます

【最新swift5】Realmを用いたToDoリストアプリの作成

こんにちは、おーしまです。

今回は、swiftでRealmデータベースを用いたアプリ開発ができたので記事にします。
f:id:tomo_bb_aki0118115:20201224225147p:plainf:id:tomo_bb_aki0118115:20201224225458p:plain


初心者向けなので、まだswiftの経験が浅い人は参考にしてください。




まず、Realmを使う下準備として「cocoapods」をインストールします。
cocoapodsとは、iOSアプリ作成のためのライブラリ管理をしてくれるツールのことで、profileというファイルにライブラリを記述して行けば簡単に管理できるというものです。(railsで言うGemfileのことかな)

と言うことで、


ターミナル

$ sudo gem install cocoapods

$ pod --version   #バージョン確認

$ pod setup

次に、xcodeで新規プロジェクトを立ち上げます。
「Create a new Xcode project」
iOS 」の 「App」 を選択
ProductNameは、「ToDoListOnRealm」としました。(好きな名前にしてください)
で作成!


ターミナル

$ cd ~/プロジェクト名(ToDoListOnRealm)   #プロジェクトのディレクトリに移動

$ pod init

これで、最初に説明した「Profile」というファイルが作られるので、それを編集します。


Profile

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'ToDoListOnRealm' do
  use_frameworks!
  pod 'RealmSwift'         # 追加

end

上記のように「pod 'RealmSwift'」を記述します。


そして、

ターミナル

$ pod install


次に、新しくXcodeを開くのですが、
新しくできた「ToDoListOnRealm.xcworkspace」から開きましょう。
f:id:tomo_bb_aki0118115:20201224223722p:plain
(上の画像の一番下のディレクトリのこと)




それでは、「storyboard」から作っていきます。
Main.storybord
f:id:tomo_bb_aki0118115:20201224224240p:plain

TableView、NavigationController、などを導入します。(ごめんなさい、ここは別の記事を見て実装してください)

画面遷移の方法は「プッシュ遷移」と「モーダル遷移」の2つがあり、「プッシュ遷移」は横移動で遷移、「モーダル遷移」は下から次の画面が出てきて遷移します。ですが、「Navigation Controller」を導入しないと、プッシュ遷移ができませんので注意してください。

TableViewの「Identifier」は「cell」とします。





コード
最初にRealmにテーブルを作ります。

新しく、「File」→「New」→「File...」→「Swift File」でテーブルを作るファイル?を作ります。(railsでいうマイグレーションファイルみたいなやつ)
ファイル名はなんでも良いですが、私は「ToDoModel.swift」にしました。
それを以下のように編集します。

import Foundation
import RealmSwift

class ToDoModel: Object{
    @objc dynamic var ToDoName: String? = nil
}

「ToDoName」というstring型のカラムを作りました。これにデータを保存していきます。


TableViewを表示する画面を、ViewController.swift
やることリストを追加する画面を、addViewController.swift
と紐づけました。



ViewController.swiftのコード

import UIKit
import RealmSwift

class ViewController: UIViewController {
    @IBOutlet weak var todoTable: UITableView!
    
    
    var todoItems: Results<ToDoModel>!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Realmのインスタンスを生成
        let realm_1 = try! Realm()
        
        // Realmのfunctionでデータを取得。functionを更に追加することで、フィルターもかけられる
        self.todoItems = realm_1.objects(ToDoModel.self)

    }
    
    // 画面遷移した際に、リロードして全てのリストを表示
    override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
     
            todoTable.reloadData()
    }

}

// Realmから取得したデータをTableViewに並べる
extension ViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.todoItems.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let todoCell:UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        let item:ToDoModel = self.todoItems[(indexPath as NSIndexPath).row];
        todoCell.textLabel?.text = item.ToDoName
        return todoCell
    }
}

addViewController.swiftのコード

import UIKit
import RealmSwift

class addViewController: UIViewController, UITextFieldDelegate {
    @IBOutlet weak var todoTextField: UITextField!
    
    var todoItems: Results<ToDoModel>!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        let realm_1 = try! Realm()
        
        self.todoItems = realm_1.objects(ToDoModel.self)
    }
    
    // 「追加」ボタンを押された時のアクション
    @IBAction func addButton(_ sender: Any) {
        let todoItem:ToDoModel = ToDoModel()
        todoItem.ToDoName = self.todoTextField.text
        
        let realm_2 = try! Realm()
        
        try! realm_2.write{
            realm_2.add(todoItem)
        }
        
        todoTextField.text = ""
        
    }
}


以上です。
それでは、また

ここはどこ おれはだれ それに近いものがあんだよ 始めようとした奴らも迷い始めてる 怖がらせないでよ そりゃ甘くはないけど まだまだ 夢見ていい世界なんでしょ {UVERwould「ハイ!問題作」}