2010-03-11 8 views
5

Aşağıdaki kodumda CustomWindow, NSWindow'un bir alt sınıfıdır. Bunu yüklemek böyle NSWindow (ı XIB'nin içinde bulunduğu tefrika bir ortalama) ortalama olarak şeyler yapabilirsiniz sonraNSWindow Xib işaretçisi yükledikten sonra mı?

CustomWindow *window = [[CustomWindow alloc] init]; 
if (![NSBundle loadNibNamed:@"NibName" owner:window]) 
[window center]; // doesn't work 

Nasıl bir işaretçi sizin XIB'ye kontrol etmek alabilirim?

Burada yanlış olan ne yapıyorum?

cevap

16

NSWindowController alt sınıfı kullanıyor olmalısınız. NSWindowController, tam olarak ne yapmak istediğinizi yapmak için tasarlanmıştır ve ucunu doğrudan NSBundle yöntemlerini kullanarak yüklerseniz karşılaşacağınız birkaç sorunu çözer. Pencereleri yönetmek için genellikle her zaman bir NSWindowController alt sınıfı kullanmalısınız.

NSWindowController bir alt sınıfını oluşturun:

Interface Builder yılında
@interface MyWindowController : NSWindowController {} 
@end 

@implementation MyWindowController 
- (id)init 
{ 
    self = [super initWithWindowNibName:@"MyWindow"]; 
    if(self) 
    { 
     //initialize stuff 
    } 
    return self; 
} 
//this is a simple override of -showWindow: to ensure the window is always centered 
-(IBAction)showWindow:(id)sender 
{ 
    [super showWindow:sender]; 
    [[self window] center]; 
} 
@end 

, MyWindowController olmak ve kalem ucundaki pencere nesnesine Dosyanın Sahibinin ait window çıkışını bağlamak için Dosyanın Sahibinin sınıfını ayarlayın.

Daha sonra, bu yaparak pencereyi görüntüleyebilirsiniz:

aşağıda Benim kod
MyWindowController* controller = [[MyWindowController alloc] init]; 
[controller showWindow:self]; 
+0

Her şeyi yaptığını sen hariç "Dosyanın Sahibinin pencere çıkışını bağlamak", zaten söyledi. Bunu yaptıktan sonra her şey işe yaradı. Çok teşekkürler! +1 ve Kene. –

+0

IB'deki pencerenin 'Restorable 'özelliğinin işaretini kaldırın. –

+0

@KeithSmiley Hangi editörü 'Restorable' özelliktir, ya bu artık Xcode 5.x uygulanır? –

1

Muhtemelen pencerenizi Dosya Sahibi yapmak istemezsiniz. Normalde self veya bazı denetleyici nesnesini oradan geçirirsiniz. Sonra self veya denetleyici nesnesinin bir CustomWindow IBOutlet varsa, loadNibNamed:'u aradığınızda bağlanır. Örneğin kod için this post'a bakın.

+0

CustomWindow denetleyici nesnesidir. Uygulamayı çalıştırdığımda bağlanan IBOutlets içeriyor. Penceredeki kontroller işe yarıyor. Sadece nasıl merkezleneceğini anlayamıyorum. –

0

XIB nesneler için bir kapsayıcıdır, bir pencereye eşit değildir. Bir XIB'yi ortalayamazsınız, sadece bir XIB'de bulunan bir pencereyi ortalayabilirsiniz.

Ayrıca, XIB içindeki nesneler yüklediğinizde oluşturulur. Bir nesneyi daha sonra XIB'deki nesnelerden biri için geçerli olan sahibi olarak iletmezsiniz, bunun yerine XIB'yi yüklerken oluşturulan yeni nesnelere başvurmak için IBOutlet'leri kullanırsınız ve onlarla etkileşime geçebilirsiniz.

Dosyanın Sahip nesnesi, oluşturulmayan ve loadNibNamed:owner:'a ileterek belirtebileceğiniz tek nesne olduğu için XIB'lerde özel bir nesnedir. XIB tarafından oluşturulan nesneler ile uygulamanız arasındaki ağ geçidiniz. Genellikle, nesne sahibi bir çeşit denetleyici sınıftır. Arabirimin Oluşturucusu'ndaki Dosya Sahibi'nin sınıfını denetleyici sınıfınıza ayarlayın, sonra sınıftaki bazı IBOutlet'leri tanımlayın, bunlar File Sahibinde Arabirim Oluşturucusu'nda görünür ve XIB'deki nesnelere bunlara bağlanabilirsiniz. Son olarak, denetleyici nesnesini loadNibNamed:owner:'a ilettiğinizde, Cocoa IBOutlet'lerinizi yeni oluşturulan nesnelere bağlar ve onlarla etkileşimde bulunmak için bunları kullanabilirsiniz. XIB'nizdeki bir pencereyi ortalamak için

+0

Zaten sahip olduğum ayarları açıklıyorsunuz. IBOutlets ile ilgili bir sorun yok ve bir XIB'ye işaretçi almaya çalışmıyorum. XIB ki sen IB "Dosyanın Sahibi" kullandığım şey Yani –

+0

bir işaretçi istediğiniz bir NSWindow içeriyor. LoadNibNamed: yöntemine ilettiğiniz nesne için bir proxy. Diğer cevabı gör. –

+0

Evet, bende öyle. Sorun, XIB'nin window nesnesine bağlı File's Owner pencere çıkışına sahip olmadığım oldu. –

2

, CustomWindow NSWindow bir alt sınıfıdır.

CustomWindow *window = [[CustomWindow alloc] init]; 
if (![NSBundle loadNibNamed:@"NibName" owner:window]) 
[window center]; // doesn't work 

Nasıl bu kadar yük o böyle XIB'nin içine NSWindow ortalama olarak şeyler yapabilirsiniz sonra işaretçi sizin XIB'ye kontrol etmek alabilirim?

“XIB'nin içeride NSWindow ortalama” Eğer xib içindedir NSWindow nesnesi, bu durumda, neden yaratıyor merkezleme ciddi demektir hiçbir anlamı, (ekranın üzerinde o ortalamak olurdu) yapar xib dışındaki bir başka NSWindow (CustomWindow) nesnesi mi?

Bir ucun (veya xib) nesnelerin bir arşivi olduğunu unutmayın. Eğer kalem ucundaki sahip bir pencere kullanmak istiyorsanız, sen, çıkış ekledik sınıfı olmak Dosyanın Sahibinin sınıfını ayarlamak, bu pencereye işaret edecek bir çıkış oluşturmak içinde çıkış kanca gerekir IB ve owner: argüman bunu geçirerek Dosyanın Sahibi olarak çıkış ile nesneyi atar. Bu nesne, sahibi olarak, pencere ile çalışmaktan sorumlu olacaktır. Bu (genellikle benim kodumda), ucu yükleyen aynı nesne olabilir. NSWindow;

Ayrıca, init çalışmıyor. initWithContentRect:styleMask:backing:defer: veya initWithContentRect:styleMask:backing:defer:screen: kullanmanız gerekir. init'u kullanmak, yalnızca CustomWindow'da init'u uyguladıysanız ve [super init…] iletisinin bu iki seçiciden birini kullanmanız durumunda geçerli olur.