Как вы передаете переменную делегату UIAlertView?

Как вы передаете переменнуюUIAlertView делегировать?

У меня есть переменная, которую я хочу использовать в делегате представления предупреждений. Он используется только в функции, которая показываетUIAlertView иUIAlertView делегат, так что я не думаю, что это должно быть свойство на контроллере. Есть ли способ присоединить переменную кUIAlertView и получить его в делегате?

<code>- (void) someUserCondition:(SOCode *)userCode {
    if ([userCode warrentsConfirmation] > 0) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Title" message:@"Are you sure?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK",nil];        
        [alert setAlertViewStyle:UIAlertViewStyleDefault];  
        //TODO somehow store the code variable on the alert view
        [alert show];
    }
}

- (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex   {
    NSString *title = [alertView buttonTitleAtIndex:buttonIndex];
    if ([title isEqualToString:@"OK"]){
       SOCode *userCode = //TODO somehow get the code from the alert view
       [self continueWithCode:code];
    }                                 
}
</code>

Ответы на вопрос(6)

UIAlertView это подклассUIView который имеетtag свойство, которое вы можете установить в целое число. К сожалению, если вам нужно что-то кроме целого числа для идентификации / передачи информации делегату, вам нужно будет установить некоторые свойства (или установить массив с индексированием тега в нем) для самого делегата. Способ Advaith, вероятно, будет работать, но технически не поддерживается Apple.

    Title" message:@"Are you sure?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK",nil];        
    [alert setAlertViewStyle:UIAlertViewStyleDefault];  
    alert.tag = SOMEINTEGER;
    [alert show];

extern const char MyConstantKey;
@interface ViewController...

в. м импорт:

import <objc/runtime.h>

в .м до внедрения

const char MyConstantKey;

в .m реализации

-(void)viewDidAppear:(BOOL)animated{ //or wherever

    NSString *aString = @"This is a string";

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Testing" message:@"test is test" delegate:self cancelButtonTitle:@"Okay" otherButtonTitles:nil];

    [alert show];

    [alert release];

    objc_setAssociatedObject(alert, &MyConstantKey, aString, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

 }

в .m alertview обратный вызов

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{

     NSString *associatedString = objc_getAssociatedObject(alertView, &MyConstantKey);

     NSLog(@"associated string: %@", associatedString);

}

Ваши новые друзья: Obj-C связанные объекты

Чтобы установить объект, который вы используете, используйте:

objc_setAssociatedObject(alert, &key, userCode, OBJC_ASSOCIATION_RETAIN);

А потом вернуть его обратно:

SOCode *userCode = objc_getAssociatedObject(alertView, &key);

Вы также должны добавитьstatic char key; так что это находится в сфере применения методов моли.

Update

Я обернул это в категорию наUIAlertView, Вы можете использовать Cocoapods, чтобы принести это в:

pod 'HCViews/UIAlertViewHCContext', '~> 1.2'

Источник доступен здесь:https://github.com/hypercrypt/HCViews/blob/master/Categories/UIAlertView%2BHCContext.h

добавьте свойство с именем userInfo с типом по вашему выбору. Задайте значение пользовательской информации во время создания экземпляра Subclassed UIAlertView и извлеките его из метода делегата. (Там вы получите подклассный экземпляр, который содержит userInfo)

связанных с ассоциированными объектами (что хорошо!), Но иногда вы просто хотите увидеть код. Это чистая и быстрая категория, которую вы можете поместить в отдельный файл или поверх интерфейса одного из ваших существующих.m файлы (вы могли бы даже заменитьUIAlertView сNSObject и эффективно добавитьcontext свойство к любому объекту):

#import <objc/runtime.h>

@interface UIAlertView (Private)
@property (nonatomic, strong) id context;
@end

@implementation UIAlertView (Private)
@dynamic context;
-(void)setContext:(id)context {
    objc_setAssociatedObject(self, @selector(context), context, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(id)context {
    return objc_getAssociatedObject(self, @selector(context));
}
@end

И тогда вы сможете сделать что-то вроде:

NSObject *myObject = [NSObject new];

UIAlertView *alertView = ...
alertView.context = myObject;

IMPORTANT: И не забывайте обнулять контекст вdealloc!!

что самым простым способом является свойство в классе делегата представления оповещения. В представлении предупреждений не предусмотрено «информации о пользователе». и не поддерживает подклассификацию, которая удаляет единственные ярлыки, которые приходят на ум.

ВАШ ОТВЕТ НА ВОПРОС