Facebook統合を使用するアプリに取り組んでいますが、log in
システムは正常に機能しています。ただし、ユーザーがlog out
をクリックすると、最初のViewControllerに戻れないようです。
これが私のstoryboard
の概要です。
ユーザーがblue button
(上部)をクリックしたときに最初に戻りたいと思います。それを達成するために私は何をしますか?ご覧のとおり、私には複数のNavigation Controllers
があり、そこに到達するためにPush-segues
のみを使用しています。ただし、中央に表示されているSWRevealViewController
を使用します。
何もしない[self.navigationController popToRootViewControllerAnimated:YES];
を試しました。
何かアドバイス? SWRevealViewController
と、それが私のNavigation
スタックに何をしたのかを知っている人はいますか?どんな助けでも大歓迎です!
ありがとう。
これを試して、
UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"NameOfYourStoryBoard"
bundle:nil];
LoginViewController *add =
[storyboard instantiateViewControllerWithIdentifier:@"viewControllerIdentifier"];
[self presentViewController:add
animated:YES
completion:nil];
ルートビューコントローラのメソッドの下に書き込む
- (IBAction)returnToDashboard:(UIStoryboardSegue *)segue;
以下のように宛先ビューコントローラにセグエ接続を与えます
セグエに識別子を与え、そのセグエにメソッドを割り当てます
デスティネーションビューコントローラで以下のメソッドを使用します
[self performSegueWithIdentifier:@"pushtoDashboard" sender:self];
まず第一に、私はあなたがそれほど多くのUINavigationControllersを必要としないと思います。アプリケーションで1つだけを使用するだけで十分です。 popToRootViewControllerが機能しない理由は、それがUINavigationControllerを使用して最初のViewControllerに移動するためです。多くのUINavigationControllerをネストしているため、設定ビューコントローラーの青いボタンをクリックすると、サイドバービューコントローラーに移動します(正しく読み取れず、画像が小さい)。
次の手順を実行して、アプリのルートビューコントローラーにアクセスできます。
UINavigationController *rootController =[(UINavigationController*)[(AppDelegate*)
[[UIApplication sharedApplication]delegate] window] rootViewController]];
AppDelegateを、アプリで呼び出されている方法に置き換えます。
しかし、私のアドバイスは、すべての中間UINavigationControllersを削除することです。次に、popToRootViewControllerを実行するだけでうまくいくはずです。
問題
ユーザーが青いボタン(上部)をクリックしたときに、ビューコントローラー(ソース)から開始(宛先ビューコントローラー)に戻りたい
推奨事項
高評価SO回答 )をざっと見てみることをお勧めします。これは、アンワインドセグエの使用方法を示しています(これは、ビューコントローラーの小さな緑色の出口ボックスです。ストーリーボード)。アンワインドセグエは、目標を達成するための最新の方法ですが、ソースコントローラーからdismissViewController:animatedを呼び出すこともできます。また、非常に小さいApple note( TN2298 )アンワインドセグエの使用について。
基本的に、destinationビューコントローラに次のメソッドを追加する必要があります。
- (IBAction)unwindToMainMenu:(UIStoryboardSegue*)sender
{
}
次に、ctrl +ドラッグを使用して、青いボタンからソースビューコントローラーの緑の終了アイコンまでクリックします。これによりメニューがポップアップ表示され、リストからunwindToMainMenu
を選択できます。 Identity Inspectorで新しいセグエに識別子を指定する必要があります(例:segueToMain)。
手動巻き戻し
上記のテクニカルノート(TN2298)には、プログラムで呼び出すことができる手動のアンワインドセグエを作成する方法も示されています(performSegueWithIdentifier ...と言う方法と同様)。
私は非常によく似た問題に取り組んでいました。私はナビゲーションコントローラーでストーリーボードを使用しており、iOS7とXcode5.1で強く推奨される SWRevealViewController を実装しています。言及されているソリューションのいくつかを実装しようとしましたが失敗しました。画面が変わらないか、テーブルが空白になりました。 SWRevealControllerと他の回答で提供されているプログラム例のハイブリッドバージョンを使用して、実用的なソリューションを取得しました。ログインボタンアクションの一部としてこれを追加しました
UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
InboxTableViewController *viewController = [storyBoard instantiateViewControllerWithIdentifier:@"inbox"];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:viewController];
[self.revealViewController pushFrontViewController:nav animated:YES];
ストーリーボードを取得し、ストーリーボードから必要なビューコントローラーを起動して、ナビゲーションコントローラーに追加しました。最後に、SWRevealViewControllerメソッドを使用して、必要なビューを前面にプッシュしました。
異なるストーリーボードがある場合、最初のストーリーボードから必要なVCを提示する」だけで、次のトリックが実行されます。
Swift
if let loginVC = UIStoryboard(name: "Login", bundle: nil).instantiateInitialViewController() {
present(loginVC, animated: true, completion: nil)
}
場合によっては、UITransitionViewがリークしている可能性があります。 「提示する」コードの直後に削除することもできますが、その前や完了時に削除することはできません。
if let subviews = UIApplication.shared.keyWindow?.subviews,
let transitionViewClass = NSClassFromString("UITransitionView") {
for subview in subviews where subview.isKind(of: transitionViewClass) {
subview.removeFromSuperview()
}
}
<–これはXcode8.2.1およびiOS10.2の時点で機能しますが、永久に機能するかどうかは保証されません。気をつけて。
私はSwiftを使用していますが、私にとってうまくいったのはこれでした:
var loginVC: UIViewController? = self.storyboard?.instantiateViewControllerWithIdentifier("UILogin") as? UIViewController
self.presentViewController(loginVC!, animated: true, completion: nil)