2013-07-19 5 views
0

В моем приложении iOS у меня есть пользовательский UIView, который отображает список значений, перечисленных в Enum. Это является общим, так и тот же класс может работать с любым 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. 

Дело в том, что я могу использовать его для любого типа Enum. Поэтому у меня есть EnumViewer<ThisSet> и EnumViewer<ThatSet>, а также кнопка Choose This и кнопка Choose That. Если вы нажмете одну из кнопок, она отобразит список вариантов из соответствующего перечисления во всплывающем окне.

Это прекрасно работает на тренажере. Очень странная проблема в том, что на устройстве и NOT в симуляторе приложение запутывается и отображает список для WRONG перечисление. Если быть точным, если вы нажмете 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#. –

Смежные вопросы