Владельцем файла является концепция 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
.