Soru Bir değişkeni UIAlertView temsilcisine nasıl iletirsiniz?


Bir değişkeni nasıl geçirirsiniz UIAlertView temsilci?

Uyarı görünümü temsilcisinde kullanmak istediğim bir değişkenim var. Sadece gösterilen işlevi kullanılır UIAlertView ve UIAlertView Temsilci, bu yüzden denetleyicide bir özellik olması gerektiğini düşünmüyorum. Değişkeni eklemek için bir yol var mı UIAlertView ve delege içine almak?

- (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];
    }                                 
}

24
2018-04-30 17:25


Menşei


olası kopyası UIAlertView'e userInfo nasıl eklenir? - Josh Caswell


Cevaplar:


arayüzden önce .h

extern const char MyConstantKey;
@interface ViewController...

.m içe aktarma:

import <objc/runtime.h>

uygulamadan önce

const char MyConstantKey;

.m uygulamasında

-(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 geri çağırma

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

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

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

}

26
2018-04-30 21:00



Neden MyConstantKey in. - Srinivasan N
Bu çözümü kullanırken sadece aşağıdaki sorunun farkında olun stackoverflow.com/questions/21561211/... - ben-efiz
x86_64 mimarisi için Tanımsız sembollerim var: "_MyConstantKey", başvurulanlar: - kemdo


İlişkilendirilmiş Nesneleri Kullan. Burada daha ayrıntılı olarak açıklanmaktadır: Yeni Arkadaşlarınız: Obj-C İlişkilendirilmiş Nesneler

Kullandığınız nesneyi kullanmak için:

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

Ve sonra geri almak için:

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

Ayrıca eklemeniz gerek static char key; böylece güve yöntemleri kapsamındadır.

Güncelleştirme

Bunu bir kategoriye ekledim UIAlertView. Bunu getirmek için Cocoapod'ları kullanabilirsiniz:

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

Kaynak burada mevcut: https://github.com/hypercrypt/HCViews/blob/master/Categories/UIAlertView%2BHCContext.h


14
2018-04-30 20:36





Bir çok ileti, ilişkili nesnelerin arkasındaki (iyi olan) konseptler hakkında konuşur, ancak bazen sadece kodu görmek istersiniz. İşte ya ayrı bir dosyaya ya da varolan birinizin arayüzünün üzerine yerleştirebileceğiniz temiz ve hızlı bir kategori. .m dosyalar (hatta değiştirebilirsiniz UIAlertView ile NSObject ve etkili bir şekilde ekleyin context herhangi bir nesneye özellik):

#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

Ve sonra şöyle bir şey yapabileceksiniz:

NSObject *myObject = [NSObject new];

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

ÖNEMLİ: İçeriği sıfırlamayı unutma dealloc!!


7
2017-09-05 21:20



merhaba, ne demek istiyorsun: dealloc"? - bobsacameno


UIAlertView bir alt sınıfıdır UIView olan bir tag özellik bir tam sayıya ayarlayabilirsiniz. Ne yazık ki, delegeye kendisini tanımlamak / iletmek için bir tamsayıdan başka bir şeye ihtiyacınız varsa, bazı özellikleri (veya indeksleme etiketine sahip bir dizi oluşturacak şekilde) temsilci kendisine gerek duymayacaktır. Advaith'in yolu muhtemelen işe yarayacaktır, ancak teknik olarak Apple tarafından desteklenmemektedir.

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

3
2018-04-30 20:44



Bu sorun için hızlı bir çözüm için oldukça iyi BUT ne: 1. Eğer bir tamsayı ama bir dize ve 2. farklı eylemler ile başka bir uyarı görünümü varsa ve eylemleri dayalı yazmak istiyorsanız kendi etiketlerinde? - arniotaki


En düz ileri yolun, uyarı görünümündeki temsilci sınıfındaki bir özellik olduğundan şüpheleniyorum. Bir uyarı görünümünde "kullanıcı bilgisi" için herhangi bir hüküm yoktur ve alt sınıfa destek vermez, bu da akla gelen tek kısayolları kaldırır.


1
2018-04-30 17:35



Kesinlikle alt sınıflamayı destekliyor. - Jonathan Grynspan
UIAlertView Dokümanı - UIAlertView sınıfı, olduğu gibi kullanılmak üzere tasarlanmıştır ve alt sınıflamayı desteklemez - Jeffery Thomas
@commentators: UIAlertView alt sınıflarını önerme, ancak temsilci sınıfına bir özellik ekleme (örneğin, AlertView kullanan ViewController) önermedi. Bu benim görüşüme göre geçerli bir seçenek. - avf


Alt sınıf UIAlertView, seçtiğiniz tipte userInfo adlı bir özellik ekleyin. Alt sınıf UIAlertView örneğini oluşturduğunuz anda kullanıcı bilgisi değerini ayarlayın ve temsilci yönteminden alın. (Orada userInfo tutan alt sınıf örneği alırsınız)


0
2018-04-30 20:32



Alt sınıf olmamalıdır UIAlertView. - hypercrypt
@hypercrypt: Sanırım neden UIAlertView'ın alt sınıflara aykırı olmamasını istediğini biliyorum ama nedenlerini söyleyebilmen için bunu paylaşır mısın? (NVM aşağıda bir yorum yazıyor) - Mattia
@hypercrypt Neden UIAlertView alt sınıfını olmamamız gerektiğini söylüyorsunuz. Örneğin denedim ve çok çalıştı! - Advaith
Jeffery Thomas'ın da aşağıda yazdığı gibi, UIAlertView Sınıf Referansı: UIAlertView sınıfı, olduğu gibi kullanılmak üzere tasarlanmıştır ve alt sınıflamayı desteklemez. Bu sınıf için görünüm hiyerarşisi özeldir ve değiştirilmemelidir. - hypercrypt
Yukarıdaki yorumuma ek olarak, iOS 5 üzerinde çalışırken iOS 6 veya 7 veya 8'de olmayabilir. Apple'ın alt sınıflara açık bir şekilde söylemediğinden UIAlertView Gelecekte, örneğin onu bir sınıf kümesine çevirerek, değiştirme hakkını saklı tutarlar. Eğer yaptılarsa, kodunuz kesinlikle kırılacaktır. - hypercrypt