#ios #ipad #uisplitviewcontroller
#iOS #iPad #uisplitviewcontroller
Вопрос:
Я взял проект, основанный на стандартном шаблоне iPad SplitViewerController, и реализовал рекурсивную детализацию навигации на любое количество уровней следующим образом:
Сначала я создал новый контроллер представления (с именем NavItemController), который я помещаю в стек контроллера в методе didSelectRowAtIndexPath RootViewController следующим образом:
NavItemController *navItemController = [[NavItemController alloc] initWithNibName:@"NavItemController" bundle:[NSBundle mainBundle]];
navItemController.title = catalogue.name;
[[self navigationController] pushViewController:navItemController animated:YES];
Затем я использую этот контроллер представления для всей навигации вверх и вниз по моей древовидной структуре (поэтому RootViewController теперь используется только для отображения начального корневого уровня навигации, т.Е. Элементов без родительских элементов).
Все это работает хорошо.
Теперь я пытаюсь обновить метку в детальном представлении (detailViewDescriptionLabel) при выборе элемента в NavItemController. Для этого я сначала добавил выход в свой NavItemController:
@property (nonatomic, strong) IBOutlet DetailViewController *detailViewController;
и настроил его в InterfaceBuilder, добавив контроллер представления из библиотеки в список объектов, изменив его класс на DetailViewController и подключив выход, который я нашел под владельцем файла.
На данный момент, если я пройдусь по своему коду, я обнаружу, что он правильно устанавливает элемент detailItem в моем представлении detail для объекта, выбранного в моем NavController, и, похоже, он правильно устанавливает значение detailDescriptionLabel.text в значение из этого элемента detailItem. Однако это не отражается в пользовательском интерфейсе (он все еще работает, если я делаю это из RootViewController).
Я предполагаю, что я что-то неправильно подключил или где-то пропустил шаг — я (очевидно) довольно новичок в iOS — любые указатели будут оценены.
Ответ №1:
В итоге я решил свою проблему, создав свой проект с нуля, используя iOS 5 и шаблон Master Detail. Я также решил использовать функцию раскадровки.
Я смог использовать MasterViewController (такой же, как RootViewController в более раннем шаблоне) для моей рекурсивной навигации, т.Е. Мне не нужно было создавать отдельный контроллер представления.
Код в методе MasterViewController didSelectRowAtIndexPath оказался:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSManagedObject *selectedObject = [[self fetchedResultsController] objectAtIndexPath:indexPath];
self.detailViewController.detailItem = selectedObject;
NavItem *navItem = ((NavItem *) selectedObject);
Catalogue *catalogue = nil;
Document *document = nil;
if (navItem.catalogue != nil) // Load child catalogues and documents
{
catalogue = [navItem catalogue];
DataLoader *dataLoader =[(AppDelegate *)[[UIApplication sharedApplication] delegate] dataLoader];
[dataLoader drillDownIntoNavItems:catalogue];
UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:[NSBundle mainBundle]];
MasterViewController *controller = [storyBoard instantiateViewControllerWithIdentifier:@"master"];
controller.managedObjectContext = self.managedObjectContext;
controller.title = catalogue.name;
[[self navigationController] pushViewController:controller animated:YES];
}
else if (navItem.document != nil) // Load attachments
{
document = [navItem document];
DataLoader *dataLoader =[(AppDelegate *)[[UIApplication sharedApplication] delegate] dataLoader];
[dataLoader drillDownIntoNavItems:document];
UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:[NSBundle mainBundle]];
MasterViewController *controller = [storyBoard instantiateViewControllerWithIdentifier:@"master"];
controller.managedObjectContext = self.managedObjectContext;
controller.title = document.name;
[[self navigationController] pushViewController:controller animated:YES];
// Display document in detail viewer
}
else // attachment
{
// Display attachment in popover
}
}
Также важен метод viewWillDisappear в MasterViewController:
- (void)viewWillDisappear:(BOOL)animated
{
if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) {
// back button was pressed. We know this is true because self is no longer
// in the navigation stack.
DataLoader *dataLoader =[(AppDelegate *)[[UIApplication sharedApplication] delegate] dataLoader];
[dataLoader drillUpIntoNavItems];
}
[super viewWillDisappear:animated];
}