Как ввести использование файла NIB в мой существующий пользовательский UIView? - PullRequest
0 голосов
/ 13 июля 2011

как мне ввести использование файла NIB в мой существующий пользовательский UIView?Например:

a) должен ли NIB автоматически каким-либо образом загружаться, если имя названо в виде файла * .h & * .m?(т.е. я говорю о пользовательском UIView здесь, а не UIControllerView)

b) если вам нужно сделать это вручную, вам нужно использовать "[[NSBundle mainBundle] loadNibNamed: @" NIBfilename "owner:собственные параметры: ноль]; "возможно?

в) если да (к пункту b выше), то в каком методе вы делаете это в методе пользовательского представления "- (id) initWithCoder: (NSCoder *) coder"?

PS.Для использования в обсуждении с ответом @ Katfish.Katfish, когда я помещаю строку "NSArray * nibs = [[NSBundle mainBundle] ..." в я получаю рекурсивный цикл попаданий в "initWithCoder"?[PS см. Комментарий, который я только что сделал к ответу @ sergio, который мог бы объяснить это?]

// Code within my custom UIView
- (id)initWithCoder:(NSCoder *)coder {
    self = [super initWithCoder:coder];
    if (self) {
        NSArray *nibs = [[NSBundle mainBundle] loadNibNamed:@"ClockView" owner:self options:nil];
        self = [nibs objectAtIndex:0];
        .
        .
        .
    }
    return self;
}

PSS.Отмечая тот статус, где я нахожусь здесь (см. Комментарии в ответе Серхио), я теперь задаюсь вопросом, возможно ли вообще то, что я делаю?Основано на просмотре Пользовательского UIView из Интерфейсного Разработчика .Возможно, я мог бы создать пользовательский UIView, но использовать его только через создание / создание экземпляра его программно из UIControllerView, из которого я его вызываю?

Ответы [ 4 ]

2 голосов
/ 13 июля 2011

a) должен ли NIB автоматически каким-либо образом загружаться, если имя названо в виде файла * .h & * .m?(т.е. я говорю о пользовательском UIView здесь, а не UIControllerView)

Насколько я знаю, перья не загружаются автоматически, за исключением MainWindow, который загружается UIKit в зависимости от того, что онуказанный в info.plist;

b) если вам нужно сделать это вручную, вам нужно использовать "[[NSBundle mainBundle] loadNibNamed: @" NIBfilename "owner: self options: nil];"возможно?

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

c) если да (см. B выше), то в каком методе вы это делаете, в методе пользовательского представления "- (id) initWithCoder: (NSCoder *) coder"?

Я бы использовал initWithCoder, если вы загружаете базовый вид из пера, initWithFrame, если вы создаете его программно.

РЕДАКТИРОВАТЬ:

Что касается вашего PSЯ предполагаю, что вы установили один из объектов в вашем xib-файле как экземпляр подкласса UIView, в котором вы определяете initWithCoder.(например, если ваш подкласс UIView равен MyView, то вы также создали экземпляр объекта представления в xib и установили его класс на MyView).

Если это так, то что вам нужноdo определяет владельца файла для конкретного производного класса UIView (например, MyView);действительно, вы уже создаете экземпляр производного класса UIView, и при загрузке пера вам нужно только указать владельца файла (через аргумент owner).

РЕДАКТИРОВАТЬ 2:

о, на самом деле явижу, что на самом деле у меня есть (а) в родительском UIControllerView, который использует мой пользовательский вид, в IB для его XIB я использую UIView, который я установил имя класса в «clockview», но затем (b) в моем собственном обычном часовом просмотреXIB-файл UIView (не UIControllerView) Я сделал то же самое и установил имя класса «clockview».Вы знаете, какое имя класса я должен использовать для (а) родительского UIControllerView и (б) самого пользовательского UIView здесь?(немного запутался) - Грег 1 час назад

После прочтения вашего комментария у вас есть два способа сделать это .:

Первый вариант

  1. в xib, связанном с UIViewController, вы делаете все правильно;

  2. в другом файле xib удалите пользовательский UIView (тот, который вы присвоили имени класса clockview;этот объект уже будет создан с помощью xib точки 1, поэтому вам не нужно его создавать снова);выберите владельца файла этого «другого xib» и задайте для его имени класса clockwork.

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

Второй вариант

  1. в вашем UIViewController связанном xib, измените имя класса UIView и установите его на UIView;таким образом, это представление будет "нормальным" представлением, которое вы будете использовать в качестве пустого представления для размещения другого представления из второго файла XIB;

  2. в другом файле Xib, оставьте все какони есть;возможно, вы могли бы установить для владельца файла в этом случае значение UIViewController пункта 1.

Я думаю, что этот второй случай является тем, к которому вы стремитесь.В этом случае вам не нужно делать ничего конкретного в вашем часовом обзоре initWithCoder;что вам нужно, в вашем UIViewController, при необходимости, загрузить представление xib;обычно это может быть в viewDidLoad (или в другом месте, возможно, после нажатия кнопки, это зависит от вашего приложения):

 - (void)viewDidLoad {
     [super viewDidLoad];
     NSArray *nibs = [[NSBundle mainBundle] loadNibNamed:@"ClockView" owner:self options:nil];
     for (NSObject *obj in nibs) {
        if ( [obj isKindOfClass:[clockview class]]) {
            [self addSubview:(clockview*)obj];
            break;
        }
     }
  }

То, что я делаю в этом viewDidLoad, идентифицирует часовой механизмэто создается путем загрузки второго файла XIB;и добавив его в представление контроллера как подпредставление.

Опять же, обратите внимание на аргумент controller, который я передал loadNibNamed;это должно соответствовать объекту, который вы указали как владелец файла второй xib.

Я думаю, что он должен работать таким образом.

0 голосов
/ 13 июля 2011

a) Если у вас есть файл NIB, и владельцем является файл .h, то, когда файл заголовка, подкласс UIViewContoller загружается с [alloc] initWithNibName, тогда NIB загружается автоматически.

б) ДА

в) вы можете использовать метод initWithNibName.

Хотите добавить компонент из файла .xib в существующий UIView, который уже загружен контроллером представления?

Затем вы можете загрузить компонент .xib таким образом, а затем получить компонент из массива.

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {


    // open xib and find tableView
    if ( (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) ) {
        NSArray *nibs = [[NSBundle mainBundle] loadNibNamed:nibNameOrNil owner:self options:nil];

        for (NSObject *obj in nibs) {
            if ( [obj isKindOfClass:[UITableView class]]) {
                self.tableContent = (UITableView *) obj;
            }
        }
        self.view = self.tableContent;              

        [self initializeDefaultValues];     
    }

    return self;
}
0 голосов
/ 13 июля 2011

Вы можете назначить перо для UIView в - (id)init.

- (id)init {

    NSArray *nibs = [[NSBundle mainBundle] loadNibNamed:@"NIBfilename" owner:self options:nil];
    self = [nibs objectAtIndex:0];
    [self retain];

    return self;

}
0 голосов
/ 13 июля 2011

В общем случае, напишите класс yourController, который унаследован от NSObject, и установите для владельца файла пера класс yourController.И в классе yourController обрабатывают загрузку пера ([[NSBundle mainBundle] loadNibNamed: @ "NIBfilename" owner: self options: nil]).
И если вы хотите инициализировать некоторые данные для представления, которое загружается из пера, используйте initWithCoderспособ.

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