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

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

ただいまの
回答率

88.58%

swift 画面遷移を共通メソッドにしたい。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,444

sr2000

score 31

現在segueを使わず、画面遷移を行っています。
そこで毎回storyBoard名とstoryBoardIdを入力して、storyboardとviewControllerを取得するコードを書くのが面倒で、Utility.swiftというファイルを作成(新規作成時はcocoaクラスではなくswiftファイルを指定)してそこに引数をstoryBoardName,storyBoardIdにして
画面遷移する関数を用意して、coupunViewControllerのtabelViewのデリゲートメソッドないで利用してます。
現状はコメントアウトしてマスクしている箇所です。
しかしこの関数を使って画面遷移するとアプリが落ちてしまします。

わかる方がいらっしゃいましたら、ご教授宜しくおねがいします。

import Foundation
import UIKit

//共通メソッドはここに作成すること

//利用テスト→確認済み
func test() {
    print("利用テスト")
}

//画面遷移
//遷移方法→present
//基本的な画面遷移にし利用
//引数:StoryBoardName
//引数:StoryBoardID
//戻り値なし

func changeViewPresent(storyBoardName: String, storyBaordId: String) {
    //storyBaord取得
    let storyBaord: UIStoryboard = UIStoryboard(name: storyBoardName, bundle: nil)
    //viewController取得
    let viewController: UIViewController = storyBaord.instantiateViewController(withIdentifier: storyBaordId)
    //画面遷移
    viewController.present(viewController, animated: true, completion: nil)

}




//画面遷移
//遷移方法→push
//navigationController利用時に必ず使うこと
//引数:StoryBoardName
//引数:StoryBoardID
//戻り値なし
 func changeViewPush1(storyBaordName: String, storyBoardId: String) {
    //storyBaord取得
    let storyBaord: UIStoryboard = UIStoryboard(name: storyBaordName, bundle: nil)
    //viewController取得
    let viewController: UIViewController = storyBaord.instantiateViewController(withIdentifier: storyBoardId)
    //画面遷移
    //UINavigationController.pushViewController(viewController)
    viewController.present(viewController, animated: true, completion: nil)
}

class Vc: UIViewController {

    //画面遷移
    //遷移方法→push
    //navigationController利用時に必ず使うこと
    //引数:StoryBoardName
    //引数:StoryBoardID
    //戻り値なし
    func changeViewPush2(storyBaordName: String, storyBoardId: String) {
        //storyBaord取得
        let storyBaord: UIStoryboard = UIStoryboard(name: storyBaordName, bundle: nil)
        //viewController取得
        let viewController: UIViewController = storyBaord.instantiateViewController(withIdentifier: storyBoardId)
        //画面遷移
        //navigationController?.pushViewController(viewController, animated: true)
    //UINavigationController.pushViewController(ViewController)
    }


}
import UIKit

class CouponViewController: UIViewController {



    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.delegate = self
        tableView.dataSource = self
        // Do any additional setup after loading the view.
    }


    @IBOutlet weak var tableView: UITableView!

    @IBAction func tappedSave(_ sender: Any) {
        print("保存する")
    }


    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
    }
    */




}

extension CouponViewController: UITableViewDelegate, UITableViewDataSource {

    //セルの行数
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 10
    }


    //セルの高さ
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 150
    }
    //セルの内容
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "couponCell", for: indexPath) as? CouponCell ?? CouponCell()
        //cell.couponImage
        cell.storeName.text = "餃子の王将"
        cell.couponTitle.text = "餃子一人前サービス"
        cell.couponText.text = "ここに詳しい内容がい記載されます!!"
        cell.expirationDate.text = "2018年9月22日"
        return cell
    }

    //選択時の処理
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        //処理
        let storyBoard = UIStoryboard(name: "CouponDetail", bundle: nil)
        let viewController = storyBoard.instantiateInitialViewController() as! UIViewController
        //IDを指定しても可能だが、initであるときは不要→エラー回避
        //let viewController = storyBoard.instantiateViewController(withIdentifier: "nav")
        navigationController?.pushViewController(viewController, animated: true)

        //テスト
        //changeViewPresent(storyBoardName: "CouponDetail", storyBaordId: "nav")
        //a.changeViewPush2(storyBaordName: "CouponDetail", storyBoardId: "nav")
        //changeViewPush(storyBaordName: "CouponDetail", storyBoardId: "nav")
        //a.changeViewPush(storyBaordName: "CouponDetail", storyBoardId: "nav")
        //テストここまで

    }

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • fuzzball

    2018/11/05 09:26

    エラーメッセージを書いて下さい。

    キャンセル

  • sr2000

    2018/11/05 21:27

    デバッグエリアに表示されているエラーメッセージです。changeViewPresentを実行しています。2018-11-05 21:25:11.993194+0900 study[3670:859437] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Application tried to present modal view controller on itself. Presenting controller is <study.CouponDetailViewController: 0x10780c150>.' *** First throw call stack: (0x1a1d0fea0 0x1a0ee1a40 0x1ce81841c 0x1ce81aa38 0x1ce81b09c 0x1ce81a990 0x1ce81accc 0x100649030 0x10064c40c 0x10064c4c8 0x1cefd7c14 0x1cefd7e78 0x1cedd8cd0 0x1cedc6ccc 0x1cedf5fa0 0x1a1c9f7a8 0x1a1c9a43c 0x1a1c9a9dc 0x1a1c9a1cc 0x1a3f11584 0x1cedcd054 0x10064f484 0x1a175abb4) libc++abi.dylib: terminating with uncaught exception of type NSException (lldb)

    キャンセル

回答 1

checkベストアンサー

0

self.present(viewController, animated: true, completion: nil)

おそらくこうでは?
取得したviewControllerから遷移させてますよ

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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