Использование пользовательского UIView из нескольких контроллеров представления - PullRequest
4 голосов
/ 07 июня 2009

Я создал пользовательский UIView, который я хотел бы использовать на нескольких различных контроллерах представления в моем приложении iPhone. В настоящее время я скопировал UIView, который содержит элементы управления из файла nib для первого контроллера представления, вставил его в другие контроллеры представления и затем связал все действия с каждым контроллером представления. Это прекрасно работает, но я не могу использовать этот пользовательский вид.

Мой пользовательский вид довольно прост, он состоит из нескольких кнопок UIB с метками, и нажатие на эти кнопки запускает действия, которые изменяют содержимое элементов управления в представлении моего контроллера представления.

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

РЕДАКТИРОВАТЬ: ОК, основываясь на предложениях Дж.Биарда, я попробовал следующее без особой удачи.

Я создал другой файл пера на основе UIView с содержимым (на данный момент только некоторые объекты UIButton) моего многоразового представления и подклассами UIView .m и .h файлов, а затем установил класс Owner файла nib для моего вновь созданного имени класса.

Затем я добавил большую часть кода из J.Biard (я изменил прямоугольник на 50,50,100,100, на данный момент не включив setDelegate, так как сейчас я просто пытаюсь заставить его работать визуально, и я обнаружил, что [self.view addSubview: view] работал намного лучше, чем [self addSubView: view]) до конца метода viewDidLoad первого контроллера представления, который отображается при запуске приложения.

И теперь я вижу свой главный вид с черным квадратом. Я где-то пропустил розетку, или необходима инициализация в initWithFrame или drawRect в подклассе UIView?

Ответы [ 2 ]

5 голосов
/ 01 июля 2010

Создайте свой класс MyCustomView и файл пера.

В файле пера установите для владельца файла значение MyCustomView, а затем создайте представление в обычном режиме с верхним уровнем UIView. Создайте IBOutlet в MyCustomView, чтобы связать его с UIView верхнего уровня в файле пера.

В MyCustomView добавьте этот метод:

- (BOOL) loadMyNibFile {
if (![[NSBundle mainBundle] loadNibNamed:@"MyCustomView" owner:self options:nil]) {
    return NO;
}
return YES;
}

В ваших контроллерах представления вы можете использовать этот пользовательский вид примерно так

- (void)viewDidLoad {

MyCustomView *customView = [[MyCustomView alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
[customView loadMyNibFile];
[self.view addSubview:customView.view]; //customView.view is the IBOutlet you created
    [customView release];

}

Вы также можете создать метод удобного класса в MyCustomView, чтобы сделать это, если хотите.

3 голосов
/ 07 июня 2009

Если это очень просто, я бы порекомендовал вам создать подкласс UIView в коде и создать экземпляры этого класса (или вы можете использовать Interface Builder для создания пользовательского UIView, который затем архивируется в файл NIB и восстанавливается позже также используя код).

Используя решение кода, вы можете создавать экземпляры вашего пользовательского UIView в вашем контроллере, вызывая что-то вроде:

#import "MyCustomView.h"

// let the superview decide how big it should be or set it as needed.
CGRect sizeRect = CGRectMake(0,0,0,0);

// create an instance of your view   
MyCustomView *view = [MyCustomView alloc] initWithFrame:sizeRect];

// set a custom delegate on the view or set callback methods using @selector()...
[view setDelegate:self];  // self = view controller

// add the view to the controller somewhere... (eg: update CGRect above as needed)
[self addSubView:view];

// don't forget to release the view somewhere ;-)

В этом примере предполагается, что вы создаете протокол делегата, на который может отвечать ваш View Controller, или вы можете динамически связывать события, используя @selector. Если вы не хотите создавать экземпляры представления в коде, вы можете добавить «UIView» в свой файл NIB и установить его тип класса в окне инспектора (команда -> 4 -> раскрывающийся список классов).

Если вы хотите сделать все в конструкторе интерфейсов, вы можете создать свой собственный UIView и использовать что-то вроде "- (NSArray *) loadNibNamed: (NSString *) имя владельца: (id) опции владельца: (NSDictionary *) опции" ( см. NSBundle) для динамической загрузки файла NIB. Это создает свои собственные проблемы, хотя это также возможно.

Наиболее сложным вариантом будет создание собственной библиотеки / плагина пользовательского интерфейса xcode, чтобы ваш пользовательский элемент управления / представление можно было перетаскивать в каждый файл NIB из окна библиотеки, как и любой другой элемент управления, поставляемый Apple.

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

Cheers-

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...