Новый метод извлечения элементов из файлов пера.
Пример ответа ниже.
Этот новый ответ является последним изменением в этом проекте и вопрос
Я хочу создать подкласс UIView и хочу создать файл построителя интерфейса для UIView. Как бы я подключил владельца файла к себе. Я хочу иметь возможность спроектировать представление и заставить его создавать соединения, но мне не нужен контроллер представления.
Кроме загрузки пера в массив, можно ли использовать файл пера в качестве соединителя для самого представления?
Надеюсь, я правильно спрашиваю. Я уточню это.
Создание UIViewController Мне предоставляется возможность создать файл XIB для него. В это время я могу добавить UIViews в XIB, и эти подключения будут сделаны. Однако у владельца файлов, похоже, нет связанного с ним редактора пользовательского интерфейса, поэтому я хочу создать UIView, который станет вложенным представлением в другом представлении. Я действительно не хочу создавать его с помощью кода, потому что это неудобно размещать элементы вручную. Поэтому я хочу использовать ту же конструкцию для создания небольшого пользовательского интерфейса для вставки в
EDIT:
Я снова отредактировал это, когда нашел другой, еще лучший способ загрузки классов пера. Я подумал, что некоторые пользователи переполнения стека захотят это увидеть.
Я хотел найти элегантный способ загрузки UIView из пера. и с некоторой информацией от пользователя переполнения стека PeyloW мне удалось сделать именно это.
Я собираюсь опубликовать свои результаты, так как информация приведет к решению, но это решение кажется мне исключительно элегантным.
- Прежде всего, я создал Xib-файл с именем «TableViewCells.xib»
(Имя соответствует имени класса, поэтому [[self class] description] == "TableViewCells")
- Затем я создал классы, которые я использую для представлений в Nib.
Классы не имеют значения, просто убедитесь, что для объектов класса в конструкторе интерфейсов выбран «Пользовательский класс»
- Наконец, я создал класс "TableViewCells", соответствующий имени файла xib
Мой новый заголовочный файл.
(Каждый из импортированных заголовочных файлов связан с элементами в одном xib-файле.)
#import <Foundation/Foundation.h>
#import "TitleCell.h"
#import "ToggleCell.h"
#import "ButtonCell.h"
#import "TextCell.h"
@interface TableViewCells : NSObject {
UINib *uiNibHolder;
}
@property (nonatomic, readonly) NSArray *nibArray;
// These are the classes that will be loadable.
- (TitleCell*) titleCell;
- (ToggleCell*) toggleCell;
- (ButtonCell*) buttonCell;
- (TextCell*) textCell;
- (id) loadViewByClass: (id) viewClass;
@end
и файл класса.
loadViewByClass: метод, который находит элемент в файле пера.
вспомогательные средства доступа имеют правильный тип для объектов класса, в которые должны быть созданы экземпляры.
ПРИМЕЧАНИЕ. Я бы не рекомендовал загружать в него группу представлений. Чем больше представлений вы загрузите, тем больше будет создаваться при загрузке файла пера.
#import "TableViewCells.h"
@implementation TableViewCells
@synthesize nibArray;
- (void) unloadProperties{
[uiNibHolder release];
}
- (NSArray *)nibArray{
return [uiNibHolder instantiateWithOwner:nil options:nil];
}
- (id) init{
if ((self = [super init]))
{
// Im using the class name for the Xib file.
// This means it will look in TableViewCells.xib
// You can change the class name, or pass a Nib name to this class
uiNibHolder = [[UINib nibWithNibName:[[self class] description] bundle: [NSBundle mainBundle]] retain];
}
return self;
}
- (TitleCell *)titleCell{
return [self loadViewByClass:[TitleCell class]];
}
- (ToggleCell *)toggleCell{
return [self loadViewByClass:[ToggleCell class]];
}
- (ButtonCell *)buttonCell{
return [self loadViewByClass:[ButtonCell class]];
}
- (TextCell *)textCell{
return [self loadViewByClass:[TextCell class]];
}
- (id)loadViewByClass:(Class)viewClass{
for (id item in self.nibArray)
{
if ([item isKindOfClass:viewClass])
{
return item;
}
}
return nil;
}
- (void)dealloc{
[self performSelector:@selector(unloadProperties)];
[super dealloc];
}
@end
Возможность загружать по классам невероятно приятна. И если класс отсутствует в файле xib, он вернет nil.
Это может быть адаптировано для использования нескольких файлов пера в зависимости от типа загружаемых представлений. Используя ленивую технику загрузки, вы можете загружать эти перья только тогда, когда это необходимо, оставляя небольшой объем памяти и все еще позволяя загружать классы через один удобный загрузчик классов.
В качестве демонстрации я использовал TableView для загрузки множества представлений
@synthesize tableViewCellLoader = _tableViewCellLoader;
- (TableViewCells *)tableViewCellLoader{
if (_tableViewCellLoader == nil){
_tableViewCellLoader = [[TableViewCells alloc] init];
}
return _tableViewCellLoader;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
switch (indexPath.row) {
case 0:
return self.tableViewCellLoader.toggleCell;
break;
case 1:
return self.tableViewCellLoader.textCell;
break;
case 2:
return self.tableViewCellLoader.titleCell;
break;
case 3:
return self.tableViewCellLoader.buttonCell;
break;
}
return nil;
}
Как вы можете видеть, я лениво загрузил свой TableViewCellLoader и, если бы захотел, мог бы заставить класс TableViewCells лениво загружать объекты UINib только тогда, когда их классы были вызваны.
Я люблю удобство в коде.
И все же,
Еще раз спасибо PeyloW.