つまり、ビュー階層に追加されたばかりの childVC からのビューを提示していますが、ウィンドウ階層にはまだ追加されていないようです。
このプロジェクトを開始し、ページベースのプロジェクトとして設定しました。UIPageViewController
同梱物に追加されたのボイラーは次のRootViewController
とおりです。
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
// Configure the page view controller and add it as a child view controller.
self.pageViewController = UIPageViewController(transitionStyle: .Scroll, navigationOrientation: .Horizontal, options: nil)
self.pageViewController!.delegate = self
let startingViewController: CameraViewController = self.modelController.viewControllerAtIndex(0, storyboard: self.storyboard!)!
let viewControllers = [startingViewController]
self.pageViewController!.setViewControllers(viewControllers, direction: .Forward, animated: false, completion: {done in })
self.pageViewController!.dataSource = self.modelController
self.addChildViewController(self.pageViewController!)
self.view.addSubview(self.pageViewController!.view) // !! -- viewDidAppear for CameraViewController called here
// Set the page view controller's bounds using an inset rect so that self's view is visible around the edges of the pages.
var pageViewRect = self.view.bounds
if UIDevice.currentDevice().userInterfaceIdiom == .Pad {
pageViewRect = CGRectInset(pageViewRect, 40.0, 40.0)
}
self.pageViewController!.view.frame = pageViewRect
self.pageViewController!.didMoveToParentViewController(self)
// Add the page view controller's gesture recognizers to the book view controller's view so that the gestures are started more easily.
self.view.gestureRecognizers = self.pageViewController!.gestureRecognizers
}
私が変更した唯一の行は、自分の VC をstartingViewController
次のように設定することでした。
let startingViewController: CameraViewController = self.modelController.viewControllerAtIndex(0, storyboard: self.storyboard!)!
最初の画面をカメラ、つまり ImagePickerVC にしようとしています。これが私のコードです。ご覧のとおり、プレビューを表示するUIImageView
ためにこれに a を追加していますが、最初にonを表示しようとしています:CamerViewController
UIImagePickerController
viewDidAppear
import UIKit
class CameraViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
@IBOutlet var imageView: UIImageView!
@IBAction func didTapCameraButton(sender: AnyObject) {
presentImagePicker();
}
var dataObject: AnyObject?
var imagePicker: UIImagePickerController!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated);
presentImagePicker();
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func presentImagePicker() {
imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = .Camera
presentViewController(imagePicker, animated: false, completion: { () -> Void in
println("save bolean")
})
}
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {
imagePicker.dismissViewControllerAnimated(true, completion: nil)
imageView.image = info[UIImagePickerControllerOriginalImage] as? UIImage
}
}
ただし、警告imagePicker
が表示され、表示されません。
Warning: Attempt to present <UIImagePickerController: 0x14e833a00> on <Here.CameraViewController: 0x14e614af0> whose view is not in the window hierarchy!
ブレークポイントを設定したところ、 をに追加すると、この行で が呼び出されるviewDidAppear
ことがわかりました。CameraViewController
PageViewController
RootViewController
self.view.addSubview(self.pageViewController!.view) // !! -- viewDidAppear for CameraViewController called here
これは当然のことのようですが、なぜエラーが発生するのでしょうか? ビューが追加されたばかりなので、RootViewController のビュー階層にあります。
UIImagePickerController
から手動で表示するボタンも追加しましたCameraViewController
。これで問題なく表示されます。