2012-05-22 6 views
0

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

Я использую цикл for() для создания пучка кнопок из массива. Затем у меня есть действие, но я не могу распознать кнопку. Итак:

NSArray *numbers = [NSArray arrayWithOjbects:@"1", "2", "3", nil]; 

for (int i = 0; i < [numbers count]; i++) { 

    button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    [button addTarget:self action:@selector(recognize:) forControlEvents:UIControlEventTouchDown]; 
    [button setTitle:[numbers objectAtIndex:i] forState:UIControlStateNormal]; 
    button.frame = CGRectMake(x, y, w, l); 

    } 

Тогда:

-(void) recognize:(id)sender { 

    NSLog (button.titleLabel.text); 

} 

Но, я только получить последний элемент массива (3) независимо от нажатой кнопки. Я думаю, что мне не хватает шага в (void) признать: (id) отправителя ... что я должен знать ... но он полностью ускользает от меня прямо сейчас.

/Влад

+0

Вы добавляете их где-нибудь на свой взгляд? Для идентификации элементов существует свойство 'tag'. В конце цикла вы должны сделать что-то вроде '[self.view addSubview: button]' – DanSkeel

+0

Да, с: [панель addSubview: button] чуть позже. Я забыл добавить раньше, потому что между ним и остальной частью кода были пересчеты для позиции. – Vlad

ответ

0

Каждая итерация цикла присваивает переменной button. Когда цикл завершен, он просто удерживает последнее значение, которое вы ему назначили. Переменная button представляется переменной экземпляра - она ​​уникальна для экземпляра класса, а не для кнопки.

Удобный способ сделать то, что вы хотите, - это получить доступ к переменной sender, которую iOS предоставляет вашему методу. Это удерживает объект, создавший соответствующее событие, в данном случае кнопку.

NSLog (@"%@", ((UIButton *)sender).titleLabel.text); 

Также обратите внимание, что недопустимо регистрировать текстовое значение таким образом. Если он содержит строку формата (например, %@), она ожидает следующий аргумент, который он не получит, и будет аварийно завершен. Это может быть дыра в безопасности. Если у вас есть строковая переменная, которую вы хотите зарегистрировать, используйте %@, чтобы зарегистрировать ее, как указано выше. Xcode уже должен предупредить вас об этом. Не игнорируйте предупреждения.

+0

Большое спасибо, и должным образом отметил о небрежном использовании NSLog. – Vlad

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