2015-07-23 6 views
0

Я искал ответы вроде Get to UIViewController from UIView? и пару других ответов, но не был успешным.Как показать viewcontroller с точки зрения?

Моя проблема заключается в том, что у меня есть кнопка в UIView позволяет говорить class1 и когда я нажимаю на эту кнопку, я хочу, чтобы загрузить другой вид class2, который UIViewController, и как я не получаю navigationController в class1 я не могу загрузить class2 вид.

Пожалуйста, помогите мне с этим.

Thanks, In Advance.

+0

откуда вы показываете 'UIView' класса1? – Akhilrajtr

+0

проверить мой ответ, я отредактировал. –

+0

Я показываю class1 с панели инструментов, всякий раз, когда приложение загружает первый tabBarItem, это класс 1, который по умолчанию выбран. –

ответ

1

В целом UIViews не должен содержать никакой логики, которая запускает поток приложения. Это работа UIViewControllers. Это всего лишь способ сделать дизайн вашего кода лучше и более организованным.

Один из способов, которыми я часто пользуюсь, состоит в использовании шаблона delegate в пользовательских UIViews. Здесь S простая установка:

В файле .h MyCustomView:

@class MyCustomView; 

@protocol MyCustomViewDelegate <NSObject> 
@optional 
- (void)myViewDidTapOnButton:(MyCustomView)myCustomView; 
@end 


@interface MyCustomView : UIView 

@property (weak, nonatomic) id <MyCustomViewDelegate> delegate; 

@end 

В файле .m MyCustomView:

- (IBAction)didTapMyButton:(id)sender { 

    if ([self.delegate respondsToSelector:@selector(myViewDidTapOnButton:)]) { 
     [self.delegate myViewDidTapOnButton:self]; 
    } 
} 

Затем в ViewController, который, представляя Ваше мнение:

интерфейс:

@interface MyViewController()<MyCustomViewDelegate> 

@property (weak, nonatomic) IBOutlet UIView *myCustomView; 

и реализация:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.myCustomView.delegate = self; 
} 

- (void)myViewDidTapOnButton:(MyCustomView)myCustomView { 
    ... code for presenting viewcontroller ... 
} 

Примечание: Даже если вы не используете параметр myCustomView, который отправляется в этом методе, его общую модель и хорошую привычку всегда посылать sender делегата как первый параметр.

Это также широко используется Apple, например. в

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath; 
+0

Я пробовал шаблон «делегировать», но я не мог, так как я новичок в ios, если вы можете предоставить что-то, что может быть более понятным для «делегата», пожалуйста. –

+0

Я добавил примерный пример ответа. – knutigro

+0

Большое спасибо, это сработало хорошо. :-) –

1

два случая:

  • Если вы используете раскадровку, то дайте NavigationController в раскадровки идентификатор. И создайте объект navigationController в вашем пользовательских UIView класса.

  • Если вы настроили приложение запуска с AppDelegate создать public property вашего navigationController. С вашего класса UIView создайте объект appDelegate с [UIApplication sharedApplication].delegate.Из этого объекта доступа к navigationController property

Когда у вас есть navigationController объект, который вы можете нажать ваш ViewController с:

[navigationController pushViewController:ViewController animated:YES];

+0

Да, у меня есть 'AppDelegate', и у меня также есть свойство' navigationController', но когда я делаю 'self.navigationController', я не получаю контроллер навигации. так что я должен вызвать 'pushViewController' с объектом' appdelegate'? –

+0

no, viewcontrollers могут быть нажаты только на объекты 'navigationController' –

+0

извините, это была моя ошибка, см. Отредактированный код сейчас –

0

Когда вы щелкните кнопку, вы можете сделать это:

YouViewController *yourViewController = [YouViewController new]; 
[self.view addSubView:yourViewController.view]; 

Надеюсь помочь вам.

+0

self.view дает ошибку, поскольку свойство 'view' не найдено в' class1' –

+0

Позвольте мне посмотреть ваш код. – Scott

+0

SomeViewController * someViewController = [[SomeViewController alloc] initWithTitle: @ "Map"]; [self.view addSubView: someViewController.view]; –

1

Сначала заполните идентификатор раскадровки с помощью «MyViewController», который является строковым полем, которое вы можете использовать для создания нового ViewController на основе этого раскадровки ViewController. И более поздний доступ к этому контроллеру вида:

- (IBAction)buttonPressed:(id)sender{ 
    MyCustomViewController *newvc = [self.storyboard instantiateViewControllerWithIdentifier:@"MyViewController"]; 
    [self presentViewController:newvc animated:YES completion:nil]; 
} 
+0

Спасибо, ajay за ваши усилия :-), но я не использовал раскадровки, и я получил решение, которое было дано knutigro. –

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