web-dev-qa-db-ja.com

Swiftプログラムで別のView Controller /シーンに移動します

次のコードを使用して、プログラムで別のViewControllerに移動します。正常に機能しますが、navigation barをある程度非表示にします。 これを修正するにはどうすればよいですか?(必要に応じて、navigation controllerViewControllerを埋め込むことでナビゲーションバーが作成されます。)

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

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

In Swift

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

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

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

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

識別子「newViewController」を使用してStoryBoardのコントローラーに移動する場合は、次のようにします。

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

Swift 4.x

二重引用符で囲まれた文字列は常に私を混乱させるので、この質問への答えはこれを明確にするためにグラフィカルなプレゼンテーションが必要だと思います。

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

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

外観は次のとおりです。

enter image description here

enter image description here

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

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

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

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

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

19
zeeshan

存在しない現在のNavigation Controllerを使用して、新しいViewControllerをプッシュする必要があります。

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

彼の答え の@jaiswal Rajanによると。次のようなpushViewControllerを実行できます。

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

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

別の方法は、View Controllerをプッシュすることです。

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

3
Aks
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内にコードを配置すると、うまくいきました。

0
Pedro Berbel