«Владелец файла» пользовательского XIB - PullRequest
6 голосов
/ 25 августа 2011

Если я создаю отдельный файл пера, загружаю его в свой viewcontroller и назначаю его для ивара следующим образом:

self.loadingview=[[[NSBundle mainBundle] loadNibNamed:@"loading" owner:self options:nil] objectAtIndex:0];

Можно ли создать IBOutlets для какой-либо вещи в ней, например индикаторов активности? Будет ли Владелец Файла viewcontroller, даже если IB не узнает об этом, поскольку он сделан объектом в коде?

Является ли загрузка пера, как я это сделал, приемлемой практикой?

Возможно, более приемлемой практикой является также создание .h / .m и использование его в качестве класса для XIB, и в этом случае владельцем файла является новый пользовательский класс; Мне все еще нужно использовать вышеуказанный метод в моем контроллере, хотя, при создании ivar из пользовательского класса, верно? Или есть лучший способ сделать все это, не используя xib контроллера?

ОБНОВЛЕНИЕ: Основываясь на некоторых ответах, я сделал следующее. Я избавился от метода NSBundle, описанного выше, и вместо этого просто сделаю это:

@property (nonatomic, retain) IBOutlet UIView*loadingview;

В файле пера для этого представления я нажимаю на Владелец файла и заменяю Custom Class на мой viewcontroller. Затем я перетаскиваю элемент управления «Владелец файла» в представление, и он прекрасно связывается.

В этот момент я бы предположил, что у меня в контроллере есть ивар, self.loadingview, содержащий информацию в кончике. Однако это не тот случай. Я удалил метод NSBundle, предполагая, что контроллер теперь будет загружать наконечник напрямую через выход IB, но вид в наконечнике не отображается, и я не контролирую его в контроллере.

Я также удалил это, когда удалил метод NSBundle:

[self.view addSubview:self.loadingview];

Мне не ясно, как на самом деле отображается представление в этой точке; и если это произойдет, то, где в представлении heirarchy это появляется? возможно это позади других взглядов. Я тоже это попробовал:

[self.view bringSubviewToFront:self.loadingview];

Но вид просто не существует. Чтобы найти его, я сделал:

//[self.view bringSubviewToFront:self.loadingview];

NSLog(@"index: %i",[[self.view subviews]indexOfObject:self.loadingview]);

как с комментируемой частью, так и без нее. Я получаю это:

index: 2147483647

Ответы [ 3 ]

6 голосов
/ 25 августа 2011

Только потому, что вы создали перо, и внутри этого кончика подключен выход на Владельце файла, он автоматически не загружает этот кончик из вашего контроллера представления.

Вы можете использовать класс UINib для этого:

UINib* nib = [UINib nibWithNibName:@"loading" bundle:[NSBundle mainBundle]];
[nib instantiateWithOwner:self options:nil];

Как только вы выполните instantiateWithOwner:self, перо будет загружено, и self будет использоваться в качестве владельца файла, а представление из кончика перья будет связано с вашим свойством loadingView.

Вам все еще нужно позвонить [self.view addSubview:self.loadingView], чтобы добавить его на экран.

1 голос
/ 25 августа 2011

Можно ли создать IBOutlets для какой-либо вещи в ней, например индикаторов активности? Будет ли Владелец Файла viewcontroller, даже если IB не узнает об этом, поскольку он сделан объектом в коде?

Они не были бы IBOutlets, но да, вы можете подключать соединения вручную. IBOutlet - пустой макрос. Он существует исключительно для того, чтобы Interface Builder мог найти свойства, к которым вы хотите подключиться. Но ключевое слово IBOutlet абсолютно не влияет на время выполнения (оно даже не замечено компилятором). Аналогично IBAction - это макрос, который заменяется на void. Ничего о Интерфейсном Разработчике не существует во время выполнения.

Когда загрузчик пера читает файл пера, он десериализует каждый объект, а затем для каждого соединения отправляет установочное сообщение (setFoo:) цели соединения, передающей новый объект. После завершения этого для каждого объекта в nib-файле он отправляет awakeFromNib каждому созданному им объекту. Объекты с целью подключения nil отправляются «владельцу» (в нашем примере это self). Обратите внимание, что владелец файла не создается загрузчиком пера. Загрузчик пера не имеет никакого контроля над фактическим классом владельца файла. Вам необходимо убедиться, что владелец файла отвечает на вызовы set...:, иначе произойдет сбой.

Является ли загрузка пера способом, которым я это сделал, приемлемой практикой?

Я бы не стал полагать, что loadingView будет первым объектом верхнего уровня. Порядок объектов не определен. Вместо этого вы должны использовать IB, чтобы связать представление со свойством loadingView Владельца файла.

Возможно, более приемлемой практикой является также создание .h / .m и использование его в качестве класса для XIB, и в этом случае владельцем файла является новый пользовательский класс; Мне все еще нужно использовать вышеуказанный метод в моем контроллере, хотя, при создании ivar из пользовательского класса, верно? Или есть лучший способ сделать все это без использования xib контроллера?

Традиционный способ сделать это - иметь UIViewController для каждого файла пера в iOS. Но это не обязательно. На Mac NSViewController является довольно новым и не работает так же хорошо, как UIViewController, так что традиции здесь не так сильны. Ручная загрузка, как я описываю, там более распространена, хотя большинство вещей все еще обрабатываются через NSWindowController.

Если вы хотите делать такие вещи, Nib Files в Руководстве по программированию ресурсов необходимо прочитать.

1 голос
/ 25 августа 2011

Интерфейсный Разработчик узнает о владельце файла, который вы отправили через аргумент owner:self.Чтобы отобразить IBOutlet в Интерфейсном Разработчике, вам нужно установить правильный класс Владельца файла в IB на вкладке Идентификация и Тип .

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