概要
Xcode6ですと、StoryBoardを使用するのが標準です。 現状(Xcode6.4)では、1つのStoryBoardファイルで全ての画面を管理します。 StoryBoardが1つですと、ソース管理でコンフリクトを起こしやすいですし、できれば1画面につき1StoryBoardファイルで開発したいところです。 そこで、この記事では1画面につき1StoryBoardファイルを実現する方法を提示します。
プロジェクトの設定
プロジェクトの設定のInfoで「Main storyboard file base name」を選択してマイナスボタンで削除します。 Main.storyboardファイルはプロジェクトから削除します(残しても問題ないですが)。
画面を構成するファイル
ファイルの追加
画面のために以下の二つのファイルを追加します。 分かり易くするため、この2つのファイル名は同じにします(ここではSubViewController.*)。
- Story Boardファイル
- サブクラスがUIViewControllerのCocoa Touch Classファイル
さらに、SubViewController.stroyboardを開き、View Controllerを追加しておきます。
Stroy BoardのView Controllerの設定
Custum Classの設定
追加したView ControllerのプロパティでCustom ClassのClassに上記追加したCocoa Touch Classのクラス(SubViewController)を指定します。
Initial View Controllerの設定
追加したView ControllerのプロパティでView Controllerのis Initial View Controllerチェックボックスにチェックを入れます。
初期画面の表示
AppDelegate.swiftファイルを以下の通り修正します。
- navigationControllerプロパティを追加
-
application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
を修正
UIStoryboard
イニシャライザのname:には初期画面にしたい画面を含むStory Boardの名称を指定します。
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var navigationController: UINavigationController?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
var storyboard: UIStoryboard = UIStoryboard(name: "SubViewController", bundle: NSBundle.mainBundle())
var mainViewController: UIViewController = storyboard.instantiateInitialViewController() as! UIViewController
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
self.navigationController = UINavigationController(rootViewController: mainViewController)
self.window?.rootViewController = navigationController
self.window?.makeKeyAndVisible()
return true
}
・・・
}
画面遷移
次の画面へ
画面遷移を行う場合は、以下の様に
UIStoryboard
イニシャライザのname:に次画面を含むStory Boardの名称を指定します。
var storyboard: UIStoryboard = UIStoryboard(name: "NextViewController", bundle: NSBundle.mainBundle())
var secondViewController: SecondViewController = storyboard.instantiateInitialViewController() as SecondViewController
self.navigationController?.pushViewController(secondViewController, animated: true)
前の画面へ
self.navigationController?.popViewControllerAnimated(true)