2016-09-15 62 views
0

我一直試圖在swift 3中使用具有可視格式的autolayout,並且它一直崩潰。下面的代碼基本上將一些UIImageView添加到滾動視圖並使其可滾動。 然而,當我試圖限制添加滾動視圖和ImageView的,應用程序保持崩潰,代碼工作正常上SWIFT 2.3如何在Swift 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

什麼類型的崩潰是怎麼回事?它是否指向代碼中的某一行?它與明確的解包有關嗎?它是否是自動佈局警告?提供更多信息。 –

+0

我把斷點指向上面的代碼,它在verticalConstraints上崩潰 錯誤是「NSInvalidArgumentException」 - 無法識別的選擇器發送到實例nslayoutconstraint –

回答

2

看來問題是由視圖數組的類型引起的。在我的情況:

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

鑄造,以確保該值是不可選的,似乎修復(下一個它轉換到什麼constraints.withVisualFormat預計)。

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

或者,您可以確保您的視圖數組永遠不會有可選的視圖。 (我不得不明確解開一個隱含的解包可選項,我發現它很奇怪)。

let views = ["nib": nibView!] 

這篇文章是我學到的原因:
Autolayout issue Xcode 8 [_SwiftValue nsli_superitem]

+0

這是行得通!非常感謝 –

相關問題