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

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

新規登録して質問してみよう
ただいま回答率
85.50%
iOS

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

Xcode

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

Swift

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

Q&A

解決済

3回答

4466閲覧

Swift 画面遷移時に動作させる関数を変えたい。

kevin.c.michael

総合スコア27

iOS

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

Xcode

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

Swift

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

0グッド

3クリップ

投稿2018/04/22 18:14

こんにちは

例えばAvcからBvcへ画面遷移をしたとします。

swift

1//AvcからBvcへ 2let storyboard: UIStoryboard = self.storyboard! 3let nextVC = storyboard.instantiateViewController(withIdentifier: "Bvc") as! Bvc 4self.present(nextVC, animated: true, completion: nil)

例えばですが、BvcにてDBから情報を取得してくる関数を設置していたとします。
その場合、一度Avcへ(dismissを使って)戻った後にBvcへ画面遷移したら、再びDBに接続する関数が動いてしまうかと思います。

この問題は上記画面遷移コードで新しくインスタンスを生成しているからかと思いますが、画面遷移時に動作させる関数を変えるなどでこれを解決する方法はありませんか?

どなたか回答よろしくお願いします。

また、現状自分の考えでは、

  1. 特定の引数とともに画面遷移し、それを条件分岐して動作させる関数を制御する方法

  2. UserDefaultに保存し、別VCにてその存在可否によって関数制御する方法

の2つだけです。

他に画期的な方法があるはずだと考えています。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2018/04/23 00:15

「DBに接続する関数」を実行するかどうかは、どうやって決まる(決める)のでしょうか?また、毎回実行されると困る理由は何でしょうか?
guest

回答3

0

遷移先VCに処理ハンドラ用のプロパティを用意するのが楽なんじゃないでしょうか

sample

Swift

1let nextVC = storyboard.instantiateViewController(withIdentifier: "Bvc") as! Bvc 2nextVC.mode = 1 3self.present(nextVC, animated: true, completion: nil)

Swift

1class Bvc: UIViewController { 2 3 var mode:Int? // viewDidLoad()前にセットされる 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 8 print("mode:(mode!)") // 1 9 10 } 11// ryo

DB接続に関してはDBオブジェクトのスコープをVCクラスよりも広くしてシングルトンで取り扱うのがよろしいかと。

投稿2018/04/23 03:55

編集2018/04/23 03:58
fromageblanc

総合スコア2724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

みなさん回答ありがとうございます。

自分の目的とするところがなんとなく分かりました。

https://teratail.com/questions/66912

こちらの質問の中に今回のサーバー接続負荷問題を解決できそうな内容がありました。

たぶんこれで解決できると思います。

投稿2018/04/23 04:58

kevin.c.michael

総合スコア27

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

もしかしたら、私の見当違いかもしれませんが、
UIViewControllerのライフサイクル、と調べてみてはいかがでしょうか?

下記記事が参考になるかと思います。
UIViewControllerのライフサイクル

基本的には、
画面に来た時に毎回実行される関数、
最初に画面に来た時だけに実行される関数というものがあります。

下記の、XcodeでViewControllerクラスに最初に記述されてる関数は、
初期表示時のみに実行される・・・だったはずです。

swift

1override func viewDidLoad() { 2 // 初期表示のみ実行 3}

他に、いくつか実行タイミングは各々で違いますが、
(関数の役割によって違う)
ページ表示毎に実行される関数がいくつか存在します。

swift

1override func viewWillAppear(_ animated: Bool) { 2 // ページ訪問毎に実行される(レイアウト前に実行) 3} 4 5 6override func viewWillDisappear(_ animated: Bool) { 7 // レイアウトもし終わった、一番最後に実行 8 super.viewWillDisappear(animated) 9}

上記以外にもいくつか、ページ表示時に毎回実行されるコールバック関数が存在するので、
試して見てはいかがでしょうか。

ちなみに、質問の内容を見る限りストーリーボードを通して、ページ移動をされていると思いますが、
その場合は、新規インスタンスだったとしても、上記の関数の違いがしっかり反映されるかと思います。
(毎回実行と一度だけ実行)
ただ、UINavigationControllerを使っていないなら、その限りじゃないかも・・・。

もしご質問の回答として不適切だった場合は申し訳ございません。

投稿2018/04/23 00:52

編集2018/04/23 00:56
miyabi_takatsuk

総合スコア9528

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2018/04/23 01:09 編集

>>一度Avcへ(dismissを使って)戻った後にBvcへ画面遷移したら と書かれています。Avcに戻った時点でBvcは破棄されますので、再度Bvcに遷移したときにもviewDidLoad()は呼ばれます。 また、「dismissを使って」とのことなので、Avc→BvcはUINavigationControllerによる遷移ではないと思います。
miyabi_takatsuk

2018/04/23 08:31

fuzzballさん> なるほど・・・。 大変失礼しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問