iOS 5 では、モーダル ビュー コントローラーを備えたストーリーボードがあり、ユーザーがアプリを初めて使用する場合に表示したいのですが、その後、このビュー コントローラーをスキップしたいと思います。
これを処理するために NSDefault キーを設定しましたが、これが設定されているかどうかを確認してから performSegueWithIdentifier を使用してセグエを開始しても、何も起こりません。このセグエをボタンの後ろに配置すると、正常に動作します...
iOS 5 では、モーダル ビュー コントローラーを備えたストーリーボードがあり、ユーザーがアプリを初めて使用する場合に表示したいのですが、その後、このビュー コントローラーをスキップしたいと思います。
これを処理するために NSDefault キーを設定しましたが、これが設定されているかどうかを確認してから performSegueWithIdentifier を使用してセグエを開始しても、何も起こりません。このセグエをボタンの後ろに配置すると、正常に動作します...
開発者が最初にログイン画面を表示したいという同様の質問に答えました。ここからダウンロードできるサンプルコードをいくつかまとめました。この問題を解決するための鍵は、この新しいView Controllerを表示したい場合、適切なタイミングで物事を呼び出すことです。例では、次のようなものを使用する必要があることがわかります
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
[vc setModalPresentationStyle:UIModalPresentationFullScreen];
[self presentModalViewController:vc animated:YES];
}
セグエとストーリーボードがどのように機能するかについての説明もあります。ここで見ることができます
ViewDidLoad での読み込みにより、「下層」が点滅しました。ストーリーボードをプログラムでロードすることでこれを解決しました。したがって、[ターゲット/メイン ストーリーボード] の下で、これを空白のままにします。次に、以下を追加します。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Load Main App Screen
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
HomeScreenVC *homeScreenVC = [storyboard instantiateInitialViewController];
self.window.rootViewController = homeScreenVC;
[self.window makeKeyAndVisible];
// Load Login/Signup View Controller
UIViewController *mainLoginVC = [storyboard instantiateViewControllerWithIdentifier:@"MainLoginVC"];
[mainLoginVC setModalPresentationStyle:UIModalPresentationFullScreen];
[homeScreenVC presentModalViewController:mainLoginVC animated:NO];
return YES;
}
問題は、最初のビューが完全に追加される前に、階層に 2 番目のビューを追加していることです。コードを入れてみてください:
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
// Present your modal from here
}
が呼び出された後[super viewDidAppear]
、完全にロードされたビューを変更する必要があります。
viewDidLoadでセグエを実行することに大きな問題はありません(もちろんsuperの呼び出し後)。
問題は、アプリケーションのウィンドウが表示される前にセグエを実行することです。表示するUIViewControllerはメインストーリーボードの一部であるため、アプリがアプリデリゲートでコードの実行を開始する前にメモリに読み込まれます。あなたの場合、アプリケーションウィンドウにMakeKeyAndVisibleというメッセージが表示される前に、iOSによってviewDidLoadが呼び出されます。
重要な部分は可視性です。ウィンドウが表示されていないビュー階層でセグエを実行しても、何も起こりません。
あなたはこのようなことを試みることができます:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// The window initialized with hidden = YES, so in order to perform the segue we need to set this value to NO.
// After this action, the OS will add the window.rootViewController's view as a subview of the window.
self.window.hidden = NO;
[self.window.rootViewController performSegueWithIdentifier:_IDENTIFIER_ sender:self.window.rootViewController];
// Now that the window is not hidden, we must make it key.
[self.window makeKeyWindow];
return YES;
}
スイフトの場合:
dispatch_async(dispatch_get_main_queue()) {
self.performSegueWithIdentifier("toView2", sender: self)
}
スウィフト 3 の場合:
DispatchQueue.main.async {
self.performSegueWithIdentifier("toView2", sender: self)
}
これが私がSWIFTで行った方法です。これにより、View Controller も非表示になります。
override func viewWillAppear(animated: Bool) {
let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()
let isloggedIn = prefs.objectForKey("isLoggedIn") as? Bool
if (isloggedIn != false) {
self.view.hidden = true
} else {
self.view.hidden = false
}
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(true)
let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()
let isloggedIn = prefs.objectForKey("isLoggedIn") as? Bool
if (isloggedIn != false) {
println("this should work")
self.performSegueWithIdentifier("Login", sender: self)
}
}
スイフト3
override func viewWillAppear(_ animated: Bool) {
if authPreference.isExist() == true {
self.view.isHidden = true
} else {
self.view.isHidden = false
}
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(true)
if authPreference.isExist() == true {
navigateToSegue()
}
}
私も同じ問題を抱えていました。この質問を見つける前に、メインスレッドで async を使用してこの問題を解決しました。このようにして、このコードは、ビューを作成した直後に UI スレッドによって呼び出されます。
dispatch_async(dispatch_get_main_queue(), ^{
[self performSegueWithIdentifier:@"segueAlbums" sender:self];
});
このコードは、viewDidLoad
メソッドで呼び出すことができます。
最善の解決策はこれを行うことです:
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
[self performSegueWithIdentifier:@"NameSegue" sender:self];
}
@bearMountain の回答を Swift 3に適合させました。
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
window = UIWindow(frame: UIScreen.main.bounds)
let yourInitialVC: UIViewController? = storyboard.instantiateViewController(withIdentifier: "TermsVC")
window?.rootViewController = termsVC
window?.makeKeyAndVisible()
return true
}