2009-12-07 25 views
7

Kodumda düzgün çalışması için çekirdek verileri yedeklenmiş bir NSArrayController alıyorum sorun yaşıyorum. Ben setSelectionIndex çağırmak istediğinizde :,NSArrayController başlatma

pageArrayController = [[NSArrayController alloc] initWithContent:nil]; 
    [pageArrayController setManagedObjectContext:[self managedObjectContext]]; 
    [pageArrayController setEntityName:@"Page"]; 
    [pageArrayController setAvoidsEmptySelection:YES]; 
    [pageArrayController setPreservesSelection:YES]; 
    [pageArrayController setSelectsInsertedObjects:YES]; 
    [pageArrayController setClearsFilterPredicateOnInsertion:YES]; 
    [pageArrayController setEditable:YES]; 
    [pageArrayController setAutomaticallyPreparesContent:YES]; 
    [pageArrayController setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"index" ascending:YES]]]; 
    BOOL result = [pageArrayController setSelectionIndex:0]; 

o seçimi başarıyla değiştirildi belirten EVET döndürür: Aşağıda benim kodudur. Ancak, sonraki getSelectionIndex çağrısı pageArrayController nesnesini NSNotFound döndürür.

Anlamadığım şey, NSArrayController'ı bir NIB'ye yerleştirir ve NIB dosyasının başlatmayı gerçekleştirmesine izin vermesidir (Interface Builder'daki tüm aynı özniteliklerle birlikte), NSArrayController düzgün çalışır.

Neden davranışlarda bir fark var? NIB dosyası bu tür nesneleri özel bir şekilde başlatıyor mu? NSArrayController'ın başlatılması hatalı mı?

Herhangi bir yardım için teşekkür ederiz. Teşekkürler.

+0

'-getSelectionIndex' yöntemi diye bir şey yoktur. Böyle bir yöntemi kendin mi yazdın yoksa aslında farklı bir şey mi çağırdın? –

+0

Yani -selectionIndex demek. –

cevap

14

Evet, hazretler nesneleri özel bir şekilde başlatır ve bazen bunu nasıl kopyalayacağımı anlamak zor olabilir. Ben de bununla uğraştım ve sonunda cevabı Apple'ın Temel Veri Programlama Kılavuzu >> Çekirdek Verileri ve Cooca Bağlamaları >>Automatically Prepares Content Flag (Cocoa Dev listesindeki Dave Fernandes'e teşekkürler) buldu. Cevap, bir dizi denetleyicisini sıfır içeriğiyle başlatırsanız, bir getirme işlemini de gerçekleştirmeniz gerekir.

BOOL result; 
NSArrayController *pageArrayController = [[NSArrayController alloc] initWithContent:nil]; 
[pageArrayController setManagedObjectContext:[self managedObjectContext]]; 
[pageArrayController setEntityName:@"Page"]; 
NSError *error; 
if ([pageArrayController fetchWithRequest:nil merge:YES error:&error] == NO) 
    result = NO; 
else 
{ 
    //do all that other pageArrayController configuration stuff 
    result = [pageArrayController setSelectionIndex:0]; 
} 

BTW, [NSSortDescriptor sortDescriptorWithKey: @ "index" artan: EVET]] bir uyarı yükseltir.

+0

Ayrıca, [self managedObjectContext] kullanımınız appDelegate için pageArrayController yöntemlerini eklediğiniz anlamına gelir. Bu iyi uygulama olarak görülmemektedir.Gerçekten, uygulamanızın tüm sayfa işlevlerini yerine getirecek ayrı bir sayfa denetleyici nesnesi (ve MVC şablonunu uygulamak için gereken model ve görüntüleme nesnelerini) oluşturmayı gerçekten göz önünde bulundurmalısınız. Sayfa denetleyicisi veya sayfa modeli nesneleri gerektiğinde [[NSApp temsilci] managedObjectContext] öğesini arayabilir. –

+0

Bu çözüm için teşekkürler, mükemmel çalışıyor. Uygulamamın yapısı çok daha güzel, şimdi bu dizi denetleyicilerini kodlara dayanarak değil kodda oluşturabilirim. –

+0

Sen benim arkadaşım, bir efsane! Dizi denetleyicimin neden iCloud'dan Core Data depomuza yeni veri geldiğini güncellemediğini anlamaya çalışırken günler geçirdim. Şimdi mükemmel çalışıyor. Teşekkür ederim. – Fin

0

Bildiğim kadarıyla davranışlarında farklılık olabilir neden olarak:

  1. Nib dosyaları NSCoder kullanarak tefrika nesneleri depolamak.
  2. Muhtemelen şeylerin IB tarafında, kodunuzda yönetilen nesne bağlamını doğrudan ayarlanmış bir yöntem kullanarak ayarlıyorsunuz. Ben aksini tarafından yakın Xcode yok

    [pageArrayController bind:@"managedObjectContext" 
           toObject:self 
           withKeyPath:@"managedObjectContext" 
            options:nil]; 
    

    Ben bazı şeyleri denemek:

Belki kodunuzda aşağıdaki gibi bir şey deneyebilirsiniz. Umarım bu size doğru yönde gitmeniz için bazı ipuçları verir.

0

Dizi denetleyicinizi nerede oluşturuyorsunuz/yapılandırıyorsunuz? Çekirdek Veri yığını henüz hazır olmayabilir, bu nedenle [self managedObjectContext] 'e yapılan çağrınız sıfır olabilir.

Ayrıca, bunu neden Interface Builder ile yapabilmeniz için programlı olarak oluşturuyorsunuz? Araç orada ve iyi çalışıyor (ve birçok olası kodlama hatasını ortadan kaldırıyor), bu yüzden kullanmamanız için iyi bir nedeniniz olmadıkça, kendinize herhangi bir iyilik yapmıyorsunuz.

+0

Benim durumumda, NSArrayController IB kullanıldığında olduğu gibi NSArrayController oluşturmakta, NSArrayController'daki bağlanmış veriler henüz 'awakeFromNib' yöntemine yüklenmemiştir. IB'de sorunu nasıl çözeceğinizi biliyor musunuz? – xyz