Как я могу нажать новый View Controller от кнопки внутри subView (другой View Controller) в раскадровке
Ух, я серьезно задумался над этим вопросом!
Таким образом, у меня есть Контроллер представления под названием "ContentView" в другом Контроллере представления (Main VC). Главный VC имеет контроллер навигации, который был создан с использованием раскадровок. И contentView загружает 3 различных контроллера представления (vc1, vc2 и vc3) в зависимости от опций, которые имеет сегментированный элемент управления. Итак, вопрос сейчас таков:
Как я могу загрузить новый View Controller с кнопки в одном из подпредставлений (vc2), которые появятся, как только пользователь выберет опцию из сегментированного элемента управления?
Хотя в раскадровке у меня есть видимый контроллер представления (vc2), очевидно, что я не могу подключить действие к кнопке с владельцем файла vc2, поскольку Nav Controller находится в главном виртуальном канале.
Я попытался получить к нему доступ с помощью следующего кода:
AppDelegate *del = (AppDelegate *)[UIApplication sharedApplication].delegate; UINavigationController *navigationController = (UINavigationController*)del.window.rootViewController; DetalleMisMarcas *detalleMarcas = [[DetalleMisMarcas alloc] initWithNibName:@"DetalleMarcas" bundle:nil]; [navigationController pushViewController:detalleMarcas animated:YES];
Но это не работает.
Я пытался найти решение на этом форуме, но мне не повезло. Большинство считают, что существование главного окна Xcode 4.2 не имеет.
Наконец, способ загрузки трех подпредставлений здесь:
-(IBAction)segmentCtrlChanged:(id)sender {
UISegmentedControl *seg = sender;
if (seg.selectedSegmentIndex == 0)
{
MMViewController *mm= [self.storyboard instantiateViewControllerWithIdentifier:@"MMView"];
mm.view.frame = CGRectMake(0, 0, 320, 240);
[contentView addSubview:mm.view];
}
else if (seg.selectedSegmentIndex == 1) {
MPViewController *mp = [self.storyboard instantiateViewControllerWithIdentifier:@"MPView"];
mp.view.frame = CGRectMake(0, 0, 320, 240);
[contentView addSubview:mp.view];
}
}
-(IBAction)mainSubView:(id)sender
{
MMViewController *mm = [[MMViewController alloc] initWithNibName:@"MTView" bundle:nil];
[contentView addSubview:theMTView];
mm.view.frame = CGRectMake(0, 0, 320, 240);
}
Есть идеи?
1 ответ
РЕДАКТИРОВАТЬ: Исходя из вашего комментария, я думаю, что делегаты будут работать лучше. Вот как вы можете это реализовать. Скажем, в классе контроллера contentView добавьте делегата
// in the header file @property (weak, nonatomic) id <ContentViewControllerDelegate> delegate; @protocol ContentViewControllerDelegate <NSObject> - (void)contentViewDidSelectAView:(UIView *)view; @end // in the implementation - (IBAction)segmentCtrlChanged:(UISegmentedControl *)sender { case 0: [self.delegate contentViewDidSelectAView:[[self.storyboard instantiateViewControllerWithIdentifier:@"MMView"] view]; break; // and the rest of the code } // in MainView header file @interface MainViewController : UIViewController <ContentViewControllerDelegate> // in MainView implementation - (void)contentViewDidSelectAView:(UIView *)view { [self.view addSubView:view]; }
Я на самом деле не реализовал приведенный выше код. Но я думаю, что это должен быть способ для контроллера разговаривать со своим родителем. Надеюсь, это поможет.
Я не уверен, что именно вы делаете, но допустим, что у вас есть UINavigationController в корне, а mainViewController связан через segue как связь. Как вы уже реализовали, segmentedControl в mainVC должен быть связан с -(IBAction)segmentCtrlChanged:(id)sender
с valueChange
событие. В этом методе вы можете переключать индекс, а не использовать if, хотя они работают одинаково, и вы также можете использовать UISegmentedControl *
вместо id
:
-(IBAction)segmentCtrlChanged:(UISegmentedControl *)sender { switch(sender.selectedSegmentIndex) { case 0: { MMViewController *mm= [self.storyboard instantiateViewControllerWithIdentifier:@"MMView"]; [self.navigationController pushViewController:mm animated:YES]; break; } case 1: { MPViewController *mp = [self.storyboard instantiateViewControllerWithIdentifier:@"MPView"]; [self.navigationController pushViewController:mp animated:YES]; break; } case 2: { // similar to above break; } default: break; }
vc1, vc2 и vc3, - я предполагаю, - являются экземплярами UIViewController. Поэтому убедитесь, что их класс связан, и что их идентификаторы установлены правильно. а затем просто оставьте их как есть, потому что вы не собираетесь делать какие-либо попытки для них по отдельности. Они будут помещены в стек через код.
Надеюсь, поможет.