Cocoa : Как использовать NSNib несколько раз самостоятельно

Я спросил, как сделать, чтобы пользовательское представление повторялось в нескольких отдельных копиях, и мне сказали, что я должен использовать NSNib или NSViewController. У меня есть настраиваемое представление в файле пера, и всякий раз, когда пользователь нажимает кнопку, я хочу, чтобы появлялась новая копия представления пера, сохраняя при этом предыдущую где-то еще на экране до десять отдельных представлений, работающих одновременно. Поскольку каждый из них принимает некоторый пользовательский ввод, прежде чем появиться, я предполагаю, что каждый из них должен быть отдельным объектом или чем-то еще, чтобы сделать их отличными и не мешать друг другу.

Я могу сделать так, чтобы первое из представлений появилось с помощью

NSNib *nib = [[NSNib alloc] initWithNibNamed:@"IndividualTimers" bundle:nil];

[nib instantiateNibWithOwner:self topLevelObjects:nil];

Но это просто перезапускает одно и то же представление каждый раз, когда нажимается кнопка, я могу сказать, что оба представления были объединены в это представление, потому что таймер, который появляется на нем, начинает тикать в два раза быстрее, но они должны независимо отображаться в двух разных экземплярах. представления.

Кто-то сказал мне, что я должен использовать установить другого владельца файла.

До сих пор люди были полезными, но не очень конкретными. Я не знаю, какого владельца файла я должен установить, как программно создать новый объект для хранения каждого экземпляра загруженного пера (если это вообще так) или мне нужен отдельный объект для каждой загрузки.

По сути, я хочу знать, как взять один файл пера и использовать его в качестве шаблона для загрузки до десяти отдельных раз, в то время как каждое из (до) десяти представлений выполняется одновременно, но независимо.

Я был бы очень признателен за любую конкретную помощь, которую вы могли бы дать, поскольку это единственная самая большая проблема, с которой я столкнулся при программировании в Xcode. Я застрял на несколько недель. Спасибо за помощь.


person Elbimio    schedule 03.08.2011    source источник
comment
Что такое self, когда вы выполняете инстанцирование несколько раз? Это один и тот же объект? Это может быть источником ваших проблем. Какой тип объекта является собой?   -  person ThomasW    schedule 03.08.2011
comment
Я предполагаю, что это конкретный экземпляр класса (из которого есть только один), поэтому я думаю, что они сказали мне, что всякий раз, когда действие запускается, один и тот же объект используется повторно, а не создается новый.   -  person Elbimio    schedule 03.08.2011
comment
Я думаю, вам нужно будет предоставить больше информации о том, в каком классе вызывается этот код.   -  person ThomasW    schedule 03.08.2011
comment
Попробуйте выполнить отладку, распечатав значение self NSLog(@"obj=%@", self) или используя отладчик.   -  person ThomasW    schedule 03.08.2011
comment
Регистрация просто дает: obj=‹InputClass: 0x1005593b0› InputClass — это имя класса, использующего NSNib   -  person Elbimio    schedule 03.08.2011
comment
Но это один и тот же экземпляр каждый раз, когда вы его вызываете (в одном сеансе)?   -  person ThomasW    schedule 03.08.2011
comment
Да, вот что я не знаю, как изменить.   -  person Elbimio    schedule 03.08.2011


Ответы (1)


Когда вы создаете экземпляр файла пера, он назначает незаархивированные объекты свойствам своего владельца файла.

Если вы подключаете свойство IBOutlet UIView к корневому представлению в своем пера, то при создании экземпляра пера вновь созданный объект будет назначен этому свойству.

Чтобы создавать новый объект каждый раз при создании экземпляра пера, вам необходимо скопировать значение свойства IBOutlet в другое место, поскольку оно будет перезаписано при следующем создании экземпляра пера.


Например, если предположить, что вы подключили свойство timerViewFromNib к NSView в вашем файле пера:

@property (nonatomic, assign) IBOutlet NSView *timerViewFromNib;
@property (nonatomic, assign) NSView *timerView1;
@property (nonatomic, assign) NSView *timerView2;

Вы можете добавить получение и отображение двух отдельных экземпляров этого представления следующим образом:

NSNib *nib = [[NSNib alloc] initWithNibNamed:@"IndividualTimers" bundle:nil];

[nib instantiateNibWithOwner:self topLevelObjects:nil];
self.timerView1 = self.timerViewFromNib;
self.timerView1.frame = CGRectMake(...);
[self.view addSubview:self.timerView1];

[nib instantiateNibWithOwner:self topLevelObjects:nil];
self.timerView2 = self.timerViewFromNib;
self.timerView2.frame = CGRectMake(...);
[self.view addSubview:self.timerView2];

self.timerViewFromNib = nil;
person titaniumdecoy    schedule 03.08.2011
comment
Под свойством timerView вы имеете в виду основное представление, которое будет отображать каждое из этих подпредставлений? - person Elbimio; 03.08.2011
comment
В этом примере UIViewController, который является владельцем файла пера, должен иметь свойство timerViewFromNib (связанное с NSView в файле пера). - person titaniumdecoy; 03.08.2011
comment
Да, но поскольку это NSView, это NSView в моем файле пера, который будет отображать каждое отдельное представление, или это NSView, к которому будут добавлены эти отдельные представления? - person Elbimio; 03.08.2011
comment
Было бы лучше использовать CollectionView или продолжать делать это таким образом? - person Elbimio; 03.08.2011
comment
Каждый раз, когда создается экземпляр пера, новое представление таймера будет разархивировано из пера и назначено свойству timerViewFromNib. Вы можете добавить это представление в представление вашего контроллера представления (self.view в примере). - person titaniumdecoy; 03.08.2011
comment
Вы должны использовать NSCollectionView, если вам нужна сетка представлений таймера. - person titaniumdecoy; 03.08.2011