Как я могу программно получить доступ к элементам пользовательского интерфейса в NIB, не подключая их? - PullRequest
7 голосов
/ 19 февраля 2010

Я обдумываю написание некоторых вспомогательных функций, чтобы упростить внесение простых изменений в элементы пользовательского интерфейса в моем iPhone NIB. В основном - я хочу получить доступ к UILabel или другому элементу через его Имя в Интерфейсном Разработчике. Это возможно? Есть ли более разумный подход?

Пример

Скажем, я хочу создать супер простое приложение для iPhone, которое отображает «Hello World». Я запускаю новый проект, а затем открываю NIB и перетаскиваю UILabel в свое представление и присваиваю ему «Имя» из «LblMain». Теперь, предполагая, что я включил свою удобную вспомогательную функцию, я бы хотел присвоить метке новый текст примерно так:

[helper setText:@"Hello World" forLabel:@"LblMain"];

-или-

UILabel *ObjTmp = [helper getUILabel:@"LblMain"];
ObjTemp.text = @"Hello World";

Теперь - уловка в том, что я не добавил:

IBoutlet UILabel *ObjLblMain;

где-нибудь в файле .h - я просто динамически обращаюсь к этому ярлыку - разве это не было бы хорошо?!

Теперь, для простых приложений, чтобы добавить еще несколько меток или изображений, я мог бы перетащить их в свой NIB, назначить им имена в окне инспектора этого элемента, а затем сразу же получить к ним доступ внутри кода без проблем и проблем с их добавлением .h файл.

Мотивация

  • По сути, я разочарован тем, что мне нужно подключить каждый элемент в моем NIB - это много заиканий и бухгалтерии, которых я бы предпочел избежать.
  • Я мог бы дать дизайну некоторые соглашения об именах, и они могли бы генерировать NIB, не имея необходимости быть тесно связанными с реализацией.

Ответы [ 5 ]

8 голосов
/ 19 февраля 2010

Имя на 100% недоступно после загрузки объекта, что я всегда считал странным.

Доступен «тег», если вы действительно хотите получить доступ к элементу без определения выхода, вы можете установить (только целочисленное) значение «тега», а затем в суперпредставлении, содержащем вызов тегированного элемента, viewWithTag: переходя в то же целое число. Не забудьте, что по умолчанию установлено значение «0», поэтому используйте что-то другое.

4 голосов
/ 19 февраля 2010

Вы можете определенно загрузить NIB программно, найти все объекты и запросить их, чтобы выяснить, что указывает на что. Просто посмотрите на Загрузка файлов пера программно . Но проблема в том, что имя идентификатора Interface Builder не раскрывается вне IB. Поэтому я не уверен, что бы вы использовали в качестве параметра "forLabel". Поле «Имя» - это просто удобство для окна документа IB. Это не свойство на NSObject.

1 голос
/ 28 мая 2014

Это можно сделать с помощью тега элемента:
Допустим, у вас есть xiv-файл UIView, называемый «yourView», и внутри него есть UILabel, к которому вы хотите получить доступ без подключения.

  1. Установите тег для UILabel в xib-файле "yourView", давайте предположим, что вы установили тег UILabel на 100.
  2. После загрузки «yourView» в любом месте вы можете получить UILabel без использования проводки с помощью этого кода.
    UILabel* yourlabel =(UILabel*) [yourView viewWithTag: 100]; //do whatever you want to your label.
0 голосов
/ 30 сентября 2014

Для iOS6 + вы можете использовать restoreId вместо тега, чтобы сделать его более «читабельным», например, вы можете установить одно и то же имя в файле nib и в идентификаторе восстановления.

Если вы не хотите связывать все выходы из своего пера с вашим viewcontroller, вы все равно можете получить к ним доступ, выполнив поиск в дереве текущего подпредставления представления. Обратите внимание, что расположение подпредставлений - это дерево (то же самое дерево, которое вы можете видеть в вашем nib-файле), поэтому вам потребуется выполнить некоторую рекурсию, если у вас есть вложенные представления.

Например:

UIButton *nibButtonView = nil;
for (UIView *view in [self.view subviews]){
    if ([view.restorationIdentifier isEqualToString:@"myNibButtonView"]){
        nibButtonView = (UIButton *)view;
    }
}
[nibButtonView setTitle:@"Yeah" forState:UIControlStateNormal];

В вашем nib-файле у вас должна быть кнопка со значением restoreId, равным «myNibButtonView», вы можете найти текстовое поле restoreId в инспекторе идентификации (третий столбец утилит)

Вы можете использовать это, если у вас огромное количество торговых точек, и вы не хотите связывать их все.

0 голосов
/ 14 октября 2011

Я думаю, вы можете попробовать открыть xib в каком-то внешнем редакторе в виде XML и посмотреть, как его видит компилятор, тогда вы, возможно, можете сделать то же самое

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