Я относительно новый в мире XCode/iOS; Я сделал несколько приличных приложений на основе раскадровки, но я ни разу не перерезал себе зубы на всю вещь nib/xib. Я хочу использовать те же инструменты для сцен для проектирования/компоновки многоразового представления/управления. Поэтому я создал свой первый xib для моего подкласса view и нарисовал его:
У меня установлены мои подключения и ограничения, так же, как я привык делать в раскадровке. Я установил класс моего File Owner
в класс моего подкласса UIView
. Поэтому я предполагаю, что могу создать этот подкласс вида с некоторым API, и он будет настроен/подключен, как показано.
Теперь вернемся в свою раскадровку, я хочу включить/повторно использовать это. Я делаю это в ячейке прототипа таблицы:
У меня есть представление. Я установил его класс в свой подкласс. Я создал выход для него, чтобы я мог манипулировать им.
Вопрос $64: где/как я могу указать, что этого недостаточно, чтобы просто поместить пустой /unconfigured экземпляр моего подкласса вида, но использовать .xib, который я создал для его настройки/создания? Было бы здорово, если бы в XCode6 я мог просто ввести XIB файл для использования для данного UIView, но я не вижу поля для этого, поэтому я предполагаю, что мне нужно что-то сделать в коде где-то.
(Я вижу другие вопросы, подобные этому на SO, но не нашел ни одного запроса этой части головоломки или не обновился с XCode6/2015)
Update
Я могу получить эту работу, выполнив мою ячейку таблицы awakeFromNib
следующим образом:
- (void)awakeFromNib
{
// gather all of the constraints pointing to the uncofigured instance
NSArray* progressConstraints = [self.contentView.constraints filteredArrayUsingPredicate: [NSPredicate predicateWithBlock:^BOOL(id each, NSDictionary *_) {
return (((NSLayoutConstraint*)each).firstItem == self.progressControl) || (((NSLayoutConstraint*)each).secondItem == self.progressControl);
}]];
// fetch the fleshed out variant
ProgramProgressControl *fromXIB = [[[NSBundle mainBundle] loadNibNamed:@"ProgramProgressControl" owner:self options:nil] objectAtIndex:0];
// ape the current placeholder frame
fromXIB.frame = self.progressControl.frame;
// now swap them
[UIView transitionFromView: self.progressControl toView: fromXIB duration: 0 options: 0 completion: nil];
// recreate all of the constraints, but for the new guy
for (NSLayoutConstraint *each in progressConstraints) {
id firstItem = each.firstItem == self.progressControl ? fromXIB : each.firstItem;
id secondItem = each.secondItem == self.progressControl ? fromXIB : each.secondItem;
NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem: firstItem attribute: each.firstAttribute relatedBy: each.relation toItem: secondItem attribute: each.secondAttribute multiplier: each.multiplier constant: each.constant];
[self.contentView addConstraint: constraint];
}
// update our outlet
self.progressControl = fromXIB;
}
Это так же просто, как потом? Или я слишком много работаю для этого?