画面遷移先が意図したようにならない
「ほんきで学ぶSwift+iosアプリ開発入門」というSwift2の本を参考にSwift4で作成した下記のコードで画面遷移先が意図したようになりません。
このコードでは初期画面のtableViewに新規作成用の+ボタンと作成保存した日記の一覧が表示されています。どちらかを選びSegueで画面遷移する際にprepareForSegueメソッドが呼ばれますが、Segueに名前をaddSegue、cellSegueとつけることで、新規作成と作成保存した画面とに中の処理を分けて表示させようとしています。
作成保存した日記の一覧から選んだときにcellSegueで記録された日記がでることを意図しているのですが、新規作成の画面が出てしまいます。作成保存した画面が出てこないのです。
<疑問点>
①Main.storyboardで初期画面であるViewControllerから遷移先のinputViewControllerに右クリックしながらドラック&ドロップしてsegueを作成し、IdentifierをcellSegueにすると本にありました。この時に、本のとおりにできないところがありました。それはtableViewの大きな四角い画面からはinputViewControllerへ右クリックしながらドラック&ドロップしても無反応でManualSegueを作成できなかったのです。それで、tableViewの大きな四角い画面の上部にあるViewControllerのアイコンをクリックしてドラック&ドロップしてsegueを作成し、IdentifierをcellSegueにしました。
これが原因なのかなと思っています。しかし、そうするとこの場合はどのようにすれば良いのでしょうか。
②コードの中にswift4にした場合の問題があるのではないかとも思っています。この場合はどこが問題なのでしょうか。
import UIKit
import RealmSwift
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var tableView: UITableView!
//デフォルトのレルムのインスタンスを作る
let realm = try! Realm()
//DB内のデータが格納されるリスト、日付順でソート・アップデートするとリスト内を自動更新
let dataArray = try! Realm().objects(Diary.self).sorted(byKeyPath: "date", ascending: false)
//`DateFormatter`のインスタンスを作ってプロパティに保持しておく
let dateFormatter: DateFormatter = {
let df = DateFormatter()
//デバイスの各種設定(タイムゾーン含む)に合わせ、システム標準の書式.mediumを使用する
df.dateStyle = .medium
df.timeStyle = .medium
return df
}()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
//入力画面から戻ってきたときにテーブルビューを更新させる
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
tableView.reloadData()
}
//segueで画面遷移するときに呼ばれる
override func prepare(for segue: UIStoryboardSegue, sender: Any?){
let inputViewController: inputViewController = segue.destination as! inputViewController
if segue.identifier == "cellSegue"{
let indexPath = self.tableView.indexPathForSelectedRow
inputViewController.diary = dataArray[indexPath!.row]
} else {
let diary = Diary()
diary.title = "タイトル"
diary.body = "本文"
if dataArray.count != 0 {
diary.id = dataArray.max(ofProperty: "id")! + 1
}
inputViewController.diary = diary
}
}
//各sectionのセルの数を返す
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return dataArray.count
}
//セルの内容
func tableView(_ tableView:UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
//再利用可能なセル
let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.subtitle, reuseIdentifier: "Cell")
//セルに値を設定する
let object = dataArray[indexPath.row]
cell.textLabel?.text = object.title
//cell.detailTextLabel?.text = object.date.description の行を以下のように変更
cell.detailTextLabel?.text = dateFormatter.string(from: object.date as Date)
return cell
}
//セルが削除可能なことを
func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
return UITableViewCellEditingStyle.delete;
}
//各セルを選択したときに実行
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
performSegue(withIdentifier: "cellSegue", sender: nil)
}
//deleteボタンが押されたときの処理
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == UITableViewCellEditingStyle.delete{
try! realm.write{
self.realm.delete(self.dataArray[indexPath.row])
tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.fade)
}
}
}
}