Wykonaj Segue programowo i przekaż parametry do widoku docelowego


174

w mojej aplikacji mam przycisk, który wykonuje programowo segue:

- (void)myButtonMethod
{
    //execute segue programmatically
    [self performSegueWithIdentifier: @"MySegue" sender: self];
}

Chciałbym wiedzieć, czy istnieje sposób na odniesienie się do widoku docelowego i przekazanie mu niektórych parametrów.

Wiem, że w prepareForSeguemetodzie mogę odnieść się myDestinationViewController *vc = [segue destinationViewController];do tego za pomocą:, ale nie wiem, jak to wykonać programowo.

Czy masz jakies pomysły?

Dzięki, yassa


AKTUALIZACJA:

Przepraszam za to pytanie !!! Po prostu odkryłem, że nawet jeśli płynność jest wywoływana programowo, prepareForSeguemetoda jest wywoływana i tak, więc możliwe jest przekazywanie parametrów w ten sam zwykły sposób.


44
Dodaj aktualizację jako odpowiedź i zaakceptuj ją, aby ludzie wiedzieli, że odpowiedź na to pytanie :)
danielbeard

Dodaj odpowiedź, komentarz do powiadomienia.
DanSkeel

11
Powinieneś oznaczyć poniższą odpowiedź jako poprawną, aby ludzie wiedzieli, że została udzielona.
lindon fox

Odpowiedzi:


107

Odpowiedź jest po prostu taka, że ​​nie ma znaczenia, w jaki sposób wyzwalana jest ścieżka.

prepareForSegue:sender:Metoda jest wywoływana w każdym przypadku i to, gdzie zdasz parametry poprzek.


3
Wciąż mi to przeszkadza - oznacza to, że muszę wyzwalać segue w jednym miejscu, gdzie mam dane, które chcę przesłać jako parametry ładnie odizolowane od czegokolwiek innego, ale aby dodać te dane w zupełnie innym miejscu - przygotujForSegue, gdzie nie wiem nic o danych, które należy przekazać. Oznacza to, że muszę stworzyć stan z tymi danymi w kontekście współdzielonym przez dwie różne funkcje (jedna wyzwalająca płynność, druga - przygotowanie). Nie chcę brudzić stanu, kiedy wystarczy, że otworzę nowy widok z niektórymi danymi ...
NeverwinterMoon

Użyj nadawcy, aby przekazać kontekst potrzebny do skonfigurowania docelowego VC
trapper

Założyłem, że przekazywanie ładunku w nadawcy jest anty-wzorcem. Powinien po prostu zawierać informacje o tym, kto wyzwolił płynność, a nie dane, które rzecz, która wyzwoliła płynność, zamierzała przejść dalej.
NeverwinterMoon

Z oficjalnej dokumentacji nadawcy: „Ten obiekt jest udostępniany do celów informacyjnych podczas właściwego przejścia”.
NeverwinterMoon

1
Tak, nie przekazuj rzeczywistego ładunku, nie przekazuj kontekstu, na przykład komórki / przycisku / indeksu / itp., Które wyzwoliły przepływ.
trapper,

90

Stare pytanie, ale oto kod, jak zrobić to, o co prosisz. W tym przypadku przekazuję dane z wybranej komórki w widoku tabeli do innego kontrolera widoku.

w pliku .h widoku trget:

@property(weak, nonatomic)  NSObject* dataModel;

w pliku .m:

@synthesize dataModel;

dataModelmoże być string, intlub tak jak w tym przypadku jest to model zawierający wiele elementów

- (void)someMethod {
     [self performSegueWithIdentifier:@"loginMainSegue" sender:self];
 }

LUB...

- (void)someMethod {
    UIViewController *myController = [self.storyboard instantiateViewControllerWithIdentifier:@"HomeController"];
    [self.navigationController pushViewController: myController animated:YES];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if([segue.identifier isEqualToString:@"storyDetailsSegway"]) {
        UITableViewCell *cell = (UITableViewCell *) sender;
        NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
        NSDictionary *storiesDict =[topStories objectAtIndex:[indexPath row]];
        StoryModel *storyModel = [[StoryModel alloc] init];
        storyModel = storiesDict;
        StoryDetails *controller = (StoryDetails *)segue.destinationViewController;
        controller.dataModel= storyModel;
    }
}

3

Swift 4:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "ExampleSegueIdentifier" {
        if let destinationVC = segue.destination as? ExampleSegueVC {
            destinationVC.exampleString = "Example"
        }
    }
}

Swift 3:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "ExampleSegueIdentifier" {
            if let destinationVC = segue.destinationViewController as? ExampleSegueVC {
                destinationVC.exampleString = "Example"
            }
        }
    }

0

Rozumiem problem wykonania przejścia w jednym miejscu i utrzymania stanu do wysłania parametrów w przygotowaniu do przejścia.

Wymyśliłem sposób, aby to zrobić. Dodałem właściwość o nazwie userInfoDict do ViewControllers przy użyciu kategorii. i nadpisałem również wykonanie segue z identyfikatorem, w taki sposób, że jeśli nadawca jest self (czyli sam kontroler). Przekaże to userInfoDict do następnego ViewController.

Tutaj zamiast przekazywać cały UserInfoDict możesz również przekazać określone parametry jako nadawcę i odpowiednio je zastąpić.

1 rzecz, o której musisz pamiętać. nie zapomnij wywołać super metody w metodzie performSegue ur.


0

W przypadku, gdy używasz nowej szybkiej wersji.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "ChannelMoreSegue" {

        }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.