Как я могу нажать новый View Controller от кнопки внутри subView (другой View Controller) в раскадровке - PullRequest
1 голос
/ 03 февраля 2012

Ух, я серьезно задумался над этим вопросом!

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

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

  1. Хотя в раскадровке у меня есть контроллер видимого представления (vc2), очевидно, что я не могу подключить действие к кнопке с владельцем файла vc2 ', так как Nav Controller находится на главном 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);

}

Есть идеи?

1 Ответ

0 голосов
/ 03 февраля 2012

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

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

...