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

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

ただいまの
回答率

88.93%

[swift] セルをタップしても画面遷移できない。

解決済

回答 1

投稿 編集

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

Kaguya_4869

score 98

質問したいこと

現在、Todoアプリのようなものを作っています。
そこで、一番最初の画面からコードを使って画面遷移をしようとしているのですが、セルをタップしても画面遷移ができません。
特にエラーなどは出ていません。

コード

//一番最初の画面
import UIKit

final class ViewController: UIViewController {

    // MARK: IBOutlet

    @IBOutlet weak var tableView: UITableView!

    // MARK: Properties

    private let model = UserDefaultsModel()
    private var dataSource: [Memo] = [Memo]() {
        didSet {
            tableView.reloadData()
        }
    }

    // MARK: Lifecycle

    static func instance() -> ViewController {
        let vc = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() as! ViewController
        return vc
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        configureUI()
        configureTableView()
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        loadMemos()
    }

    // MARK: IBAction

    @objc
    private func onTapAddButton(_ sender: UIBarButtonItem) {
        let vc = AddViewController.instance()
        navigationController?.pushViewController(vc, animated: true)
    }
}

// MARK: - Configure

extension ViewController {

    private func configureUI() {
        navigationItem.title = "メモ一覧"
        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(onTapAddButton(_:)))
    }

    private func configureTableView() {
        tableView.delegate = self
        tableView.dataSource = self
        tableView.tableFooterView = UIView()
        tableView.rowHeight = TableViewCell.rowHeight
        tableView.register(TableViewCell.nib, forCellReuseIdentifier: TableViewCell.reuseIdentifier)
    }
}

// MARK: - Model

extension ViewController {

    private func loadMemos() {
        guard let memos = model.loadMemos() else { return }
        self.dataSource = memos
    }
}

// MARK: - TableView dataSource, delegate

extension ViewController: UITableViewDataSource, UITableViewDelegate {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dataSource.count
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        tableView.register(TableViewCell.self, forCellReuseIdentifier: NSStringFromClass(TableViewCell.self))
        let cell = tableView.dequeueReusableCell(withIdentifier: TableViewCell.reuseIdentifier, for: indexPath) as! TableViewCell
        let memo = dataSource[indexPath.row]
        cell.setupCell(title: memo.title, content: memo.content)
        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)

        let memo = dataSource[indexPath.row]
        let vc = DetailViewController.instance(memo)
        navigationController?.pushViewController(vc, animated: true)
        print("vc animated true")
    }
}
//詳細画面
import UIKit
import SwiftyTesseract

final class DetailViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    // MARK: IBOutlet

    @IBOutlet weak var titletextField: UITextField!
    @IBOutlet weak var contentTextView: UITextView!
    @IBOutlet weak var imageView: UIImageView!

    // MARK: Properties

    private let model = UserDefaultsModel()
    private var memo: Memo!
    let swiftyTesseract = SwiftyTesseract(language: RecognitionLanguage.japanese)

    // MARK: Lifecycle

    static func instance(_ memo: Memo) -> DetailViewController {
        print("before vc")
        let vc = UIStoryboard(name: "DetailViewController", bundle: nil).instantiateInitialViewController() as! DetailViewController
        print("after vc")
        vc.memo = memo
        print("vc.memo = memo")
        return vc
    }

    @objc func commitButtonTapped() {
        self.view.endEditing(true)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
            // donebuttonの実装
        let kbToolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: 320, height: 40))
        kbToolBar.barStyle = UIBarStyle.default // スタイルを設定
        kbToolBar.sizeToFit() // 画面幅に合わせてサイズを変更
        // スペーサー
        let spacer = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace,target: self, action: nil)
        // 閉じるボタン
        let commitButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.done, target: self, action: #selector(self.commitButtonTapped))
        kbToolBar.items = [spacer, commitButton]
        contentTextView.inputAccessoryView = kbToolBar
        configureUI()
    }
        @IBAction func tappedSwiftyTesseract(_ sender: Any) {
            guard let image = imageView.image else { return }

            swiftyTesseract.performOCR(on: image) { recognizedString in
                guard let text = recognizedString else { return }
                print("\(text)")
                self.contentTextView.text! = text
            }
        }

        @IBAction func launchCamera(_ sender: UIButton) {
                let camera = UIImagePickerController.SourceType.camera
                if UIImagePickerController.isSourceTypeAvailable(camera) {
                    let picker = UIImagePickerController()
                    picker.sourceType = camera
                    picker.delegate = self
                    self.present(picker, animated: true)
                }
                imageView.isHidden = false
                // imageButton.isHidden = true
            }
        //カメラロールから写真を選択する処理
        @IBAction func choosePicture() {
            // カメラロールが利用可能か?
            if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
                // 写真を選ぶビュー
                let pickerView = UIImagePickerController()
                // 写真の選択元をカメラロールにする
                // 「.camera」にすればカメラを起動できる
                pickerView.sourceType = .photoLibrary
                // デリゲート
                pickerView.delegate = self
                // ビューに表示
                self.present(pickerView, animated: true)
            }
        }

    //
        //ユーザーが撮影し終わった時の処理
        func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

                    imageView.image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage
            //        fatalError("Expected a dictionary containing an image, but was provided the following: \(info)")
                    let image = imageView.image
                    let pngImageData:Data = image!.pngData()!
                    let documentsURL:URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
                    let fileURL:URL = documentsURL.appendingPathComponent("image.png")
                    do{
                        try pngImageData.write(to: fileURL)
                    }catch{
                        print("書き込み失敗")
                    }
                    dismiss(animated: true, completion: nil)

                    //編集機能を表示させたい場合
                    //UIImagePickerControllerEditedImageはallowsEditingをYESにした場合に用いる。
                    //allowsEditingで指定した範囲を画像として取得する事ができる。
                    //UIImagePickerControllerOriginalImageはallowsEditingをYESにしていたとしても編集機能は表示されない。
    //                if info[UIImagePickerController.InfoKey.originalImage] != nil {
    //                    let image = info[UIImagePickerController.InfoKey.editedImage] as! UIImage
    //                    //画像を設定する
                        imageView.image = image
        }


        @IBAction func tappedSaveButton(sender: UIBarButtonItem) {
            saveMemo()
        }
//        シェアボタン
        @IBAction func showActivityView(_ sender: UIBarButtonItem) {
            let activitycontroller = UIActivityViewController(activityItems: [titletextField, contentTextView,imageView], applicationActivities: nil)

            self.present(activitycontroller, animated: true, completion: nil)
        }

    }

// MARK: - Configure

extension DetailViewController {

    private func configureUI() {
        // - Navigation
        navigationItem.title = "メモ詳細"
        // - Label
        titletextField.text = memo.title
        contentTextView.text = memo.content
        // - ImageView
        if let image = model.loadImage(id: memo.id) {
            imageView.image = image
        }
    }
}
extension DetailViewController {

    private func saveMemo() {
        guard let title = titletextField.text,
            let content = contentTextView.text else { return }

        // Save memo
        let memo = Memo(id: UUID().uuidString, title: title, content: content)
        if let storedMemos = model.loadMemos() {
            var newMemos = storedMemos
            newMemos.append(memo)
            model.saveMemos(newMemos)
        } else {
            model.saveMemos([memo])
        }

        // Save image
        if let image = imageView.image {
            model.saveImage(id: memo.id, image: image)
        }

        // Pop
        navigationController?.popViewController(animated: true)
    }
}

やってみたこと

print()とかをしてコンソールに出力しましたが、結局どこがダメなのかよくわかりませんでした。

追記

Main.storyboard
よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • hayabusabusash

    2020/03/05 21:18

    いえ、問題ないです 👍
    それではそのMain.storyboardのスクショを載せていただくことは可能ですか?

    キャンセル

  • Kaguya_4869

    2020/03/05 21:22

    スクショを載せておきました。
    左側にたくさん矢印があるのは、チュートリアル画面からのものです。

    キャンセル

  • Kaguya_4869

    2020/03/05 21:22

    その矢印の一つにEntry Pointもあります。

    キャンセル

回答 1

checkベストアンサー

0

最初に表示しているViewController
UINavigationController配下になっていないので、pushの遷移ができていないんだと思います。

ひとまずStoryboard上で最初に表示しているViewControllerを選択して、
Xcodeの上のメニューからEditor -> Embed In -> Navigation Controllerを選択して
UINavigationControllerを追加してみてください。

Xcode

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/03/05 21:45

    できました!
    本当にありがとうございます!!

    キャンセル

  • 2020/03/05 23:10

    自分が以前あげたサンプルを参考にしてくれていると思いますが、
    もしサンプルでわからない点があればGithubの方でissueとして立ててくれればお答えするので、
    気軽に聞いてください 🙇‍♂️

    キャンセル

  • 2020/03/06 08:53

    ありがとうございます😊
    その時にはよろしくお願いします🙇‍♀️

    キャンセル

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

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

関連した質問

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