Приложение падает после попытки установить перечисление typedef - PullRequest
1 голос
/ 28 октября 2010

Ранее я задавал вопрос, похожий на этот, но у меня возникла новая проблема, поэтому я оставил часть вопроса.

У меня есть это до объявления интерфейса в моем заголовке MainView.h.

typedef enum { UNKNOWN, CLEAR, NIGHT_CLEAR, CLOUDY, NIGHT_CLOUDY } Weather;

Затем я объявил это (в моем MainView) так:

Weather weather;

Затем сделал аксессор (и синтезировал его):

@property Weather weather;

Мой вопрос: как я могу использовать это в MainViewController без сбоев? Я импортировал заголовок для MainView. Я пытался использовать это так:

MainView* myView = (MainView*)self.view;

[myView setWeather: CLEAR];

Он не выдает никаких ошибок в XCode, но вылетает при запуске кода, говоря:

-[UIView setWeather:]: unrecognized selector sent to instance *blah*

Я что-то здесь не так делаю?

В моем MainViewController:

- (void)viewDidLoad {
    [super viewDidLoad];
    MainView * drawBox = [[MainView alloc] initWithFrame:(CGRectMake(60, 80, 200, 200))];
    drawBox.backgroundColor = [UIColor clearColor];
    [self.view addSubview:drawBox];
}

Ответы [ 4 ]

3 голосов
/ 28 октября 2010

Как продолжение моего комментария выше:

Возможно, вы либо где-то говорите [[UIView alloc] initWithFrame:...], либо у вас есть файл Interface Builder с объектом View. Если вы посмотрите в окне инспектора с выбранным объектом, он будет указывать на «Class Identity» как UIView. Измените его на MainView, чтобы у объекта был правильный тип во время выполнения.

1 голос
/ 28 октября 2010

Вы добавили MainView как подпредставление self.view. Когда вы передаете setWeather, вы на самом деле вызываете его в self.view (главном представлении вашего контроллера представления, который является UIView), а не в главном представлении self.view.

Получите правильный объект MainView, просматривая self.view.subviews.

Edit: Или просто держите ивар, указывающий на подпредставление MainView, чтобы вы могли получить к нему доступ в любое время.

  1. объявить MainView *drawBox; в .ч
  2. в viewDidLoad, init как drawBox = [[MainView alloc] initWithFrame:(CGRectMake(60, 80, 200, 200))];
  3. просто позвоните [drawBox setWeather:CLEAR];, когда вам нужно
1 голос
/ 28 октября 2010

Вам необходимо объявить свойство внутри секции @interface в MainView, а ваш Weather weather; должен быть в секции переменных экземпляра MainView.viewDidLoad, вы добавляете свой MainView как подпредставление к свойству VCs view.Затем, когда вы захотите его использовать, вы получите свойство VCs view и приведете его к MainView.Вы не получаете представление, которое хотите, когда вы делаете это.Вы получаете представление, которое удерживает ваш MainView.Это источник вашей проблемы.self.view как вы ссылаетесь на него, UIView не MainView.MainView - это подпредставление self.view.

0 голосов
/ 28 октября 2010

in .m вы синтезировали погоду? например

@synthesize weather; 

чтобы у вас были созданы геттер и сеттер.

[update] После прочтения вашего обновления в viewdidload становится ясно, что вы обращаетесь к неправильному представлению, потому что вы просто использовали [self.view addSubView:], это означает, что self.view - это не MainView, это просто подпредставление , Вы можете просто объявить MainView * drawBox как глобальный и получить доступ к [drawBox setWeather:] напрямую.

...