Я начинаю пытаться использовать IB, где ранее я использовал код. Я создал перья для iPad / iPhone Portrait / Landscape, поэтому у меня есть четыре возможных вида. Всем владельцам файлов присвоено значение UIViewController, у всех есть объект, добавленный из палитры, установленной в мой подкласс NSObject "TargetObject". Нет проблем с установкой IBActions / IBOutlets, просто перетащите Ctrl, как обычно, чтобы создать код в одном наконечнике, затем щелкните правой кнопкой мыши объект и перетащите действия / выходы в правые элементы управления в других наконечниках, чтобы соединение существовало во всех крупка. Идея состоит в том, что делегат приложения запускает соответствующий контроллер представления для текущего устройства, а затем этот контроллер представления загружает правильное представление в зависимости от ориентации.
(Может быть, при использовании мастерства автоматического изменения размера этот подход не нужен - я хочу знать, возможно ли сделать это таким образом, потому что расположение макетов для правильной перестройки только с помощью этих элементов управления IB очень, очень расстраивает.)
Идея этих представлений типа «один ко многим» и целевых объектов заключается в том, что я могу использовать их в любом месте приложения. Например, где у меня отображается что-то, что является объектом в основных данных
и я хотел бы разрешить подробный просмотр / редактирование в нескольких местах в приложении. Похоже, очень MVC способ делать вещи.
Проблема возникает в loadView контроллера представления, когда я делаю:
NSArray *portraitViewArray = [[NSBundle mainBundle] loadNibNamed:@"Weekview_iPad_Portrait" owner:self options:nil];
portraitWeekView = [portraitViewArray objectAtIndex:0];
NSArray *landscapeViewArray = [[NSBundle mainBundle] loadNibNamed:@"Weekview_iPad_Landscape" owner:self options:nil];
landscapeWeekView = [landscapeViewArray objectAtIndex:0];
// this object is intended to be a common target for portrait and landscape arrays.
weekViewTarget = [portraitViewArray objectAtIndex:1];
UIInterfaceOrientation interfaceOrientation = self.interfaceOrientation;
if(interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
self.view = portraitWeekView;
else
self.view = landscapeWeekView;
Как вы уже догадались, в портретной ориентации все нормально, но в альбомной среде любое взаимодействие с целевым объектом падает. Объект weekViewTarget ссылается на объект, созданный в книжной ориентации, поэтому альбомная ориентация ищет другой экземпляр, который не был сохранен со ссылкой. В альбомной ориентации _viewDelegate имеет значение ноль - это частное, поэтому я не могу исправить это в коде.
Я могу также удерживать целевой объект ландшафта со ссылкой, но тогда будут проблемы при изменении ориентации - в случае каких-либо элементов управления с состоянием, таких как UITableView, источник данных / делегат изменится, что приведет к странному взаимодействию пользователя при вращении. Если я не гарантирую, что целевой объект реализует только простые действия и использует отдельный общий объект для реализации объектов источника данных / делегата для любых требуемых табличных или текстовых представлений.
Одна вещь, о которой я подумал, - сделать цель одиночной. Похоже на взлом, и здесь будут времена, которые не могут работать.
Как правильно создать несколько представлений, реализованных в виде перьев, с использованием общего целевого объекта для работы с моделью?
прогресс - все начинает работать, если я назначу каждой цели указатель на свой тип:
WeekViewTarget *forwardTarget;
и пусть реальный обработчик forwardTarget = nil
, в то время как forwardTarget неиспользуемого обработчика устанавливается следующим образом:
weekViewTarget = [portraitViewArray objectAtIndex:1];
forwardedWeekViewTarget = [landscapeViewArray objectAtIndex:1];
forwardedWeekViewTarget.forwardTarget = weekViewTarget;
, а затем выполните следующие действия в каждом IBAction:
- (IBAction)timeBlockTapped:(id)sender {
if(forwardTarget != nil) {
[forwardTarget performSelector:@selector(timeBlockTapped:) withObject:sender];
} else {
NSLog(@"Got a tap event with sender %@", [sender description]);
}
}
Все еще не чувствует себя хорошо, хотя.