1

Вау, я много размышлял над вопросом!Как я могу нажать новый контроллер просмотра с помощью кнопки в subView (другой контроллер просмотра) в Storyboard

Итак, у меня есть контроллер вида «ContentView» в другом представлении Controller (Main VC). В главном VC есть контроллер навигации, который был создан с использованием раскадровки. И ContentView загружает 3 разных контроллера вида (vc1, vc2 и vc3) в зависимости от параметров, которые имеет Сегментированный элемент управления. Итак, вопрос в следующем:

Как загрузить новый контроллер просмотра с помощью кнопки в одном из подзонов (vc2), который появится, когда пользователь выберет опцию из сегментированного элемента управления?

  1. Хотя у меня есть видимый контроллер представления (VC2) в моей раскадровке, очевидно, я не могу подключиться действием к кнопке для владельца файла VC2' , так как Nav контроллер находится на главном VC.

  2. Я пытался получить к нему доступ с помощью следующего кода:

    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 не имеет.

Наконец, как я загрузить 3 подвидами, находится здесь:

-(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); 

} 

Любые идеи?

ответ

0

EDIT: Основываясь на ваших комментариях, я считаю, что делегаты будут работать лучше. Так вы можете это реализовать. Скажем, в 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. В этом методе вы можете переключить индекс, а не использовать, если, хотя они работают так же, и вы также можете использовать 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. Поэтому убедитесь, что их класс связан, и что их идентификаторы установлены правильно. а затем просто оставите их такими, какими они есть, потому что вы не собираетесь делать их отдельно. Они будут перенесены в стек через код.

Надеюсь, это поможет.

+0

Спасибо, что дело в том, что у меня нет проблем с загрузкой контроллеров представления (vc1, vc2 и vc3) из другого представления под названием contentView. ContentView не занимает весь вид из Main View со своим собственным V C, он занимает только нижнюю часть представления. Проблема в том, что у меня есть элементы управления в каждом контроллере представления (vc1, vc2 и vc3), внутри contentView, который является подзором основного вида. Так что я хочу сделать, чтобы нажать новый контроллер представления на главный вид, но с помощью кнопки, которая находится в другом представлении с другим контроллером представления (vc1 или vc2 или vc3) в основном представлении. – naSh

+0

Извините, не ясно, что именно вы пытаетесь сделать. В этом случае вы пробовали создавать делегаты, чтобы указать MainView, что добавить в его подвид? Это может сработать. – Canopus

Смежные вопросы