2014-12-30 30 views
18

Şu anda bir belge tabanlı Storyboard bazlı Kakao Uygulama (Objective C) 'de NSDocument ile savaşıyorum Erişim Belgesi. NSViewController alt sınıfında belgeye nasıl erişebileceğimi kimse anlatabilir mi?Mac App Storyboard - NSViewController

ben o şu şekilde erişmeye denedim - ama belge null: Yardımlarınız için

[self.view.window.windowController document]; 

Teşekkür!

Saygılarımızla Martin

+0

NSDocument'in '-makeWindowControllers' uygulamasını nasıl uygularım? -addWindowController: 'varsayılan şablon gibi mi? – bluedome

+0

evet follwos olarak uygulanır: - (void) makeWindowControllers { // Belgenin Storyboard dosya adını döndürmek için geçersiz kıl. [self addWindowController: [[NSStoryboard storyboardWithName: @ "Ana" paket: nil] instantiateControllerWithIdentifier: @ "Belge Penceresi Denetleyicisi"]]; } – Martin

+0

NSViewController alt sınıfında '[self.view.window.windowController document]' kodunu nereye koyarsınız? – bluedome

cevap

16

Kendimi bu konuda güreşiyordum. Standart Yosemite şablonunu kullanmaya başladım ve -viewDidLoad numaralı telefondan [self.view.window.windowController document]'u kullanmaya çalışıyorum. Bu noktada, self.view.windownil, yani document'a ulaşmanın bir yolu yok.

hüner -viewWillAppear kadar beklemektir. Bu zamana kadar, self.view.window doldurulur ve document kullanılabilir.

Dizi:, storyboard'un - instantiateControllerWithIdentifier: sonucuyla -self addWindowController: çağırır. -addWindowController:, geri dönmeden önce VC'nin -viewDidLoad numaralı telefonuna bir çağrıyı tetikler. Ardından, son olarak, -viewWillAppear çağrılır (ve document kullanılabilir).

+1

Bu çalışır ve şimdi denetleyicinin 'viewObject'' viewWillAppear' yönteminde pencere denetleyicisinin belgesine ayarlıyorum. Ama merak ediyorum, bunun gerçekten olması gerektiği gibi. Çalışır, ama hacky hisseder. – Pascal

+1

Sonraki adam için not ekleme: Belge pencerenizde bir NSTableView varsa, belge ayarlanmadan önce viewController'daki temsilci yöntemlerini çağırır, bu da satır sayısını döndürmek gibi zor şeylerin yapılmasını zorlaştırır. Bir çözüm, bir belgenin geçerli olduğundan sonra yöntemleri çağırmak için 'myTableView.reloadData' ile' viewWillAppear 'koymaktır. –

1

Asıl soru Objective-C içindi, ancak Swift kullanan diğer kullanıcılar için protokollerin yardımcı olabileceğini biliyorum. Temel kavram, Objective-C'de de uygulanabilir.

yerine geri pencere kontrolöre ulaşma, sen bağımlılık enjeksiyon kullanabilirsiniz:

1) pencere denetleyici ve dokümana erişmek için gereken herhangi bir görünüm denetleyicileri üzerinde document mülkü oluştur (veya representedObject özelliğini kullanması zaten var). Bunu daha kolay hale getirmek için belge özelliğini tanımlamak veya bu rotayı izlerseniz belge türünüze representedObject özelliğini dökmek için bir protokol kullanabilirsiniz. Belgeye erişmesi gereken tüm görüntü denetleyicilerini, bu protokolü benimseyin. Bu) belgedir gibi belge alt sınıfının makeWindowControllers() yöntemde

protocol DocumentAccessing { 
    var document: MyDocument? { get set } // could also use an implicitly unwrapped optional if the document is required to be set for the app to function 
} 

2), pencerenizi denetleyicisi oluşturduktan sonra, (kendine olan belge özelliğini ayarlayın. Pencere denetleyici alt sınıf içi

- (void)makeWindowControllers { 
    MyWindowController *windowController = MyWindowController() 
    windowController.document = self; 
    [self addWindowController:windowController]; 
} 

3), kendi bakış denetleyicileri örneğini sonra, pencere kontrolörün belge özelliğine görünümü denetleyicisi belge özelliğini ayarlayın.

4) Şimdi görünüm denetleyiciniz yüklendiğinde, belge özelliği doldurulmalıdır.

1

Bu doğrudan sorusunu sormaz. Ama aşağıdaki Q & bir bağlantı NSViewController ait preparedObject yararlanarak, bağları kullanarak NSControl nesnelerden Dokümanınızdaki veri modelini erişmek için nasıl kullanılacağını gösterir.

https://developer.apple.com/library/content/qa/qa1871/_index.html

Ben Belgesinde NSViewController için representedObject ayarlayın.Aşağıdaki şekilde m:

- (void)makeWindowControllers { 
NSWindowController* wc = [[NSStoryboard storyboardWithName:@"Main" bundle:nil] instantiateControllerWithIdentifier:@"Document Window Controller"]; 
NSViewController* vc = wc.contentViewController; 
vc.representedObject = self.model; 

[self addWindowController:wc]; 

} benim ViewController ait Şimdi representedObject modellemek için ayarlanır

. Modelimin bir metin özelliği olduğunu varsayarak, bu özelliğe herhangi bir NSControl'ü keyPath ile ViewController aracılığıyla bağlayabilirim: self.representedObject.text

İlgili konular