2016-09-15 8 views
0

swift 3で視覚的なフォーマットでautolayoutを使用しようとしていて、クラッシュしています。以下のコードは基本的にスクロールビューにいくつかのUIImageViewを追加し、スクロール可能にします。 はしかし、私は、スクロールビューとImageViewのに制約を追加しようとしたとき、アプリがクラッシュし続ける、コードがSWIFT 2.3Swift 3.0でVisual形式のAutolayout制約を設定する方法

let page1 = createAndAddViewsWith("image1", middleTextLabel: "Welcome to TwisCode") 
    let page2 = createAndAddViewsWith("image2", middleTextLabel: "This is just a practice") 
    let page3 = createAndAddViewsWith("image3", middleTextLabel: "And the button will appear here") 


    pages = [page1, page2, page3] 

    print(pages) 

    let views = ["view": view, "page1": page1.view, "page2": page2.view, "page3": page3.view] 
    let verticalConstraints = NSLayoutConstraint.constraints(withVisualFormat: "V:|[p1.view(==view)]|", options: NSLayoutFormatOptions(rawValue:0), metrics: nil, views: views) 
    NSLayoutConstraint.activate(verticalConstraints) 

に正常に動作しますので、私は垂直方向の制約を追加した部分は、それがクラッシュした部分です。

以下は、ページを追加する機能です。

private func createAndAddViewsWith (_ backgroundImage: String, middleTextLabel text: String)-> ContentViewController{ 

    let contentVC = storyboard!.instantiateViewController(withIdentifier: "ContentViewController") as! ContentViewController 
    contentVC.view.translatesAutoresizingMaskIntoConstraints = false 
    contentVC.backgroundImage = UIImage(named: backgroundImage) 
    contentVC.textLabel = text 

    scrollView.addSubview(contentVC.view) 
    addChildViewController(contentVC) 
    contentVC.didMove(toParentViewController: self) 

    return contentVC 


} 
+0

:私は原因を学んだところ

let views = ["nib": nibView!] 

この投稿はありますか?それはコードのいくつかの行にあなたを指していますか?明示的なアンラッピングに関連していますか?それは自動レイアウト警告ですか?いくつかの情報を追加してください。 –

+0

私は上記のコードにブレークポイントを入れ、verticalConstraintsでクラッシュします エラーは "NSInvalidArgumentException"でした - 認識できないセレクターがインスタンスnslayoutconstraintに送信 –

答えて

2

この問題は、ビュー配列の型によって発生しているようです。私の場合:値を保証するために、それをキャスト

var nibview: UIView! 
// ... 
let views = ["nib": nibView] // Type: [String: UIView?] 

はオプションではありません(下の1がconstraints.withVisualFormatが期待するものにそれをキャスト)それを修正するようです。

let views: [String: UIView] = ["nib": nibView] 
let views: [String: Any] = ["nib": nibView] 

代わりに、ビュー配列にオプションのビューがないことを確認するだけで済みます。 (私は暗黙のうちにアンラップされたオプションを明示的にアンラップしなければなりませんでした。何が起こっているのクラッシュのどのような種類
Autolayout issue Xcode 8 [_SwiftValue nsli_superitem]

+0

これは機能します!!どうもありがとう –

関連する問題