2009-07-23 12 views
10

Bu kod bir UITableViewController alt sınıf viewDidLoad yöntemindedir. UITableViewController alt sınıfı bir test yöntemi içerir.Bir NSDictionary öğesini kendi değerlerinden biri olarak nasıl seçebilirim?

Bir özel durum üretiliyor olmadan çöker. Genellikle bunlar serileştirme daha esnek çünkü dizeleri kullanmak ve hata ayıklama okumaya sözlük kolaylaştırmak için tercih

// Set selector 
SEL inSelector = @selector(something:); 
NSValue *selectorAsValue = [NSValue valueWithBytes:&inSelector objCType:@encode(SEL)]; 
id dict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"some text", @"text", selectorAsValue, @"selector", nil]; 

// Retrieve selector 
SEL outSelector; 
[(NSValue *)[dict objectForKey:@"selector"] getValue:&outSelector]; 
// Now outSelector can be used as a selector, e.g. [self performSelector:outSelector] 

cevap

5

Kullanım NSValue seçici sarmak için çıktı.

// Set selector 
SEL inSelector = @selector(something:); 
NSString *selectorAsString = NSStringFromSelector(inSelector); 
id dict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"some text", @"text", selectorAsString, @"selector", nil]; 

// Retrieve selector 
SEL outSelector = NSSelectorFromString([dict objectForKey:@"selector"]); 
+3

Bir izleme olarak, NSValue nesnede olmayan nesne türlerini sarma için doğru sınıftır. NSPoint, NSRect ve NSSize'nin hepsi kendine özgü kuruculara ve sayı tiplerine NSNumber alt sınıfı tarafından sarılmıştır, ancak keyfi yapıları da örtebilir ve hatta nesneleri tutmadan sarmalayabilirsiniz. Not olsa ... NSValue * yazdığınız * verileri içindir. İkili verilerin rasgele blokları NSData ile sarılmalıdır. –

+1

Bu, NSValue – cfischer

15

pix0r çözümü iyidir, ama:

id dict = [[NSMutableDictionary alloc] initWithObjectsAndKeys: @"some text", @"text", @selector(test), @"selector", nil] 
+0

'daki bir kategori için yalvarır. SEL, bir diziden (bir ad olduğu için) bir değerden (genellikle C skalerlerini ve yapılarını temsil eder) daha doğal olarak eşler. – Chuck

+0

Ayrıca, böyle bir riskli oyun oynamaya açık iseniz bir servisten aşağıya bir gönderi gönderebilirsiniz. –

İlgili konular