Может ли UIAlertView передать строку и int через делегата - PullRequest
2 голосов
/ 26 марта 2011

У меня есть UIAlertView (на самом деле несколько), и я использую метод -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex для запуска действия, если пользователь не нажимает кнопку отмены. Вот мой код:

- (void)doStuff {   
        // complicated time consuming code here to produce:
        NSString *mySecretString = [self complicatedRoutine];
        int myInt = [self otherComplicatedRoutine];

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"HERE'S THE STUFF" 
                                                        message:myPublicString // derived from mySecretString
                                                       delegate:nil 
                                              cancelButtonTitle:@"Cancel" 
                                              otherButtonTitles:@"Go On", nil];
        [alert setTag:3];
        [alert show];
        [alert release];        
    }

и тогда я хотел бы сделать следующее:

- (void)alertView:(UIAlertView *)alertView 
clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex == 1) {
        if ([alertView tag] == 3) {
                        NSLog(@"%d: %@",myInt,mySecretString);
        }
    }
}

Однако этот метод не знает о mySecretString или myInt. Я определенно не хочу пересчитывать их, и я не хочу хранить их как свойства, так как -(void)doStuff редко, если вообще вызывается. Есть ли способ добавить эту дополнительную информацию в UIAlertView, чтобы избежать пересчета или сохранения mySecretString и myInt?

Спасибо!

1 Ответ

13 голосов
/ 26 марта 2011

Вероятно, самый быстрый способ связать объект с произвольным другим объектом - это использовать objc_setAssociatedObject.Чтобы использовать его правильно, вам нужен произвольный void * для использования в качестве ключа;Обычный способ сделать это - объявить глобально static char fooKey в вашем файле .m и использовать &fooKey в качестве ключа.

objc_setAssociatedObject(alertView, &secretStringKey, mySecretString, OBJC_ASSOCIATION_RETAIN);
objc_setAssociatedObject(alertView, &intKey, [NSNumber numberWithInt:myInt], OBJC_ASSOCIATION_RETAIN);

Затем используйте objc_getAssociatedObject для получения объектов позже.

NSString *mySecretString = objc_getAssociatedObject(alertView, &secretStringKey);
int myInt = [objc_getAssociatedObject(alertView, &intKey) intValue];

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

...