Я обычно создаю свои пользовательские представления программным образом и планирую их также программно инициализировать с помощью стандартных методов init (например, initWithFrame: SomeParam: OtherParam). Можно ли использовать такие пользовательские представления в сочетании с xib файлом? То есть, имея родительский xib файл, который имеет различные из этих пользовательских представлений в качестве подзонов, в которых этим подзонам может понадобиться использовать другой метод init?
Пользовательские представления iOS в файлах xib
Ответ 1
Если вы добавляете пользовательские представления в xib файл, вы не можете использовать пользовательский инициализатор. Все они будут инициализированы с помощью initWithCoder
.
Как правило, вы делаете любую настройку в обычном методе, называемом оттуда, или в awakeFromNib
.
Если вам нужно установить какие-либо пользовательские свойства на вашем представлении, исходящие извне, сделайте это в viewDidLoad
вашего контроллера вида.
Ответ 2
Получить представление xib инициализируется обычным способом, и с помощью ссылки сделайте пользовательские настройки. эту часть можно поместить в метод init, например this-
-(void)initfunction{
UIView *containerView = [[[NSBundle mainBundle] loadNibNamed:@"myView" owner:self options:nil] lastObject];
containerView.property1 = xyz;//Customization
containerView.property2= abc;//Customization
containerView.frame = CGRectMake(x,y,z,p);//Customization
[rootView addSubview:containerView];
}
точка - это когда мы используем xib, который мы не инициализируем явно, функции утилиты xib
возвращают инициализированный объект (UIView
), после получения объекта UIView
он может использовать инициализированный объект как обычный объект для внесения дополнительных пользовательских изменений.
Ответ 3
Конечно, это возможно. перетащите uiview в xib не внутри представления по умолчанию. затем сделайте IBOutlet UIView *myCustomView;
, а затем соедините его с другим видом. Когда вы хотите показать это представление, добавьте это как [self.view addSubview:myCustomView];
, когда хотите удалить его.
[myCustomView removeFromSuperView];
Ответ 4
Классы UINib (iOS) и NSNib (OS X) обеспечивают лучшую производительность в ситуациях, когда вы хотите создать несколько копий содержимого файлов nib. Обычный процесс загрузки nib-загрузки включает в себя чтение файла nib с диска и последующее создание объектов, которые он содержит. Однако, с классами UINib и NSNib, файл nib считывается с диска один раз, и содержимое сохраняется в памяти. Поскольку они находятся в памяти, создание последовательных наборов объектов занимает меньше времени, поскольку не требует доступа к диску.
- Создайте однообразный xib файл: щелкните правой кнопкой мыши проект → Новый файл → Пользовательский интерфейс → Вид (например, у вас будет "MyView.xib" )
- Заполните представление с помощью Interface Builder
-
Добавьте следующий метод к вашему родительскому компоненту
static UINib *nib = nil; - (UIView*)createNewViewFromNib: (NSString *)nibFileName { if( nib == nil) { nib = [UINib nibWithNibName:nibFileName bundle:nil ]; } // Unarchiving objects from the nib. You can do it multiple times to create a number of objects from same nib. NSArray* topLevelObjs = [nib instantiateWithOwner:self options:nil]; if (topLevelObjs == nil) { NSLog(@"Warning! Could not load nib file.\n"); return nil; } // We have only one view in the nib. return [topLevelObjs objectAtIndex:0]; }
-
Используйте следующую строку кода, чтобы создать экземпляр для просмотра с помощью многократно используемого объекта nib:
UIView *item = [self createNewViewFromNib:@"MyView"]; // [self.view addSubview:item];