質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.75%

  • Swift

    6708questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Xcode

    3855questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • iOS

    3802questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

  • Realm

    186questions

    RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

RealmSwiftについて

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 151

haruka-t

score 74

import UIKit
import RealmSwift

class CellData {
    var title: String = ""
    var details: [String] = []

    init(_ title: String) {
        self.title = title
    }

    func append(detailText: String) {
        details.append(detailText)
    }
}
import RealmSwift
import UIKit

class ViewController: UIViewController, DetailCellDelegate {


    @IBOutlet weak var mytableView: UITableView!


  var cellData: [CellData] = []

 class ToDotitle: Object {
  @objc dynamic var titleName: String = "" //をclass直下の行に記載
    var list = List<String>()
  }
  let nametitle = ToDotitle()








    override func viewDidLoad() {
        super.viewDidLoad()

      self.navigationItem.title = nametitle.titleName//titleName
      let textAttributes = [NSAttributedStringKey.foregroundColor:UIColor.red]
      navigationController?.navigationBar.titleTextAttributes = textAttributes

      let backButtonItem = UIBarButtonItem(title: "back", style: .plain, target: nil, action: nil)
      navigationItem.backBarButtonItem = backButtonItem

      // 上記で代入したテキストデータを永続化するための処理
      do{
        let realm = try Realm()
        try realm.write({ () -> Void in
          realm.add(nametitle)
          print("ToDo Saved")
        })
      }catch{
        print("Save is Faild")
      }
    }

 やりたいこと

CellDataのクラスの var title: String = "" var details: [String] = []をrealmで入力したデータを保存したい。

 困っていること

var title: String = "" var details: [String] = []がすでにCellDataクラスの中に入っているのでどうObjectのクラスの中に入れればいいか分からなくて困っています。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

色々と誤った使い方をされていますね。。。

Realmのデータの構造を規定するファイルは別で作成する。
UIViewController(TableView)では呼び出しと登録のみ行う
に分ける必要があります。

今回だとまずデータの規定ファイル

import RealmSwift

class Schedule: Object {

    @objc dynamic var sid = 0
    @objc dynamic var title = ""
    @objc dynamic var details = ""

    override static func primaryKey() -> String? {
        return "sid"
    }    
}

次にそれを呼び出すViewControllerのファイル

import UIKit
import RealmSwift

class ListViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView:UITableView!
    let realm = try! Realm()
    let totalSchedule = try! Realm().objects(Schedule.self)
    var sId = 0

    // MARK: -- TableViewControllerDelegate
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return totalSchedule.count
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("[ListView]tableView<didSelectRowAt>indexPath:", indexPath)
        self.sId = self.totalSchedule[indexPath.row].sid
    }

    // MARK: -- TableViewControllerDataSource
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "自分の設定しているCell名")
        cell?.textLabel?.text = String(totalSechedule[indexPath.row].sid) + " " + totalSchedule[indexPath.row].title
        // もし詳細も2行目に表示したいなら, Storyboardでcellのtypeをsubtitleに変えて、下記を記載
        cell?.detailTextLabel?.text = totalSchedule[indexPath.row].details
    }

    // MARK: -- ViewController
    override func viewDidLoad() {
        print("[ListView]<viewDidLoad>")
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func viewWillAppear(_ animated: Bool) {
        self.tableView.reloadData()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // MARK: -- Segue
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "設定したもの" {
            let nextView: NextViewController = segue.destination as! NextViewController // 便宜的にNextViewとしました。
            nextView.sId = self.sId
        }
    }

}

わからないかと思って、そのままサンプルprogramを載せました。
入力系はここには記載しませんが。。。

最後のsegueでschedule ID(sId)を次のViewに送ってあげて、
次のViewではそのIDを元に取得すれば、同じデータを取得できます。

他の質問としてされていた、
遷移先のNavigationBarでのTitleに設定する時も
そのsIdをキーとしてRealmから検索し、
title, detailを取得すれば解決します。

ここまでにしようと思いましたが、
どうせ、次にまた質問が立つだけかと思いますので、

入力系も一応下に書いておきます。
まず、入力Viewは別UIViewController(UIViewController)を作りましょう。
ListViewのNavigationBar右上に「+」ボタンを配置し、
そこからpresent Modallyで別UIViewControllerに繋ぎます。
UIViewControllerにはUItextFeildを2個配置し、
それぞれその左側にUILabelで「タイトル、詳細」とし、配置しておきます。

import UIKit
import RealmSwift

class InputViewController: UIViewController, UITextFieldDelegate {

    var sId: Int = 0
    @IBOutlet weak var TitleTextField: UITextField!!
    @IBOutlet weak var DetailTextField: UITextField!
    let realm = try! Realm()
    let totalSchedule = try! Realm().objects(Schedule.self)
    var schedule = Schedule()

    // MARK: -- UITextFieldDelegate
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
            self.saveToRealm()
            textField.resignFirstResponder()
    }

    // 戻るボタンを作成したら下記を記載してください
    // self.dismiss(animated: true, completion: nil)

    // MARK: -- Realm     
    func saveToRealm() {
        try! realm.write {
            self.schedule.title = self.TitleTextField.text!
            self.schedule.details = self.DetailTextField.text!
        }
    }

    func makeNewData() {
        if totalSchedule.count == 0 {
            self.schedule.sid = 0
        } else {
            let lastSid = totalSchedule.sorted(byKeyPath: "sid", ascending: false).first?.sid
            self.schedule.sid = lastSid! + 1
        }
        try! realm.write {
            realm.add(self.schedule)
        }
    }

    // MARK: -- ViewController
    override func viewDidLoad() {
        print("[InputView]<viewDidLoad>")
        print(" ... pushed id:", self.sId)
        super.viewDidLoad()
        self.makeNewData()
        // Do any additional setup after loading the view, typically from a nib.

        self.TitleTextField.delegate = self
        self.DetailTextField.delegate = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }   

}

teratileで何でもかんでも1から10まで作り方を質問すればいいと言うものではありませんよ。
自分も他の回答者も少なからず、お金をかけて習いに行ったり、講習を受けている人もいます。
自分で勉強して見ましょう。それでもわからないところがある場合、聞く場所です。

なお、自分で作ったプログラムを流用してコードを書き換えたものなので、
ところどころ、データの名前(sid, title, details)等、間違ってたらごめんなさい。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    RealmSwiftでマイグレーションを実装したい

    前提・実現したいこと SwiftでRealmSwiftのマイグレーションを実装したいと思っています。Realmの公式のドキュメントを参考に以下のコードを書いたのですが、マイグレー

  • 解決済

    RLMArray に Object をappendしたい

    PersonクラスとしてRealmオブジェクトとして以下のようなものを定義していて、APIサーバーからPersonにデータをmappingさせて利用しています。 class

  • 解決済

    RealmSwiftがPlaygroundでImportできない。

    経緯 今回はiOSプロジェクトを作成し、そのプロジェクト内でPlaygroundを使用してRealmSwiftの挙動を逐次確認してみよう、という目的で遭遇したエラーになります。

  • 解決済

    RealmSwiftについて質問です。

    swiftでRealmSwiftについて質問です。 以下のようなエラーが出るのですが、解決法がわかりません。 どのようにすれば良いのか教えていただけるの幸いです。

  • 解決済

    RealmSwiftで特定日付のデータを抽出する方法を知りたい

    前提・実現したいこと 初心者です。 Realmに登録したDate()のデータから日付を指定して抽出・表示したいのですが、よくわからず立ち止まっています。 よろしくお願いします

  • 解決済

    URLSessionDownloadの仕組みとswiftでのzipファイルの操作に関して

    行いたいこと 前提: サーバー上にzipファイルが用意されているとする。 またそのzipファイルにはjson形式で記述された拡張子が「.json」のファイルが数個存在するものとする

  • 解決済

    RealmSwift マイグレーションにてカラム追加後、任意の値をセットしたい

    ご教授願えませんでしょうか。  状況 Realmマイグレーションをテストしたいと考えております。 Realmにテーブルが2つ存在しております(それぞれA、Bとします)

  • 解決済

    swift realm xcode

    現在、UserDefaultsを使ってテキストに入力した文字をラベルに反映させ、保存するという単純なものを作りましたが。これをRealmを使って同じようにさせたいのですが、本日使い

同じタグがついた質問を見る

  • Swift

    6708questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Xcode

    3855questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • iOS

    3802questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

  • Realm

    186questions

    RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。