Создание перехода программно - PullRequest
200 голосов
/ 13 марта 2012

У меня есть общий UIViewController, который распространяется на все мои UIViewsControllers для повторного использования некоторых общих операций.

Я хочу настроить переход на этот "Общий" UIViewController, чтобы все остальные UIViewControllers наследуют.

Я пытаюсь выяснить, как мне сделать это программно.

Я думаю, что вопрос также может быть в том, как мне установить segue для всех моих UIViewControllers, не вдаваясь враскадровка и делай их вручную.

Ответы [ 13 ]

344 голосов
/ 09 июня 2013

Я думал, что добавлю еще одну возможность. Одна из вещей, которую вы можете сделать, - вы можете соединить две сцены в раскадровке, используя переход, который не привязан к действию, а затем программным образом запустить переход внутри вашего контроллера представления. Для этого вам нужно перетащить значок владельца файла внизу сцены раскадровки, являющейся сценой перехода, и перетащить вправо к месту назначения. Я добавлю изображение, чтобы помочь объяснить.

enter image description here

Появится всплывающее окно "Ручной переход". Я выбрал Push как тип. Нажмите на маленький квадрат и убедитесь, что вы находитесь в инспекторе атрибутов. Дайте ему идентификатор, который вы будете использовать для ссылки на него в коде.

enter image description here

Хорошо, теперь я собираюсь перейти к использованию кнопки панели инструментов. В viewDidLoad или в другом месте я создам элемент кнопки на панели навигации с таким кодом:

UIBarButtonItem *buttonizeButton = [[UIBarButtonItem alloc] initWithTitle:@"Buttonize"
                                                                    style:UIBarButtonItemStyleDone
                                                                   target:self
                                                                   action:@selector(buttonizeButtonTap:)];
self.navigationItem.rightBarButtonItems = @[buttonizeButton];

Хорошо, обратите внимание, что селектор - buttonizeButtonTap :. Поэтому напишите метод void для этой кнопки, и в этом методе вы будете вызывать segue следующим образом:

-(void)buttonizeButtonTap:(id)sender{
    [self performSegueWithIdentifier:@"Associate" sender:sender];
    }

Параметр sender необходим для идентификации кнопки при вызове prepareForSegue. prepareForSegue - это метод фреймворка, в котором вы будете создавать экземпляр своей сцены и передавать ей все значения, необходимые для ее работы. Вот как выглядит мой метод:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"Associate"])
    {
        TranslationQuizAssociateVC *translationQuizAssociateVC = [segue destinationViewController];
        translationQuizAssociateVC.nodeID = self.nodeID; //--pass nodeID from ViewNodeViewController
        translationQuizAssociateVC.contentID = self.contentID;
        translationQuizAssociateVC.index = self.index;
        translationQuizAssociateVC.content = self.content;
    }
}

Хорошо, только что проверил и все работает. Надеюсь, это поможет вам.

166 голосов
/ 13 марта 2012

По определению, сегмент не может существовать независимо от раскадровки. Это даже там, в названии класса: UIStoryboardSegue. Вы не создаете сегменты программно - это среда выполнения раскадровки, которая создает их для вас. Обычно вы можете вызвать performSegueWithIdentifier: в коде контроллера вашего представления, но это зависит от того, настроен ли уже переход в раскадровке для справки.

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

- (IBAction)pushMyNewViewController
{
    MyNewViewController *myNewVC = [[MyNewViewController alloc] init];

    // do any setup you need for myNewVC

    [self presentModalViewController:myNewVC animated:YES];
}

и затем в своем производном классе вызовите этот метод, когда нажата соответствующая кнопка или выбрана строка таблицы или что-то еще.

80 голосов
/ 23 мая 2013

Я использовал этот код для создания экземпляра своего пользовательского подкласса segue и запуска его программно. Вроде работает. Что-то не так с этим? Я озадачен, читая все остальные ответы о том, что это невозможно.

UIViewController *toViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"OtherViewControllerId"];
MyCustomSegue *segue = [[MyCustomSegue alloc] initWithIdentifier:@"" source:self destination:toViewController];
[self prepareForSegue:segue sender:sender];
[segue perform];
45 голосов
/ 15 мая 2012

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

Что я сделал, чтобы решить проблему, когда я представлял вид входа в систему в качестве первого экрана, а затемхотел перейти к приложению, если логин был правильным.Я создал переход от контроллера входа в систему к корневому контроллеру представления и дал ему такой идентификатор, как «myidentifier».

Затем, проверив весь код входа в систему, если имя входа было правильным, я бы позвонил

[self performSegueWithIdentifier: @"myidentifier" sender: self];

Мое самое большое недоразумение заключалось в том, что я пытался поставить кнопку на кнопку и как бы прервать ее, как только она была найдена.

32 голосов
/ 15 сентября 2012

Вы должны связать свой код с UIStoryboard, который вы используете. Удостоверьтесь, что вы входите в YourViewController в вашем UIStoryboard, нажимаете на рамку вокруг него, а затем установите для его поля identifier значение NSString, которое вы вызываете в своем коде.

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" 
                                                     bundle:nil];
YourViewController *yourViewController = 
 (YourViewController *)
  [storyboard instantiateViewControllerWithIdentifier:@"yourViewControllerID"];
[self.navigationController pushViewController:yourViewController animated:YES];
16 голосов
/ 21 декабря 2012

Для контроллеров, которые находятся в раскадровке.

jhilgert00 - это то, что вы искали?

-(IBAction)nav_goHome:(id)sender {
UIViewController *myController = [self.storyboard instantiateViewControllerWithIdentifier:@"HomeController"];
[self.navigationController pushViewController: myController animated:YES];

}

ИЛИ ...

[self performSegueWithIdentifier:@"loginMainSegue" sender:self];
3 голосов
/ 03 февраля 2014

Я бы хотел добавить уточнение ...

Распространенное заблуждение, которое у меня было какое-то время, заключается в том, что сеанс раскадровки вызывается методом prepareForSegue:sender:. Это не. Работа с раскадровкой будет выполняться независимо от того, реализован ли у вас prepareForSegue:sender: метод для этого (отклоняющегося) контроллера представления.

Я узнал об этом из превосходных iTunesU лекций Пола Хегарти . Мои извинения, но, к сожалению, я не могу вспомнить, какую лекцию.

Если вы подключите переход между двумя контроллерами представления в раскадровке, но не реализуете метод prepareForSegue:sender:, переход все равно перейдет к целевому контроллеру представления. Тем не менее, он перейдет к тому контроллеру представления, который не подготовлен.

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

3 голосов
/ 30 декабря 2012

Раскадровка Сеги не должны создаваться вне раскадровки.Вам нужно будет подключить его, несмотря на недостатки.

Справочник по UIStoryboardSegue четко гласит:

Вы не создаете объекты-переходы напрямую.Вместо этого среда выполнения раскадровки создает их, когда она должна выполнить переход между двумя контроллерами представления.Вы по-прежнему можете инициировать переход программным способом, используя executeSegueWithIdentifier: sender: метод UIViewController, если хотите.Вы можете сделать это, чтобы инициировать переход из источника, который был добавлен программно и поэтому недоступен в Интерфейсном Разработчике.

Вы все еще можете программно сказать раскадровке представить контроллер представления, используя переход, используя presentModalViewController: или pushViewController:animated: вызывает, но вам понадобится экземпляр раскадровки.

Вы можете вызвать метод класса UIStoryboard s, чтобы получить именованную раскадровку с нулевым комплектом для основного комплекта.

storyboardWithName:bundle:

3 голосов
/ 12 июня 2012

хорошо, вы можете создавать, а также создавать подклассы UIStoryBoardSegue.Подклассы в основном используются для создания настраиваемой анимации перехода.

Вы можете посмотреть видео с wwdc 2011, представляющего StoryBoard.его также доступны в YouTube.

http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIStoryboardSegue_Class/Reference/Reference.html#//apple_ref/occ/cl/UIStoryboardSegue

2 голосов
/ 09 июня 2015

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

1).Определите все свои представления с помощью файла класса, а также идентификатора раскадровки в инспекторе идентичности.

2).Убедитесь, что вы добавили контроллер навигации к первому виду.Выберите его в раскадровке, а затем выберите «Редактор»> «Встроить»> «Контроллер навигации»

3).В свой первый класс импортируйте "secondClass.h"

#import "ViewController.h
#import "secondController.h"

4).Добавьте эту команду в IBAction, который должен выполнить передачу

secondController *next=[self.storyboard instantiateViewControllerWithIdentifier:@"second"];
[self.navigationController pushViewController:next animated:YES];

5).@"second" - это класс контроллера второго вида, идентификатор раскадровки.

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