Segue для определенного индекса контроллера сегмента [дубликат]

Я отвечу ужасным, нарисованным рукой комиком. Второе изображение является причиной того, что result является undefined в вашем примере кода.

343
задан Grender 14 April 2015 в 16:05
поделиться

9 ответов

Просто возьмите ссылку на контроллер целевого представления в методе prepareForSegue: и передайте любые объекты, которые вам нужны. Вот пример ...

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // Make sure your segue name in storyboard is the same as this line
    if ([[segue identifier] isEqualToString:@"YOUR_SEGUE_NAME_HERE"])
    {
        // Get reference to the destination view controller
        YourViewController *vc = [segue destinationViewController];

        // Pass any objects to the view controller here, like...
        [vc setMyObjectHere:object];
    }
}

ПЕРЕСМОТР: Вы также можете использовать метод performSegueWithIdentifier:sender: для активации перехода к новому представлению на основе выбора или нажатия кнопки.

Например, рассмотрим, что у меня есть два контроллера вида. Первый содержит три кнопки, а второй должен знать, какая из этих кнопок была нажата до перехода. Вы можете подключить кнопки до IBAction в своем коде, который использует метод performSegueWithIdentifier:, например этот ...

// When any of my buttons are pressed, push the next view
- (IBAction)buttonPressed:(id)sender
{
    [self performSegueWithIdentifier:@"MySegue" sender:sender];
}

// This will get called too before the view appears
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"MySegue"]) {

        // Get destination view
        SecondView *vc = [segue destinationViewController];

        // Get button tag number (or do whatever you need to do here, based on your object
        NSInteger tagIndex = [(UIButton *)sender tag];

        // Pass the information to your destination view
        [vc setSelectedButton:tagIndex];
    }
}

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

662
ответ дан Simon 26 August 2018 в 00:52
поделиться

В Swift я бы сделал что-то вроде этого:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let yourVC = segue.destinationViewController as? YourViewController {
        yourVC.yourData = self.someData
    }
}
19
ответ дан carmen_munich 26 August 2018 в 00:52
поделиться

Мое решение похоже.

// In destination class: 
var AddressString:String = String()

// In segue:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
   if (segue.identifier == "seguetobiddetailpagefromleadbidder")
    {
        let secondViewController = segue.destinationViewController as! BidDetailPage
        secondViewController.AddressString = pr.address as String
    }
}
11
ответ дан Community 26 August 2018 в 00:52
поделиться

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

private var segueCompletion : ((UIStoryboardSegue, Any?) -> Void)?

func performSegue(withIdentifier identifier: String, sender: Any?, completion: @escaping (UIStoryboardSegue, Any?) -> Void) {
    self.segueCompletion = completion;
    self.performSegue(withIdentifier: identifier, sender: sender);
    self.segueCompletion = nil
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    self.segueCompletion?(segue, sender)
}

Пример использования:

func showData(id : Int){
    someService.loadSomeData(id: id) {
        data in
        self.performSegue(withIdentifier: "showData", sender: self) {
            storyboard, sender in
            let dataView = storyboard.destination as! DataView
            dataView.data = data
        }
    }
}

Это, похоже, работает для меня, однако я не уверен на 100%, что функции выполнения и подготовки всегда выполняются в одном и том же потоке.

0
ответ дан dannrob 26 August 2018 в 00:52
поделиться

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

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.destinationViewController respondsToSelector:@selector(setMyData:)]) {
        [segue.destinationViewController performSelector:@selector(setMyData:) 
                                              withObject:myData];
    } 
}

. До тех пор, пока контроллер вашего целевого представления объявит общедоступное свойство, например:

@property (nonatomic, strong) MyData *myData;

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

81
ответ дан Macondo2Seattle 26 August 2018 в 00:52
поделиться

У меня есть класс отправителя , как это

@class MyEntry;

@interface MySenderEntry : NSObject
@property (strong, nonatomic) MyEntry *entry;
@end

@implementation MySenderEntry
@end

Я использую этот класс отправителя для передачи объектов в prepareForSeque:sender:

-(void)didSelectItemAtIndexPath:(NSIndexPath*)indexPath
{
    MySenderEntry *sender = [MySenderEntry new];
    sender.entry = [_entries objectAtIndex:indexPath.row];
    [self performSegueWithIdentifier:SEGUE_IDENTIFIER_SHOW_ENTRY sender:sender];
}

-(void)prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:SEGUE_IDENTIFIER_SHOW_ENTRY]) {
        NSAssert([sender isKindOfClass:[MySenderEntry class]], @"MySenderEntry");
        MySenderEntry *senderEntry = (MySenderEntry*)sender;
        MyEntry *entry = senderEntry.entry;
        NSParameterAssert(entry);

        [segue destinationViewController].delegate = self;
        [segue destinationViewController].entry = entry;
        return;
    }

    if ([[segue identifier] isEqualToString:SEGUE_IDENTIFIER_HISTORY]) {
        // ...
        return;
    }

    if ([[segue identifier] isEqualToString:SEGUE_IDENTIFIER_FAVORITE]) {
        // ...
        return;
    }
}
16
ответ дан neoneye 26 August 2018 в 00:52
поделиться

Просто используйте эту функцию.

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let index = CategorytableView.indexPathForSelectedRow
    let indexNumber = index?.row
    let VC = segue.destination as! DestinationViewController
   VC.value = self.data

}
0
ответ дан Parth Barot 26 August 2018 в 00:52
поделиться

Я реализовал библиотеку с категорией на UIViewController, которая упрощает эту операцию. В принципе, вы устанавливаете параметры, которые хотите передать в NSDictionary, связанные с элементом пользовательского интерфейса, который выполняет сеанс.

Например, вы можете сделать

[self performSegueWithIdentifier:@"yourIdentifier" parameters:@{@"customParam1":customValue1, @"customValue2":customValue2}];

для ручного переключения или создать кнопку с помощью segue и использовать

[button setSegueParameters:@{@"customParam1":customValue1, @"customValue2":customValue2}];

Если контроллер точки доступа не соответствует кодированию ключевого значения для ключа, ничего не происходит. Он также работает с ключевыми значениями (полезно для разматывания секций). Проверьте здесь https://github.com/stefanomondino/SMQuickSegue

4
ответ дан Stefano Mondino 26 August 2018 в 00:52
поделиться

Для Swift используйте это,

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    var segueID = segue.identifier

    if(segueID! == "yourSegueName"){

        var yourVC:YourViewController = segue.destinationViewController as YourViewController

        yourVC.objectOnYourVC = setObjectValueHere!

    }
}
4
ответ дан Zaid Pathan 26 August 2018 в 00:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: