Создание кнопок на лету с использованием базовых данных в Какао для iOS - PullRequest
0 голосов
/ 26 апреля 2011

У меня есть приложение, в котором мне нужно иметь возможность обновлять, какие кнопки могут отображаться на главном экране, и я решил использовать основные данные, чтобы позволить мне обновлять управляющее свойство через XML. Основные данные, кажется, работают хорошо и обновляются, а кнопки создаются, однако по какой-то причине селектор не сохраняется, так как он падает каждый раз, когда я нажимаю на кнопку. Журнал ошибок ничего не говорит - за исключением одного раза, когда он сказал «нераспознанный селектор отправлен в экземпляр». Вот метод, который я использую для создания кнопок:

- (void)setUpNavigationButtons {

    int i = 0;

    for (Features *myFeature in self.features) {

        CGRect buttonRect = [self makeFeatureButtonFrame:[self.features count] withMember:i];

        UIButton *aButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [aButton setFrame:buttonRect];

        [aButton addTarget:self action:@selector(buttonTouched:) forControlEvents:UIControlEventTouchUpInside];
        [aButton setTitle:[NSString stringWithFormat:@"%@",myFeature.name] forState:UIControlStateNormal];

        [self.view addSubview:aButton];

        i++;

    }
}

Вот метод выбора, в том же классе контроллера представления:

- (void)buttonTouched:(id)sender{

    NSLog(@"feature selected");

}

Любая помощь очень ценится. Пожалуйста, дайте мне знать, если для выяснения чего-либо значимого требуется больше кода. Я не хочу просить людей прочитать гору, если требуется только кротовина.

ОБНОВЛЕНИЕ: 4/27/2011 В ответ на комментарии в проверенном ответе ниже я публикую код, запускающий контроллер представления. У меня не было проблем с этим в прошлом, но вполне возможно, что я выбрал здесь плохую технику. Это из приложения метода: метод didFinishLaunchingWithOptions в AppDelegate. Во всяком случае, вот код:

UINavigationController *navigationController = [[[UINavigationController alloc]  init] autorelease];


HomeViewController *root = [[HomeViewController alloc] initWithNibName:@"HomeViewController" bundle:nil];
root.title = companyName;
root.context = [self managedObjectContext];
[navigationController pushViewController:root animated:NO];

[window addSubview:navigationController.view];

[root release];

[self.window makeKeyAndVisible];
return YES;

1 Ответ

0 голосов
/ 27 апреля 2011

Отказ от ответственности;Я догадываюсь здесь.

Возможно, ваш контроллер не торчит в памяти, и его нужно сохранить?

[aButton addTarget:[self retain] action:@selector(buttonTouched:) forControlEvents:UIControlEventTouchUpInside];

ПРИМЕЧАНИЕ. ВЫШЕ КОД - ПЛОХО.Это просто определило проблему в оригинальном вопросе.Подробности см. В комментариях ниже.

Этот код, вероятно, является плохим, если он устраняет проблему, если только каждая кнопка не отправляет [target release] при уничтожении.

Кроме того, вы должны использоватьIBAction вместо void для действий кнопок:

- (IBAction)buttonTouched:(id)sender{
    NSLog(@"feature selected");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...