2009-07-14 10 views
10

UITableView'ime veri besleyen bir sözlük programlı olarak oluşturmak istiyorum ancak bununla zor bir zaman geçiriyorum. this property list (image)'a benzeyen bir sözlük oluşturmak veya birkaç öğe almak istiyorum.Program özellikli bir sözlük özelliği yaratın

Ben "Property List Programming Guide: Creating Property Lists Programmatically" baktım ve kendime ait küçük bir numunesi ile geldi: Masamın görünümleri için hierachy bu verileri kullanmaya çalışıyorum

//keys 

NSArray *Childs = [NSArray arrayWithObjects:@"testerbet", nil]; 
NSArray *Children = [NSArray arrayWithObjects:@"Children", nil]; 
NSArray *Keys = [NSArray arrayWithObjects:@"Rows", nil]; 
NSArray *Title = [NSArray arrayWithObjects:@"Title", nil]; 

//strings 

NSString *Titles = @"mmm training"; 

//dictionary 

NSDictionary *item1 = [NSDictionary dictionaryWithObject:Childs, Titles forKey:Children , Title]; 
NSDictionary *item2 = [NSDictionary dictionaryWithObject:Childs, Titles forKey:Children , Title]; 
NSDictionary *item3 = [NSDictionary dictionaryWithObject:Childs, Titles forKey:Children , Title]; 
NSArray *Rows = [NSArray arrayWithObjects: item1, item2, item3, nil]; 
NSDictionary *Root = [NSDictionary dictionaryWithObject:Rows forKey:Keys]; 

// NSDictionary *tempDict = [[NSDictionary alloc] //initWithContentsOfFile:DataPath]; 
NSDictionary *tempDict = [[NSDictionary alloc] initWithDictionary: Root]; 

.

Bu yüzden kendi dizilerimle doldurmak için özellik listemizi (sözlük) program aracılığıyla nasıl oluşturabilirim diye merak ediyordum.

iPhone geliştirme konusunda hala yeniyim, bu yüzden benimle kalın. ;)

cevap

24

Bu "Bir adam balık öğretmek" bir durum "Birine bir balık ver" daha çok daha yararlı bir yaklaşım olmasıdır. Temel ilkeleri ve NSDictionary API'sini anladıktan sonra, kendi özel çözümünüzü oluşturmak çok daha kolay hale geliyor. +dictionaryWithObject:forKey: tek anahtar-değer çifti ile bir NSDictionary oluşturmak için kullanılır

  • yöntemi: İşte birkaç gözlem ve öğrenme noktalarıdır. Her iki noktadan sonra virgülle ayrılmış argümanlar kabul edilmeyecektir (:) yöntem çağrısında, sadece bir tanesi. Birden çok anahtar/değer çiftiyle bir sözlük oluşturmak için, ilgili 2 yöntemden birini kullanın: +dictionaryWithObjects:forKeys:, değer ve anahtar içeren iki NSArray nesnesini veya değerini (nesne, anahtar, nesne, anahtar) sonlandıran nil bağımsız değişkeni ile kabul eder.
  • Oluşturma kodunu basitleştirin. Sadece bir şey yaratmak için bir milyon yerel değişkene ihtiyacınız yok. Uygun olduğu yerlerde satır içi argümanlar kullanın. Bunu yapmanın bir yolu, kodunuzu kodunda oluşturmaktır, daha sonra (gerekirse) -copy numarasını çağırarak bunun değişmez bir kopyasını oluşturun. (Bir kopyalama yönteminin, bellek sızıntılarını önlemek için bırakmanız gereken yeni bir nesne döndürdüğünü unutmayın.) Böylece, her bir değer için bir değişkene sahip olmanıza gerek kalmaz, böylece yapının "tek çekim" oluşturulmasını sağlayabilirsiniz. Her seviyede.
  • Tek bir nesneye sahip bir NSArray oluşturmak için +arrayWithObject:'u kullanın.
  • (Stil önerileri) Bir değişken, yöntem veya işlevin adını başlatmak için hiçbir zaman büyük harf kullanmayın. (SO'nın, sınıf isimleri gibi baş harfleri değiştiren değişkenleri vurguladığına dikkat edin.) Bu, kodunuzu, adlandırma şemanızla ilgili niyetinizle karıştırılmadan okuyan diğer kişilere kesinlikle yardımcı olacaktır.

Sadece (Ben seçtiğiniz değişken isimleri görmezden ve tamlığı için farklı yaklaşımlar hem kullanıyorum.) ... kodunda nasıl görünebileceğini bağlantılı görüntüde sözlüğü yaratma lezzet vermek için

NSDictionary *item1 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"Screen J",[NSNumber numberWithInt:3],nil] 
                forKeys:[NSArray arrayWithObjects:@"Title",@"View",nil]]; 
NSDictionary *item2 = [NSDictionary dictionaryWithObjectsAndKeys: 
             @"Screen I", @"Title", 
             [NSArray arrayWithObject:item1], @"Children", 
             nil]; 
... 
0
NSMutableDictionary *topLevel = [NSMutableDictionary dictionary]; 

NSMutableDictionary *item1 = [NSMutableDictionary dictionary]; 
NSString *item1title = [NSString stringWithString:@"Title 1"]; 
NSMutableDictionary *item1children = [NSMutableDictionary dictionary]; 

// create children 
NSString *item1child1 = [NSString stringWithString:@"item 1, child 1"]; 

NSMutableDictionary *item1child2 = [NSMutableDictionary dictionary]; 
NSString *item1child2title = [NSString stringWithString:@"Title 1-2"]; 
NSMutableDictionary *item1child2children = [NSMutableDictionary dictionary]; 

NSString *item1child2child1 = [NSString stringWithString:@"item 1, child 2, child 1"]; 
NSString *item1child2child2 = [NSString stringWithString:@"item 1, child 2, child 2"]; 

[item1child2 setObject:item1child2title forKey:@"Title"]; 
[item1child2children setObject:item1child2child1 forKey:@"item 1 child2 child 1"]; 
[item1child2children setObject:item1child2child2 forKey:@"item 1 child2 child 2"]; 

[item1child2 setObject:item1child2children forKey:@"children"]; 

// add children to dictionary 
[item1children setObject:item1child1 forKey:@"item1 child1"]; 
[item1children setObject:item1child2 forKey:@"item1 child2"]; 

// add to item 1 dict 
[item1 setObject:item1title forKey:@"Title"]; 
[item1 setObject:item1children forKey:@"children"]; 

NSMutableDictionary *item2 = [NSMutableDictionary dictionary]; 
NSString *item2title  = [NSString stringWithString:@"Title"]; 
NSMutableDictionary *item2children = [NSMutableDictionary dictionary]; 

NSString *item2child1 = [NSString stringWithString:@"item 2, child 1"]; 
NSString *item2child2 = [NSString stringWithString:@"item 2, child 2"]; 
NSString *item2child3 = [NSString stringWithString:@"item 2, child 3"]; 

// add children to dictionary 
[item2children setObject:item2child1 forKey:@"item2 child1"]; 
[item2children setObject:item2child2 forKey:@"item2 child2"]; 
[item2children setObject:item2child3 forKey:@"item2 child3"]; 

// add to item 2 dict 
[item2 setObject:item2title forKey:@"Title"]; 
[item2 setObject:item2children forKey:@"children"]; 

[topLevel setObject:item1 forKey:@"Item 1"]; 
[topLevel setObject:item2 forKey:@"Item 2"]; 
+0

teşekkür adam: o şekilde şeyler yapmak varsa ben büyük ölçüde aynı şeyi yapar ama nesnelerle anahtarlarını tutan alternatif bir yöntem dictionaryWithObjectsAndKeys: tercih! ... Ben kontrol edeceğim ve bu sözlük şeyler doğru olsun eğer biraz onunla oynamaya çalışacağım;) Ayrıca herhangi bir diziler kullanmadı fark ettim (Ben örneğin resim bağlantıda çocuk gördüm Ve örnek uygulama), Umarım hala çalışır;) Eğer sizden şükranlarım olmasa bile. tekrar thnx .. –

0

ilk önce süper! teşekkürler .. Açıklama ve kod pasajını gerçekten takdir ediyorum. Bana böyle iyi bir açıklama verdiğin için umarım bir kaç soru daha sormamı umursamazsın.

Öncelikle, önerdiğin gibi yaptım ve şu anlama geldim: (Bu kez örnek yerine özgün özellik listemi kullandım, bu yüzden delme tablasının bulunduğu yer burası olsun) treestructure).

http://img509.imageshack.us/img509/7523/picture2lsg.png

NSDictionary *root = [NSMutableDictionary dictionary]; 
NSDictionary *item1 = [NSDictionary dictionaryWithObject:[NSArray arrayWithObject:@"VirtuaGym Online"] forKey:[NSArray arrayWithObjects:@"Title"]]; 
NSDictionary *item2 = [NSDictionary dictionaryWithObject:[NSArray arrayWithObject:@"Do the training"] forKey:[NSArray arrayWithObjects:@"Title"]]; 
NSDictionary *item3 = ... 

[root setObject:item1 forKey:@"Item 1"]; 
[root setObject:item2 forKey:@"Item 2"]; 

Ayrıca ancak ne istediğiniz
NSMutableArray *Rows = [NSMutableArray arrayWithCapacity: 1]; 

for (int i = 0; i < 4; ++i) { 
    NSMutableArray *theChildren = [NSMutableArray arrayWithCapacity: 1]; 
    [theChildren addObject: [NSString stringWithFormat: @"tester %d", i]]; 
NSString *aTitle = [NSString stringWithFormat: @"Item %d", i]; 
    NSDictionary *anItem = [NSDictionary dictionaryWithObjectsAndKeys: aTitle, @"Title", theChildren, @"Children"]; 
    [Rows addObject: anItem]; 
} 

NSDictionary *Root = [NSDictionary withObject: Rows andKey: @"Rows"]; 

sadece bu iki test etmeye karar verdi .. biraz araştırma yaptım ve bazı diğer girişli başka bir şey denedik. Bana bir EXC_BAD_ACCESS hatası veriyor.

Ben Kod snippet'inizde numarasını kullanarak gördüğümden beri Ayrıca Plist kullandığı olacağından ayrıca NSString kullanamadı, merak

.. olabilir tamamen burada tabii

NSDictionary *item1 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"Screen J",[NSNumber numberWithInt:3],nil] 
                forKeys:[NSArray arrayWithObjects:@"Title",@"View",nil]]; 

ve üçüncü Bir soru, uygulamamdaki olası yaklaşımım hakkında. Farklı bilgileri farklı dizilerde kaydeden bir xml ayrıştırıcım var. Bu bilgileri sondaj UITableviews (infoFirstScreen [] infoSecondScreen [] infoThirdScreen []) için kullanmak istiyorum. Sağlanan bilgiler, yukarıda size gösterdiğim ağaç gibi bağlanmalıdır. Bu, sözlüğü kod içinde oluşturmak istediğim için dizilerden bilgi alıp buraya ekleyebilirim. Soruma göre benim yaklaşımım doğru mu, yanlış mı yoksa daha hızlı mı?)

+0

Ayrı bir soru sormaya çalışıyorsanız, yeni bir soru göndermek daha iyi olur, böylece görünürlük ve cevaplar alır. –

2

Ben burada temel hedefi anladığımdan emin değilim;

tekrar gerçekten açıklama için teşekkür ederiz.

Çalışma zamanı gibi görünüyor, birçok çocuk düğümleri ile derin bir sözlük oluşturuyorsunuz. Ama bunu statik kod ile yapıyorsun ... neden sadece bir plist (görüntüde olduğu gibi) yapamaz ve bunu bir NSDictionary içine okuyamazsın? Hem NSDictionary hem de NSArray bir dosyada okumanızı ve doldurulmuş bir nesnenin tamamını almanızı sağlayan yöntemlere sahiptir. Sonra düzenlemek ve anlamak için daha kolay. Bu yöntem dictionaryWithContentsOfFile.

Verilerin tamamı sözlüğüne yerleştirilmeden önce çalışma zamanında oluşturulmuşsa, verilen düz örneklerden çok farklı, özyinelemeli bir kod stili istersiniz. Son olarak, bir sözlüğü oluşturmak için NSDictionary içindeki dictionaryWithObjects:forKeys: yöntemini kişisel olarak sevmiyorum.

NSDictionary *item1 = [NSDictionary dictionaryWithObjectsAndKeys: 
         @"Screen J", 
         @"Title", 
         [NSNumber numberWithInt:3], 
         @"View"]; 
+1

Test etmek istediğimden emin olmak için konuşmam gerekirse, daha sonra örneğin daha fazla özyinelemeye ve dinamik yapmaya çalışabilirim örneğin for (int i = 0; i < 4; ++i) { NSMutableArray *theChildren = [NSMutableArray arrayWithCapacity: 1]; [theChildren addObject: [NSString stringWithFormat: @"tester %d", i]]; NSString *aTitle = [NSString Aşağıdaki "tam" kodu görebilirsiniz. Aslında benim asıl amacım daha dinamik bir yapıya sahip. En azından sözlüğü çalışmasını sağlamaya çalışıyorum, böylece bu dinamik yapmaya başlayabilirim. Son fakat en az değil Thnx geri bildiriminiz için –