29430


Xcode 7.3、Swift2の環境で、  
[[iOS swift] ContainerViewをプログラムで作りたい](http://www.kuma-
de.com/blog/2016-04-25/7174)  
こちらのページを参考にして、

UIViewをコードでContainerViewにして、  
StoryBoardのUIViewを入れようとしたのですが、  
下記コード内の「 <=ココ」の部分で、

> Could not cast value of type 'Test.StartViewController' (0x1000db240) to
> 'Test.TestViewController' (0x1000db088).

というエラーが出ます。

いろいろ調べてみたのですが、ContainerViewをコードで作成する情報は、  
日本語ではあまり見当たらず、原因がわかりませんでした。

どこが問題なのか、ご教示いただけたらと思います。  
どうか、よろしくお願いいたします。

[code]

    import UIKit
    
    class StartViewController: UIViewController {
    
    @IBOutlet weak var swipeView: UIView!
    
    var printViewController:TestViewController?
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        title = "Hello Container"
    
        printViewController = createHorizontalViewController("Top")
        displayContentController(printViewController!, container: swipeView)
    
    }
    
    
    func createHorizontalViewController(containerTitle:String)->TestViewController{
        let sb:UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let hController:TestViewController = sb.instantiateInitialViewController() as! TestViewController // <=ココ
        // hController.containerTitle = containerTitle
        return hController
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    func displayContentController(content:UIViewController, container:UIView){
        addChildViewController(content)
        content.view.frame = container.bounds
        container.addSubview(content.view)
        content.didMoveToParentViewController(self)
    }
    
    func hideContentController(content:UIViewController){
        content.willMoveToParentViewController(self)
        content.view.removeFromSuperview()
        content.removeFromParentViewController()
    }
    
    
    }
    
[/code]


CC BY-SA 3.0
2016-10-08T07:32:04.680
29428
2016-10-08T10:06:29.733
2016-10-08T08:39:09.197
15185
18978
question
swift ios xcode
UIView 内にContainerViewを作成しStoryboardのUIViewControllerを入れたい


あなたのコードのこの部分、

[code]

    sb.instantiateInitialViewController()
    
[/code]

これは、「初期ViewControllerをインスタンス化しろ」と言うメソッドです。あなたのアプリでは初期ViewControllerとして、`StartViewController`を指定しているようですので、そのインスタンス(その時走っている`StartViewController`と同クラスだが別のインスタンス)が作成されてしまいます。それをキャストで別のViewControllerに変換することはできません。

`TestViewController`のインスタンスをstoryboardに追加(すでに存在するならその属性を修正)し、 **Class**
を`TestViewController`にした上で、 **Storyboard ID** を正しく設定してください。(以下では、Storyboard
IDとしてTestViewControllerを指定したものとして記述しますが、クラス名とStoryboard IDを同じにする必要はありません。)

`TestViewController`をインスタンス化するコードはこんな風にしないといけません。

[code]

        let hController = sb.instantiateViewController(withIdentifier: "TestViewController") as! TestViewController
    
[/code]

(文字列の、`"TestViewController"`の部分をStoryboard IDで設定した内容に合わせます。)

ご質問タイトルにある「ContainerViewを作成し」の部分がうまくいくかどうかは、全く試せていませんので、上記の修正でうまくいかない部分が残っている場合は、ご質問内容を編集して必要な情報を追記するなどした上で、コメント等でお知らせください。


CC BY-SA 3.0
2016-10-08T10:06:29.733
29430
2016-10-08T10:06:29.733
13972
29428
answer