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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

3520閲覧

初回起動時にチュートリアルを表示した後、はじめるボタンから通常のViewに戻りたい

退会済みユーザー

退会済みユーザー

総合スコア0

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/09/24 10:25

編集2016/09/24 10:30

質問させてください。正しいやり方、ベストなやり方が見つからずに困っています。
内容は質問のとおりです。

AppDelegate.swift 内にてNSUserDefaults.standardUserDefaults() を使いはじめての起動かそうでないかを分岐しております。もし、はじめての起動の場合は ViewController.swift を、そうでない場合は TutorialController.swift に遷移させ(ここまではできております)、TutorialController.swift にて 「はじめる」 ボタンをタップすると通常の View に戻る実装をしたいです(ここがうまくできません)。エラー内容としては whose view is not in the window hierarchy! になっており、そもそもやり方が一般的でないのかと思いいろいろ調べているのですが、あまり目的の情報がなく困っています。

このような実装では、まず ViewController にて初回起動かどうかをもとにモーダル等で TutorialView を重ねるべきでしょうか。もしくは、現在の実装のように AppDelegate.swift にて初回起動かどうかを調べた上で self.window を更新すべきでしょうか。よろしくお願いいたします。

===

AppDelegate.swift:

Swift

1import UIKit 2 3@UIApplicationMain 4class AppDelegate: UIResponder, UIApplicationDelegate { 5 6 var window: UIWindow? 7 var myNavigationController: UINavigationController? 8 9 10 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 11 // Override point for customization after application launch. 12 13 // ベースとなるViewControllerをセットする 14 let initialViewController: ViewController = ViewController() 15 myNavigationController = UINavigationController(rootViewController: initialViewController) 16 self.window = UIWindow(frame: UIScreen.mainScreen().bounds) 17 self.window?.rootViewController = initialViewController 18 self.window?.makeKeyAndVisible() 19 20 // デバッグ用にNSUserDefaultsをリセットする 21 let bundle = NSBundle.mainBundle().bundleIdentifier 22 NSUserDefaults.standardUserDefaults().removePersistentDomainForName(bundle!) 23 24 // 初回起動時にNSUserDefaultsをセットする 25 let defaults = NSUserDefaults.standardUserDefaults() 26 if defaults.integerForKey("firstLaunch") == 0 { 27 // 初回起動時には、チュートリアルを表示する 28 let tutorialViewController: TutorialViewController = TutorialViewController() 29 myNavigationController = UINavigationController(rootViewController: tutorialViewController) 30 self.window = UIWindow(frame: UIScreen.mainScreen().bounds) 31 self.window?.rootViewController = tutorialViewController 32 self.window?.makeKeyAndVisible() 33 } 34 35 // firstLaunchをtrueに更新して次回以降は、通常のViewControllerを表示する 36 defaults.setObject(true, forKey: "firstLaunch") 37 defaults.synchronize() 38 39 return true 40 } 41}

TutorialViewController.swift:

Swift

1import UIKit 2 3class TutorialViewController: UIViewController, UIScrollViewDelegate { 4 5 var scrollView: UIScrollView! 6 var pageControll: UIPageControl! 7 let pageNum = 4 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 12 self.scrollView = UIScrollView(frame: self.view.bounds) 13 self.scrollView.contentSize = CGSizeMake(self.view.bounds.width * CGFloat(pageNum), self.view.bounds.height) 14 self.scrollView.pagingEnabled = true 15 self.scrollView.bounces = false 16 self.scrollView.showsHorizontalScrollIndicator = false 17 self.scrollView.delegate = self 18 self.view.addSubview(self.scrollView) 19 20 self.pageControll = UIPageControl(frame: CGRectMake(0, self.view.bounds.height-140, self.view.bounds.width, 50)) 21 self.pageControll.numberOfPages = pageNum 22 self.pageControll.currentPage = 0 23 self.view.addSubview(self.pageControll) 24 25 for page in 1...pageNum { 26 let paginateView = UIView(frame: CGRectMake(self.view.bounds.width * CGFloat(page-1), 0, self.view.bounds.width, self.view.bounds.height)) 27 paginateView.backgroundColor = UIColor(red:0.0, green:0.5, blue:1.0, alpha:1.0) 28 self.scrollView.addSubview(paginateView) 29 } 30 31 let skipButton = UIButton(frame: CGRectMake(0,0,270,55)) 32 skipButton.backgroundColor = UIColor.whiteColor() 33 skipButton.layer.masksToBounds = true 34 skipButton.layer.cornerRadius = 2.0 35 skipButton.setTitle("はじめる", forState: UIControlState.Normal) 36 skipButton.setTitleColor(UIColor(red:0.0, green:0.5, blue:1.0, alpha:1.0), forState: UIControlState.Normal) 37 skipButton.titleLabel!.font = UIFont.systemFontOfSize(15) 38 skipButton.layer.position = CGPoint(x:self.view.frame.width/2, y:self.view.bounds.height-60) 39 skipButton.addTarget(self, action: #selector(TutorialViewController.onClickMyButton), forControlEvents:.TouchUpInside) 40 self.view.addSubview(skipButton) 41 } 42 43 func scrollViewDidScroll(scrollView: UIScrollView) { 44 let pageProgress = Double(scrollView.contentOffset.x / scrollView.bounds.width) 45 self.pageControll.currentPage = Int(round(pageProgress)) 46 47 } 48 49 override func didReceiveMemoryWarning() { 50 super.didReceiveMemoryWarning() 51 } 52 53 internal func onClickMyButton(sender: UIButton){ 54 print("onClickMyButton: called ...") 55 let nav = UINavigationController(rootViewController: ViewController()) 56 presentViewController(nav, animated: true, completion: nil) 57 } 58 59}

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

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

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

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

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

guest

回答1

0

ベストアンサー

Swift

1internal func onClickMyButton(sender: UIButton){ 2 print("onClickMyButton: called ...") 3 let nav = UINavigationController(rootViewController: ViewController()) 4 UIApplication.sharedApplication().keyWindow?.rootViewController = nav 5}

一応ルートビューを変える形でViewControllerを表示することはできました。
(やりたい方法に沿っているかはわかりませんが。)

投稿2016/09/26 03:39

Y_M

総合スコア265

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

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

退会済みユーザー

退会済みユーザー

2016/09/29 10:52 編集

ご回答ありがとうございます。こちらでも動くことを確認できました。 ご丁寧にありがとうございました。 また、こちらのコードでも同じことが実現できましたので一応載せておきます。 internal func onClickMyButton(sender: UIButton){ let nav = UINavigationController(rootViewController: ViewController()) nav.modalTransitionStyle = .CrossDissolve self.presentViewController(nav, animated: true, completion: nil) }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問