Подтвердить что ты не робот

Создание программного программирования

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

Я хочу настроить segue на этот "Common" UIViewController, чтобы наследовать все остальные UIViewControllers.

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

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

4b9b3361

Ответ 1

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

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

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

    // do any setup you need for myNewVC

    [self presentModalViewController:myNewVC animated:YES];
}

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

Ответ 2

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

enter image description here

Всплывающее окно отобразится для "Manual Segue". Я выбрал 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];
    }

Параметр отправителя требуется для идентификации кнопки при вызове метода 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;
    }
}

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

Ответ 3

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

UIViewController *toViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"OtherViewControllerId"];
MyCustomSegue *segue = [[MyCustomSegue alloc] initWithIdentifier:@"" source:self destination:toViewController];
[self prepareForSegue:segue sender:sender];
[segue perform];

Ответ 4

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

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

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

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

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

Ответ 5

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

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" 
                                                     bundle:nil];
YourViewController *yourViewController = 
 (YourViewController *)
  [storyboard instantiateViewControllerWithIdentifier:@"yourViewControllerID"];
[self.navigationController pushViewController:yourViewController animated:YES];

Ответ 6

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

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

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

}

OR...

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

Ответ 7

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

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

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

Ответ 8

Я хотел бы добавить разъяснение...

Общим недоразумением, фактически тем, что я имел в течение некоторого времени, является то, что сценарий раскадровки запускается методом prepareForSegue:sender:. Это не. Сегмент раскадровки будет выполняться независимо от того, был ли вы реализован метод prepareForSegue:sender: для этого (исходящего) из контроллера просмотра.

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

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

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

Ответ 9

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

В UIStoryboardSegue Reference четко указано:

Вы не создаете объекты segue напрямую. Вместо этого раскадровка runtime создает их, когда он должен выполнять segue между двумя представлениями контроллеры. Вы все равно можете инициировать segue программно, используя performSegueWithIdentifier: отправитель: метод UIViewController, если вы хотеть. Вы можете сделать это, чтобы инициировать сеанс из источника, который был добавлен программно и, следовательно, недоступны в Interface Builder.

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

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

storyboardWithName:bundle:

Ответ 10

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

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

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

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

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

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

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

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

Ответ 11

Я реконструировал и сделал реализацию с открытым исходным кодом (повторной) UIStoryboard segues: https://github.com/acoomans/Segway

С помощью этой библиотеки вы можете определять segues программно (без какой-либо раскадровки).

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

Ответ 12

Пара проблем:

Во-первых, в этом проекте, который вы загрузили для нас, segue не несет идентификатор "segue1":

нет идентификатора

Вы должны заполнить этот идентификатор, если вы еще этого не сделали.

Во-вторых, по мере того, как вы выходите из представления таблицы в таблицу, вы вызываете initWithNibName для создания контроллера вида. Вы действительно хотите использовать instantiateViewControllerWithIdentifier.

Ответ 13

Вот пример кода для Creating a segue programmatically:

class ViewController: UIViewController {
    ...
    // 1. Define the Segue
    private var commonSegue: UIStoryboardSegue!
    ...
    override func viewDidLoad() {
        ...
        // 2. Initialize the Segue
        self.commonSegue = UIStoryboardSegue(identifier: "CommonSegue", source: ..., destination: ...) {
            self.commonSegue.source.showDetailViewController(self.commonSegue.destination, sender: self)
        }
        ...
    }
    ...
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // 4. Prepare to perform the Segue
        if self.commonSegue == segue {
            ...
        }
        ...
    }
    ...
    func actionFunction() {
        // 3. Perform the Segue
        self.prepare(for: self.commonSegue, sender: self)
        self.commonSegue.perform()
    }
    ...
}