2016-09-15 93 views
21

將我的代碼轉換爲Swift 3我發現了一個奇怪的問題。 現在(2016年9月15日)Xcode 8(公開版)已經出來,在轉換代碼之後,我的應用程序崩潰了,沒有明顯的原因。Autolayout問題Xcode 8 [_SwiftValue nsli_superitem]

也有一些是錯誤的自動佈局和日誌說是這樣的:

[_SwiftValue nsli_superitem]: unrecognized selector sent to instance 

我怎樣才能解決?由於

回答

37

只是想出出怪異,但工作的解決方案:

而不是這樣做:

let views = ["view":aView] 
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "...", options:[], metrics: metrics, views: views)) 

聲明明確字典:

let views: [String:UIView] = ["view":aView] 
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "...", options:[], metrics: metrics, views: views)) 

我知道,這是奇怪,但它的工作原理。 Cheers

+9

感謝您分享此內容。對我來說,這是一個可選的視角,這是展開的。所以'讓視圖= [「視圖」:aView!]' –

+0

至少你轉換。我的項目升級完全忽略了我所有的限制。恢復更改並連續重試3次。我的客戶只是想要在完成他們想要更新的小功能之前完全重做他們的整個界面。 – DiggyJohn

+0

感謝@martn_st,這就是我的工作。我的聲明是'@IBOutlet弱var aTableView:UITableView!',我認爲這意味着它已經被解開。我猜在Swift 3中,這還不夠? – Bek

2

在swift 3中,我們使用隱式解包的option選項的方式已經改變。考慮下面的例子:

let optionalInt: Int! = 1 
let int = optionalInt 
let array = [int, 2] 
print(array) // prints: [Optional(1), Optional(2)] 

所以代替具有[Int]類型如預期的陣列,我們現在有[Int?],這會導致上述的運行時錯誤。


pascalbros的解決方法,以顯式聲明變量的類型解決了這個問題,但會發生什麼也可以肯定的,我建議你意外地檢查可能的自選進入一個數組或詞典改變其推斷類型。