2014-10-26 16 views
1

enter image description hereКак показать представление программным путем

Выше моей раскадровки. Первое представление подключено к ViewController, а второе не подключено ни к чему. Я знаю, как показать второй контроллер представления, если бы у меня была кнопка на первом. Я могу щелкнуть и перетащить с кнопки на второй вид, создав segue. Однако на этот раз я должен показать программный контроллер второго вида внутри ViewController.m. Например, когда вызывается некоторая функция myFunc, я хочу показать второй контроллер представления. Может кто-нибудь объяснить, как я могу это сделать?

Я думаю, что нужно знать следующее:

  1. Как ссылаться на второй контроллер представления в ViewController.m
  2. Как открыть второй контроллер представления

Спасибо!

UPDATE:

//setSelectedDate is myFunc. It lives inside myView.m, which is a subview of UIView 

- (void)setSelectedDate:(NSDate *)newSelectedDate; { 
    NSLog(@"override worked"); 
    [super setSelectedDate:newSelectedDate]; 

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]]; 
    UIViewController *firstController = [storyboard instantiateViewControllerWithIdentifier:@"InitialViewController"]; 
    UIViewController *myController = [storyboard instantiateViewControllerWithIdentifier:@"MySecondViewController"]; 
    [firstController presentViewController:myController animated:YES completion:nil]; 
} 

я получаю следующее предупреждение, если я выше:

Предупреждение: Попытка представить на чей взгляд не в иерархии окон!

и из этого post Я считаю, что это потому, что я делаю это не в том месте. Как я могу решить эту проблему?

** Обновление 2: Я сделал следующее: **

- (void)setSelectedDate:(NSDate *)newSelectedDate; { 
    [super setSelectedDate:newSelectedDate]; 

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]]; 

    UIViewController *firstController = [storyboard instantiateViewControllerWithIdentifier:@"InitialViewController"]; 

    [firstController performSegueWithIdentifier:@"GoToSecondViewController" sender:firstController]; 

предупреждение исчезает, но контроллер зрения еще не показывает. Это потому, что я вызываю это внутри представления вместо ViewController?

+0

Является ли ваш второй вид представлением или контроллером? –

+0

Это ViewController. Я понял, что мне нужно использовать performSegueWithIdentifier, но я не уверен, как получить ссылку «идентификатор». –

+0

Затем вы можете захотеть, чтобы ваш вопрос был менее неоднозначным, чтобы помочь любому потенциальному ответчику :) –

ответ

2

Вы можете сделать одно из следующих действий:

Создать SEGUE в раскадровку путем перетаскивания из firstViewController ко второму. Затем дайте этому segue имя (заполните поле Identifier, в разделе Attributes inspector в правой панели в Interface Builder). Скажем, «GoToSecondViewController».

В вашем myFunc метода (или функции), вызовите

[self performSegueWithIdentifier:@"GoToSecondViewController" sender:nil]; 

ИЛИ

Дайте вторую ViewController раскадровки ID. Из конструктора интерфейса щелкните второй контроллер просмотра. На правой панели в разделе «Инспектор удостоверений» заполните поле «Искажение расписания». Скажем, «MySecondViewController».

В вашем myFunc метода (или функции) выполните следующие действия:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:[NSBundle mainBundle]]; // or whatever your storyboard is called 
UIViewController *myController = [storyboard instantiateViewControllerWithIdentifier:@"MySecondViewController"]; 
[self presentViewController:myController animated:YES completion:nil]; // present it or push it if you have a navigation controller 
+0

Спасибо! Я думал, что это сработает, но представление не отображается, и я получаю следующее предупреждение: «Предупреждение: попытка представить в , чей вид не находится в иерархии окон!' –

1

Чтобы избежать плотно взаимодействия этих компонентов, вот как я бы это сделать.

В myView.h, добавить протокол делегата, к которому ваш InitialViewController будет соответствовать, и свойство этого типа в myView класса:

@class myView; 

@protocol myViewDelegate 
-(void)datePickerDidChangeValue:(myView*)view; 
@end 

@interface myView : UIView 
@property IBOutlet id<myViewDelegate> delegate; 
// ... other members ... 
@end 

И в своем призыве реализации этого метода делегата в методе setSelectedDate::

-(void)setSelectedDate:(NSDate*)selectedDate 
{ 
    _selectedDate = selectedDate; 
    [self.delegate datePickerDidChangeValue:self]; 
} 

Затем установите свойство delegate в InterfaceBuilder как ваш InitialViewController. Щелкните правой кнопкой мыши на пользовательской точки зрения, а затем перетащить из delegate розетки в вашем ViewController:

Screenshot of Interface Builder

Затем в InitialViewController.h, установите его в соответствии с протоколом myViewDelegate:

#import "myView.h" 

@interface InitialViewController : UIViewController<myViewDelegate> 
// ... members ... 
@end 

и реализовать этот метод делегирования, что-то вроде этого, при условии, что вы настроили идентификаторы, как описано в this answer:

-(void)datePickerDidChangeValue:(myView*)view 
{ 
    NSDate* theDate = view.selectedDate; // do whatever you want with this value 

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:[NSBundle mainBundle]]; 
    UIViewController *myController = [storyboard instantiateViewControllerWithIdentifier:@"MySecondViewController"]; 
    [self presentViewController:myController animated:YES completion:nil]; 
} 
Смежные вопросы