2014-11-05 29 views
8

Hikaye kartlarını kullanan Mac belgesine dayalı bir Core Data uygulamasına sahibim. Film şeridi aşağıdaki düzendir: başlık ve içerikler:Çoklu Storyboard Sahnelerinde bir NSArrayController Kullanma

Window Controller 
    Split View Controller 
     Table View Controller 
     Text View Controller 

Benim Çekirdek Veri model iki özelliklerini içeren bir bölüm varlık içeren. Tablo görünümünün her bölüm başlığını göstermesini istiyorum. Metin görünümü seçilen bölümün içeriğini gösterir.

Bir xib dosyası kullanıyor olsaydım, xib dosyasına bir dizi denetleyicisi eklerdim. NSPersistentDocument alt sınıfıma erişmek için dizi denetleyicisini Dosya Sahibine bağlarım. Tablo görünümünü dizi denetleyicisinin layoutObjects özelliğine bağlar ve metin görünümünü dizi denetleyicisinin seçimine bağlardım.

Ancak, storyboard'larla işler daha da karmaşıklaşır. Tablo denetleyicisine bir dizi denetleyicisi ekleyebilir, tablo görünümünü dizi denetleyicisine bağlayabilir ve bölüm başlıklarının tablo görünümünde görünmesini sağlayabilirsiniz. Ancak, dizi denetleyicisi başka bir sahnede olduğu için metin görünümü denetleyicisi bu dizi denetleyicisine bağlanamaz.

Arabirim Oluşturucu'da dizi denetleyicisini nasıl ekleyebilirim böylece hem tablo görünümü denetleyicisi hem de metin görünümü denetleyicisi ona erişebilir ve ona bağlanabilir?

+0

Sadece bir özellik olarak uygulama temsilcinize sokup Ama ne keypaths ebeveyn görünümlerine vardır:

burada bu gösteren bir örnek proje oluşturduktan bu her net hale getirmek için OSX storyboard'larında? – stevesliva

+1

NSViewController bir parentViewController özelliğine sahiptir. Ancak bölünmüş görünüm denetleyicisine bir dizi denetleyicisi ekler ve parentViewController.arrayController.arrangedObjects model anahtar yolunu kullanarak tablo görünümü denetleyicisine tablo görünümü denetleyicisine Değer bağını bağlarsam, uygulama sınıfın KVC uyumlu olmadığını söyleyerek çöker. anahtar arrayController. Dizi denetleyici için bölünmüş görünüm denetleyici alt sınıfına bir çıkış ekledim ve çıkışı IB'de oluşturduğum dizi denetleyicisine bağladım ve aynı çökme meydana geldi. –

+0

Bunu tekrar okuyordum ... Belki de arrayController özelliğinize sahip belirli alt sınıfı döndürmek için parentViewController getterini geçersiz kıldınız mı? Yine de çirkin. – stevesliva

cevap

14

Bu çalışmanın anahtarı, NSViewController alt sınıflarınızın her birinde bir NSArrayController örneğinin bulunması ve bunları merkezi bir veri kaynağı (büyük olasılıkla NSDocument alt sınıfınız) yoluyla birbirine bağlamaktır. Daha sonra bu veri kaynağınıalt sınıflarınız representedObject alt sınıflarınız olarak aşağı inen denetleyicilerinizden geçirerek ayarlayabilirsiniz.

class Document: NSDocument { 

    var dataSource: DataSource? = DataSource() 

    ... 
} 

class DataSource: NSObject, NSCoding { 

    var items: [Item] = [] 
    var selectionIndexes: NSIndexSet = NSIndexSet() 

    ... 
} 

class WindowController: NSWindowController { 

    override var document: AnyObject? { 
     didSet { 
      if let document = self.document as? Document { 
       self.contentViewController?.representedObject = document 
      } 
     } 
    } 

} 

class SplitViewController: NSSplitViewController { 

    override var representedObject: AnyObject? { 
     didSet { 
      for viewController in self.childViewControllers as! [NSViewController] { 
       viewController.representedObject = representedObject 
      } 
     } 
    } 
} 

hüner her representedObject bağlamak için geçerli: İşte iki çocuk görünümü denetleyicileri (Bir ana/ayrıntı kurulum) ile NSSplitViewController bir içerik görünümü denetleyicisi olan bir NSWindowController ile film şeridi uygulaması bir örnektir Hikaye panosunda inen görüş kontrol cihazınızın NSArrayController. SADECE contentArray ANCAK selectionIndexes'u bağlamanız gerekir.

sonuç, merkezi veri kaynağı (yukarıdaki örnekte DataSource alt sınıfı) üzerinden birbirine bağlıdır, çünkü her iki azalan NSArrayController s ilgili selectionIndexes senkronizasyon içinde olmasıdır. ... (çoğunlukla, şaka.) https://github.com/acwright/StoryboardBindingsExample

+0

Etkileyici.Örneğini indirdim ve işe yarıyor. Keşke aylar önce bu cevabın olmasını isterdim. Şu anki projem için bağlayıcıları kullanmayı bıraktım ve geri dönmeyeceğim, ancak senaryoları kullanan gelecekteki projeler için bu cevabı aklımda tutacağım. –

+0

Teşekkürler! Başladığım proje için bağlayıcılardan vazgeçmek üzereydim, ama bir çözüm olması gerektiğini düşündüm! Sonra bana göre, seçimlerin senkronizasyonda kalması meselesiydi! :) –

+0

Çekirdek Veri için çalışmak için var mı? Yaptığınız şeye benzer bir fikrim vardı, ama seçim dizinini alabildiğim ve bir sahneden güncellendiğini kanıtlayabildiğim sırada, ikinci sahnede her zaman boş bir dizi denetleyicisiyle sonuçlanırım. – LighteningKid