Как я могу вручную переключаться между UIViewControllers в раскадровке? - PullRequest
25 голосов
/ 02 декабря 2011

Все, что мне нужно, это просмотреть контроллер UIView в том же файле раскадровки вручную с кодом. Я использую раскадровку для создания всех форм и связей. Мое приложение запускается в контроллере навигации, который предоставляет мне доступ к UIView (LoginViewController), а затем переходит в контроллер панели вкладок, который обеспечивает 4 UIViews. По каждому UIView у меня есть .h и .m файлы. Я знаю о методе Segue, это просто, но мне нужен ручной метод. Может я что-то не так делаю.

Я пытался использовать этот метод для отправки контроллера вида в IBAction:

[self.view pushViewController:LoginViewController animated:YES];

Но выдает ошибку:

Неожиданное имя интерфейса «LoginViewController»: ожидаемое выражение

Потребовалось много времени, чтобы понять, что не так, но у меня ничего не получилось. Вот мой RollEnemyController.m файл:

//  RollEnemyController.m
#import "RollEnemyController.h"
#import "LoginViewController.h"
@implementation RollEnemyController;
@synthesize AttackButtonPressed;

- (IBAction)AttackButtonPressed:(id)sender {
    LoginViewController* controller = [[LoginViewController alloc] initWithNibName:@"LoginViewController"  bundle:nil];
    [self.view pushViewController:controller];
}

@end

И это заголовочный файл:

//  RollEnemyController.h

#import <UIKit/UIKit.h>

@interface RollEnemyController : UIViewController

- (IBAction)RollButtonPressed:(id)sender;
@property (weak, nonatomic) IBOutlet UIButton *AttackButtonPressed;

@end

Ответы [ 4 ]

108 голосов
/ 02 декабря 2011

Я предполагаю, что вы используете UINavigationController. Тогда вы можете просто сделать так:

LoginViewController *controller = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil];
[self.navigationController pushViewController:controller animated:YES];

Обновление:

Если вы используете UIStoryboard, вы можете установить идентификатор вашего нового viewcontroller, а затем вставить его в ваш navigationController. Чтобы установить идентификатор, выберите вид, откройте инспектор атрибутов и установите идентификатор (в моем примере это «LoginIdentifier»). Тогда вы можете сделать это:

LoginViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"LoginIdentifier"];
[self.navigationController pushViewController:controller animated:YES];

Как свидетельство, я вижу, что вы используете заглавные буквы для своих методов. Вам, вероятно, следует попытаться избежать этого, и вместо этого использовать опущенные первые символы в именах методов. И так как вы говорите, что изучаете Objective-C, вы должны проверить эту удивительную тему здесь на SO: ссылка .

Обновление 2:

Здесь - это zip-файл с проектом, показывающим, как это сделать. : -)

4 голосов
/ 19 января 2013

Здравствуйте, попробуйте использовать этот код

Раскадровка положить ID = "ххх * Имя Желание" пометить использование StoryboarID

UIStoryboard * storyboard = self.storyboard;

DetailViewController * detail = [storyboard instantiateViewControllerWithIdentifier: @ "xxx * Name Desire"];

[self.navigationController pushViewController: detail animated: YES];
1 голос
/ 02 декабря 2011

Вы упомянули в комментарии, что используете UIStoryboard.Вам известно о UIStoryboardSegue?Все, что вам нужно сделать, это перетащить управление с кнопки на следующий контроллер представления, чтобы установить переход.Затем вы можете выбрать тип перехода.Помните, что ваши контроллеры представления должны быть частью UINavigationController в раскадровке для выполнения анимации «Push».

1 голос
/ 02 декабря 2011

В этом утверждении:

[self.view pushViewController:LoginViewController animated:YES];

похоже вы пытаетесь выдвинуть класс . Вы должны нажать объект, ваш фактический контроллер:

LoginViewController* controller = [[LoginViewController alloc] init...];
[self.view pushViewController:controller animated:YES];

это по крайней мере скомпилируется, и если все остальное в порядке, также даст вам второй контроллер.

РЕДАКТИРОВАТЬ:

Я пропустил одно очко. Вы выдвигаете контроллер вида на вид. Это не имеет смысла, вы должны вставить контроллер в навигационный контроллер:

<AppDelegate> *del = (AppDelegate*)[UIApplication sharedApplication].delegate;
[del.navigationController pushViewController:controller animated:YES];

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...