#xcode #ios #uinavigationcontroller
#xcode #iOS #uinavigationcontroller
Вопрос:
У меня есть UINavigationController, которому необходимо управлять несколькими контроллерами просмотра. Контроллер навигации находится в Take.m ниже, а каждый контроллер просмотра — в своем собственном файле (см. CamverViewController.m ниже). Как новый разработчик XCode, я пытаюсь выяснить, как структурировать приложение, чтобы такие события, как нажатие кнопки на панели навигации, могли получить доступ к экземпляру контроллера навигации для изменения активного контроллера просмотра. Я понимаю, как управлять контроллерами представлений, но мне нужен совет по настройке обработки событий.
Примечание: я удалил нерелевантные методы из примера источника.
Приветствуются любые ссылки, образцы, советы.
В этом классе создаются экземпляры UINavigationController и контроллера представления верхнего уровня.
Возьмите.m Источник
@implementation Take
(UINavigationController*) createController {
//Controllers for navigation interface
CameraViewController *cameraViewController=[[CameraViewController alloc]init];
UINavigationController *navigationController=[[UINavigationController alloc]initWithRootViewController:cameraViewController];
navigationController.toolbarHidden=NO;
//Create tab bar item
navigationController.title=@"Take";
UITabBarItem *tabBarItem=[[UITabBarItem alloc]initWithTitle:@"Take" image:NULL tag:0];
navigationController.tabBarItem=tabBarItem;
[navigationController.view.window addSubview:navigationController.view];
return navigationController;
}
@end
Это контроллер просмотра верхнего уровня, который содержит панель навигации и правую боковую кнопку, при нажатии на которую необходимо изменить вид в контроллере навигации. Когда это событие попадает в ловушку, основной вопрос заключается в том, как получить доступ к контроллеру навигации в Take.m для управления активным контроллером просмотра?
CameraViewController.m
@implementation CameraViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
//Navigation bar items
[self configureNavigationBarItems];
//Toolbar for navigation interface
[self configureToolbarItems];
}
return self;
}
-(void) configureNavigationBarItems{
//Add navigation bar items
// [navigationController setNavigationBarHidden:YES];
UIBarButtonItem *categorizeButton=[[UIBarButtonItem alloc]initWithTitle:@"Categorize" style:UIBarButtonItemStylePlain target:self action:@selector(categorizeButtonHandler:)];
self.navigationItem.rightBarButtonItem=categorizeButton;
}
-(void) configureToolbarItems{
UISegmentedControl *options=[[UISegmentedControl alloc]initWithItems:[NSArray arrayWithObjects:@"Photo",@"Video", nil]];
options.segmentedControlStyle=UISegmentedControlStyleBar;
options.selectedSegmentIndex=0;
[options addTarget:self action:@selector(toggleSorting:) forControlEvents:UIControlEventValueChanged];
UIBarButtonItem *optionButton=[[UIBarButtonItem alloc]initWithCustomView:options];
UIBarButtonItem *spacer=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
self.toolbarItems=[NSArray arrayWithObjects:spacer,optionButton,spacer, nil];
}
#pragma mark - Event Handlers
- (void)categorizeButtonHandler:(id)sender
{
UIBarButtonItem *barButton=(UIBarButtonItem*)sender;
//How to access the navigation controller here???
}
@end
Ответ №1:
Это может показаться немного перевернутым с ног на голову, но UINavigationController спроектирован так, чтобы находиться на вершине иерархии view controller. Таким образом, вы не должны создавать экземпляр контроллера навигации внутри UIViewController (я предполагаю, что это Take.m)
Тот факт, что в верхней части экрана отображается панель навигации, которую вы создаете в своем контроллере просмотра, может создать впечатление, что ваш контроллер просмотра содержит контроллер навигации — это не так. UINavigationController вставляет для вас навигационную панель над вашим контроллером просмотра (или вы можете отключить ее, и тогда UINavigationController просто предоставляет отличный способ управлять переключением экрана, вызывая push и pop).
Попробуйте добавить UINavigationController непосредственно в window как RootViewController, затем поместите свой UIViewController в стек, чтобы отобразить ваш первый экран.
Затем вы получаете доступ к UINavigationController с помощью:
self.navigationController
из вашего контроллера просмотра (для вас будет задано свойство NavigationController) вы можете создать новый VC, открыть его самостоятельно или задать новую конфигурацию VC с помощью setViewControllers.