2013-07-19 60 views
0

在我的iOS應用程序中,我有一個自定義UIView,它顯示Enum中列出的值列表。這是通用的,所以同一個類可以與任何枚舉工作:加載通用類型在模擬器中工作,但不是設備

public class EnumViewer<TEnumType> : UIView 
{...} 

假設我有,比方說,一個顏色:

public enum Color 
{ 
    Red, 
    Green, 
    Blue 
} 

我可以在應用程序中使用像這樣的視圖中查看這些值:

var view = new EnumViewer<Color> 
//add to parent view, set the frame, etc. 

當然,關鍵是我可以重複使用這個任何枚舉類型。所以我有一個EnumViewer<ThisSet>和一個EnumViewer<ThatSet>,和一個Choose This按鈕和一個Choose That按鈕。如果您單擊其中一個按鈕,它會在彈出窗口中顯示適當枚舉的選項列表。

這在模擬器上完美運行。非常奇怪的問題是,在設備上,並在模擬器中不是,該應用程序變得混亂,並顯示列表錯誤枚舉。準確地說,如果您點擊Choose This,它會顯示ThisSet項目的列表,但如果您點擊Choose That,它將顯示相同的列表。如果您點擊Choose ThatFIRST,它能正確顯示ThatSet項目的列表,但如果單擊Choose This,它會再次顯示ThatSet值的列表。我已經驗證它實際上是每次創建視圖,但TEnumType其實是錯誤的,我無法弄清楚原因。我知道代碼是正確的,因爲它在模擬器中工作正常。

回答

4

Xamarin.iOS不支持繼承原生類的泛型類。這最近變成了錯誤或警告。

+0

感謝您的答案,但男孩我希望它仍然是一個錯誤,因爲我沒有注意到警告,直到我建立了一個主要的子系統,取決於UIView的通用子類型。如果這種行爲在設備上如此不可靠,那麼編譯器是否應該阻止你這麼做? –

+0

所以現在我的問題是如何重新設計我的應用程序。我最好的想法是用一個簡單的System.Type變量替換泛型類型,該變量標識一個通用工廠類(不是從NSObject派生的),在運行時設置工廠類類型,並讓工廠類執行我想要的通用功能該做的看法。或者你可以提供更好的建議。而且,這是否會成爲一件安全的事情呢?常規C#對象中的泛型是否正常? –

+0

@JoshuaFrank:這不是一個錯誤的原因是因爲我們很長一段時間沒有檢測到這種情況,現在有很多應用程序在出現這個問題的時候仍能正常工作,並且使其成爲一個錯誤會打破這些應用程序(降低向後兼容性的奇怪情況)。是的,泛型在常規的C#對象中很好。 –

相關問題