色々と誤った使い方をされていますね。。。
Realmのデータの構造を規定するファイルは別で作成する。
UIViewController(TableView)では呼び出しと登録のみ行う
に分ける必要があります。
今回だとまずデータの規定ファイル
Swift(Schedule.swift)
1
2import RealmSwift
3
4class Schedule: Object {
5
6 @objc dynamic var sid = 0
7 @objc dynamic var title = ""
8 @objc dynamic var details = ""
9
10 override static func primaryKey() -> String? {
11 return "sid"
12 }
13}
14
次にそれを呼び出すViewControllerのファイル
Swift(ListViewController.swift)
1
2import UIKit
3import RealmSwift
4
5class ListViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
6
7 @IBOutlet weak var tableView:UITableView!
8 let realm = try! Realm()
9 let totalSchedule = try! Realm().objects(Schedule.self)
10 var sId = 0
11
12 // MARK: -- TableViewControllerDelegate
13 func numberOfSections(in tableView: UITableView) -> Int {
14 return 1
15 }
16
17 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
18 return totalSchedule.count
19 }
20
21 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
22 print("[ListView]tableView<didSelectRowAt>indexPath:", indexPath)
23 self.sId = self.totalSchedule[indexPath.row].sid
24 }
25
26 // MARK: -- TableViewControllerDataSource
27 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
28 let cell = tableView.dequeueReusableCell(withIdentifier: "自分の設定しているCell名")
29 cell?.textLabel?.text = String(totalSechedule[indexPath.row].sid) + " " + totalSchedule[indexPath.row].title
30 // もし詳細も2行目に表示したいなら, Storyboardでcellのtypeをsubtitleに変えて、下記を記載
31 cell?.detailTextLabel?.text = totalSchedule[indexPath.row].details
32 }
33
34 // MARK: -- ViewController
35 override func viewDidLoad() {
36 print("[ListView]<viewDidLoad>")
37 super.viewDidLoad()
38 // Do any additional setup after loading the view, typically from a nib.
39 }
40
41 override func viewWillAppear(_ animated: Bool) {
42 self.tableView.reloadData()
43 }
44
45 override func didReceiveMemoryWarning() {
46 super.didReceiveMemoryWarning()
47 // Dispose of any resources that can be recreated.
48 }
49
50 // MARK: -- Segue
51 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
52 if segue.identifier == "設定したもの" {
53 let nextView: NextViewController = segue.destination as! NextViewController // 便宜的にNextViewとしました。
54 nextView.sId = self.sId
55 }
56 }
57
58}
わからないかと思って、そのままサンプル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で「タイトル、詳細」とし、配置しておきます。
Swift(InputViewController.swift)
1import UIKit
2import RealmSwift
3
4class InputViewController: UIViewController, UITextFieldDelegate {
5
6 var sId: Int = 0
7 @IBOutlet weak var TitleTextField: UITextField!!
8 @IBOutlet weak var DetailTextField: UITextField!
9 let realm = try! Realm()
10 let totalSchedule = try! Realm().objects(Schedule.self)
11 var schedule = Schedule()
12
13 // MARK: -- UITextFieldDelegate
14 func textFieldShouldReturn(_ textField: UITextField) -> Bool {
15 self.saveToRealm()
16 textField.resignFirstResponder()
17 }
18
19 // 戻るボタンを作成したら下記を記載してください
20 // self.dismiss(animated: true, completion: nil)
21
22 // MARK: -- Realm
23 func saveToRealm() {
24 try! realm.write {
25 self.schedule.title = self.TitleTextField.text!
26 self.schedule.details = self.DetailTextField.text!
27 }
28 }
29
30 func makeNewData() {
31 if totalSchedule.count == 0 {
32 self.schedule.sid = 0
33 } else {
34 let lastSid = totalSchedule.sorted(byKeyPath: "sid", ascending: false).first?.sid
35 self.schedule.sid = lastSid! + 1
36 }
37 try! realm.write {
38 realm.add(self.schedule)
39 }
40 }
41
42 // MARK: -- ViewController
43 override func viewDidLoad() {
44 print("[InputView]<viewDidLoad>")
45 print(" ... pushed id:", self.sId)
46 super.viewDidLoad()
47 self.makeNewData()
48 // Do any additional setup after loading the view, typically from a nib.
49
50 self.TitleTextField.delegate = self
51 self.DetailTextField.delegate = self
52 }
53
54 override func didReceiveMemoryWarning() {
55 super.didReceiveMemoryWarning()
56 // Dispose of any resources that can be recreated.
57 }
58
59}
teratileで何でもかんでも1から10まで作り方を質問すればいいと言うものではありませんよ。
自分も他の回答者も少なからず、お金をかけて習いに行ったり、講習を受けている人もいます。
自分で勉強して見ましょう。それでもわからないところがある場合、聞く場所です。
なお、自分で作ったプログラムを流用してコードを書き換えたものなので、
ところどころ、データの名前(sid, title, details)等、間違ってたらごめんなさい。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。