Программно создавая UIButton внутри пользовательского подкласса UIView, как получить доступ к владельцу файла, чтобы добавить целевой метод? делегаты? - PullRequest
2 голосов
/ 19 апреля 2011

У меня есть контроллер корневого представления, который загружает пользовательский подкласс UIView, который я создал, и добавляет его как подвид.

Внутри этого пользовательского подкласса UIView я кодирую / генерирую UIButton в методе awakeFromNib.

Есть ли простой способ получить доступ к владельцу файла без создания делегата, если метод действия UIButton находится внутри корневого контроллера представления?

Например,

[myButton addTarget:[self.file_owner ?] action:@selector(methodInFileOwner:) ....

Использование Interface Builder по-прежнемуЛегко назначить UIView мой пользовательский подкласс UIView и просто перетащите ссылку селектора UIButton к владельцу файла.Вуаля!

Как это делается через код?Нужно ли создавать делегата и использовать

[myButton addTarget:[self.delegate] ... 

?

Ответы [ 3 ]

4 голосов
/ 19 апреля 2011

Владельцем файла является концепция Interface Builder. По сути, он не существует на стороне программирования, потому что он не нужен. В Интерфейсном Разработчике Владельцем Файла является класс, который создает экземпляр nib-файла. Часто это просто относится к классу файла пера, с которым вы сейчас работаете. Поскольку вы работаете с контроллером представления, владельцем файла является ваш подкласс контроллера представления, и он позволяет устанавливать соединения с переменными экземпляра и методами этого класса.

На стороне программирования, в этом случае, эквивалент Владельца Файла будет просто self. И вы получаете доступ к переменной экземпляра, используя свойства, как self.instanceVariable.

На ваш вопрос. Если вы хотите, чтобы метод селектора был в контроллере представления, это имеет смысл. Но затем контроллер представления может создать кнопку, установить ее цель / действие и добавить ее в качестве подпредставления к пользовательскому представлению. Вы можете сделать это в -viewDidLoad, который вызывается после загрузки nib-файла и является стандартным местом, где вы могли бы сделать какие-либо программные дополнения к контроллеру представления. Итак, вы можете сделать это следующим образом:

- (void)viewDidLoad {
    self.myButton = [[[UIButton alloc] initWithFrame:CGRectMake(x, y, width, height)] autorelease];
    self.myButton.buttonType = ...;
    [myButton addTarget:self action:@selector(actionMethod)...];
    self.myCustomView = [[[MyCustomViewClass alloc] initWithFrame:...] autorelease];
    [self.myCustomView addSubview:self.myButton.view];
    [super viewDidLoad];
}

Приведенный выше код является лишь примером. Вы можете инициализировать ваши объекты по-разному. В этом случае кнопка теперь будет переменной экземпляра контроллера представления. Но вы можете так же легко оставить его в пользовательском представлении и просто ссылаться на него: self.myCustomView.myButton

Надеюсь, это полезно.

Исправление: приведенный выше код должен быть в viewWillAppear, а не viewDidLoad. Когда вызывается viewDidLoad, геометрия (то есть границы вида) еще не установлена. Таким образом, для установки рамки любого объекта это необходимо сделать в viewWillAppear.

1 голос
/ 19 апреля 2011

Цель должна быть объектом класса контроллера корневого представления.В вашем подклассе UIView вам потребуется ссылка на ваш класс контроллера корневого представления.

0 голосов
/ 19 апреля 2011

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

  • Вы можете иметь пользовательский подпредставитель обрабатывать события UIControl и распространять их в кнопку. Ваше пользовательское подпредставление будет реализовывать методы UIControl и, по сути, передавать их кнопке.
  • Вы также можете использовать делегата, как вы упомянули.
  • Или вы можете реструктурировать его так, чтобы иерархия виджетов сглаживалась, но их отображение было вложенным.

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

В разделе Делегаты и источники данных в разделе Руководства по основам какао приведен пример того, как код выглядит для создания делегатов.

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