Swiftはプログラムで別のビューコントローラー/シーンに移動します


83

次のコードを使用して、プログラムで別のViewControllerに移動しています。それはうまく機能しますが、それはどういうわけかを隠しますnavigation barこれを修正するにはどうすればよいですか?(ナビゲーションバーは、重要な場合にを埋め込むことViewControllerで作成されnavigation controllerます。)

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)

let nextViewController = storyBoard.instantiateViewControllerWithIdentifier("nextView") as NextViewController
self.presentViewController(nextViewController, animated:true, completion:nil)

回答:


208

スウィフト5

デフォルトのモーダル表示スタイルはカードです。これにより、前のView Controllerが上部に表示され、ユーザーは表示されたViewControllerをスワイプして離れることができます。

古いスタイルを保持するには、次のように表示するViewControllerを変更する必要があります。

newViewController.modalPresentationStyle = .fullScreen

これは、プログラムで作成されたコントローラーとストーリーボードで作成されたコントローラーの両方で同じです。

スウィフト3

プログラムで作成されたコントローラーを使用

プログラムで作成されたコントローラーに移動する場合は、次のようにします。

let newViewController = NewViewController()
self.navigationController?.pushViewController(newViewController, animated: true)

StoryBoardで作成されたコントローラーを使用

識別子「newViewController」を使用してStoryBoardのControllerに移動する場合は、次のようにします。

let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let newViewController = storyBoard.instantiateViewController(withIdentifier: "newViewController") as! NewViewController
        self.present(newViewController, animated: true, completion: nil)

2
「as!NewViewController」はストーリーボードオプションには必要ありません
Lavi Avigdor

2
ええ、それはオプションですが、表示すると、どのビューコントローラーが別の開発者の宛先であるかが明らかになります
jaiswal Rajan 2017

4
コールstoryBoard.instantiateViewControllerself.presentメインスレッドから、またはあなたはViewControllerをコンポーネントに現れるの遅れを持っています
アレックス・

2
@Alex見て、メインスレッドから呼び出すのは開発者次第です。上記の質問の回答を書いたところです。メインスレッドから呼び出すコメントはここでは適切ではありません。
jaiswal Rajan 2018

こんにちは覗き見:原則として、私はより親しみやすい口調を提案できますか?代わりに、トピックに(これはここではSO上かなり問題です):それは直接OPに頼まないですが、私はこれは良い答えはまだアクションがメインスレッド上で発生していること(誰の読みに)覚えておくべき適切な場所だと思います
superjos19年

32

SWIFT 4.x

二重引用符で囲まれた文字列は常に私を混乱させるので、この質問への回答には、これを明確にするためのグラフィック表示が必要だと思います。

銀行のアプリの場合、LoginViewControllerとBalanceViewControllerがあります。それぞれにそれぞれの画面があります。

アプリが起動し、ログイン画面が表示されます。ログインに成功すると、アプリはバランス画面を開きます。

外観は次のとおりです。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ログインの成功は次のように処理されます。

let storyBoard: UIStoryboard = UIStoryboard(name: "Balance", bundle: nil)
let balanceViewController = storyBoard.instantiateViewController(withIdentifier: "balance") as! BalanceViewController
self.present(balanceViewController, animated: true, completion: nil)

ご覧のとおり、小さな文字のストーリーボードID「バランス」はコードの2行目にあるものであり、これは添付のスクリーンショットのようにストーリーボード設定で定義されているIDです。

大文字の「B」を含む「バランス」という用語は、コードの最初の行で使用されるストーリーボードファイルの名前です。

コードでハードコードされた文字列を使用することは非常に悪い習慣であることを私たちは知っていますが、どういうわけかiOS開発ではそれが一般的な習慣になり、Xcodeはそれらについて警告さえしません。


素晴らしいデモンストレーション
エリアスファゼル

1
おい、すごい!
OhhhThatVarun

16

存在しない現在のナビゲーションコントローラーを使用して、新しいビューコントローラーをプッシュする必要があります。

self.navigationController.pushViewController(nextViewController, animated: true)

なぜプッシュする必要があるのですか?
DragonFire

1
@ DragonFire、opはナビゲーションバーを覆わなくても機能することを望んでいるため。whatsappの連絡先画面とチャット画面の間のようなマスター/詳細ページのデザインが必要な場合はpush、ナビゲーションコントローラーを備えたビューコントローラーが必要です。(左から右にアニメーション化されます)現在の画面にポップアップ(下から上にアニメーション化されます)を表示、表示、ポップアップするだけの場合は、を使用しますpresent
OkanKocyigit19年

ありがとうございました!私のナビゲーションを維持御馳走を作品コントローラタブなど
David_2877

12

@jaiswalRajanの回答によると。次のようにpushViewControllerを実行できます。

let storyBoard: UIStoryboard = UIStoryboard(name: "NewBotStoryboard", bundle: nil)
let newViewController = storyBoard.instantiateViewController(withIdentifier: "NewViewController") as! NewViewController
self.navigationController?.pushViewController(newViewController, animated: true)

1
こんにちは、ただ疑問に思っています:なぜすでに投稿された答えを繰り返すのですか?たぶんコメントや賛成も大丈夫だったでしょう。それとも、背後にさらに理由がありますか?
superjos

彼はNavigationControllerでナビゲートするために提示しています。ありがとうございました。
Hiran DAWalawage19年

4

したがって、View Controllerを提示すると、NavigationControllerには表示されません。完全な画面が表示されます。この場合、別のナビゲーションコントローラーを作成しnextViewController、これのルートとしてを追加して、この新しいnavigationControllerを提示する必要があります。

もう1つの方法は、ViewControllerを押すだけです。

self.presentViewController(nextViewController, animated:true, completion:nil)

詳細については、Appleのドキュメントを確認してください:-https//developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/#//apple_ref/doc/uid/TP40006926-CH3-SW96


presentViewController名前が変更されました present(loginController, animated:true, completion:nil)
kite_n_code 2017

2
OperationQueue.main.addOperation {
   let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
   let newViewController = storyBoard.instantiateViewController(withIdentifier: "Storyboard ID") as! NewViewController
   self.present(newViewController, animated: true, completion: nil)
}

の中にコードを入れるOperationQueue.main.addOperationと、メインスレッドで実行されます。


1

上記のコードはうまく機能しNSObjectますが、使用できないクラスからナビゲートしたい場合self.present

let storyBoard = UIStoryboard(name:"Main", bundle: nil)
if let conVC = storyBoard.instantiateViewController(withIdentifier: "SoundViewController") as? SoundViewController,
    let navController = UIApplication.shared.keyWindow?.rootViewController as? UINavigationController {
    
    navController.pushViewController(conVC, animated: true)
}

0

他のすべての答えは良さそうです。アニメーションのLaunchScreenを作成する必要があり、3〜4秒のアニメーションの後、次のタスクはホーム画面に移動するという私のケースを取り上げたいと思います。セグエを試してみましたが、デスティネーションビューに問題が発生しました。そのため、最後にAppDelegatesのWindowプロパティにアクセスし、それに新しいNavigationController画面を割り当てました。

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let homeVC = storyboard.instantiateViewController(withIdentifier: "HomePageViewController") as! HomePageViewController

//Below's navigationController is useful if u want NavigationController in the destination View
let navigationController = UINavigationController(rootViewController: homeVC)
appDelegate.window!.rootViewController = navigationController

場合によっては、宛先ビューにnavigationControllerが必要ない場合は、次のように割り当てます。

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let homeVC = storyboard.instantiateViewController(withIdentifier: "HomePageViewController") as! HomePageViewController
appDelegate.window!.rootViewController = homeVC
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.