2013-04-05 14 views
6

Używam Storyboard w mojej aplikacji i chcę przekazać dane z jednego widoku do innego widoku.instantiateViewControllerWithIdentifier i przekazać dane

Zamiast używać suwaków używam instantiateViewControllerWithIdentifier. W tym przypadku mam instancję od pierwszego TableViewController do NavigationController, który ma dołączoną drugą TableViewController, ponieważ potrzebuję nawigacji w drugim TableViewController. Teraz chcę przekazać dane z mojego pierwszego TableviewController, w zależności od tego, który wiersz został kliknięty, do mojego drugiego TableviewController. W tym przypadku newTopViewController będzie moim NavigationController, ale moim problemem jest teraz, jak przekazać dane z firstTableViewController do secondTableviewController.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     NSString *identifier = [NSString stringWithFormat:@"%@Top", [menuArray objectAtIndex:indexPath.row]]; 


     UIViewController *newTopViewController = [self.storyboard instantiateViewControllerWithIdentifier:identifier]; 




    } 

enter image description here

+0

możliwe duplikat [Przekazywanie danych między kontrolerami Zobacz] (http://stackoverflow.com/questions/5210535/passing-data-between-view-controllers) –

+0

nie widzę rozwiązania w tym poście. Używam kontrolera instantiate, ponieważ nie używam segues. Czy nadal mogę korzystać z prepareforsegue, czy nie ma segue? – halloway4b

+0

Miejsce utworzenia kontrolera widoku nie powinno zmieniać sposobu przekazywania wiadomości do niego. –

Odpowiedz

14

Jeśli utworzysz kontrolkę navigationController, możesz użyć właściwości viewControllers, aby uzyskać wewnętrzny kontroler widoku kontrolera nawigacyjnego.

coś takiego:

UINavigationController *navigationController = [self.storyboard instantiateViewControllerWithIdentifier:identifier]; 
MBFancyViewController *viewController = navigationController.viewControllers[0]; 

// setup "inner" view controller 
viewController.foo = bar; 

[self presentViewController:navigationController animated:YES completion:nil]; 
+0

Przybiłeś to. Wielkie dzięki. Dzięki tej podpowiedzi dowiedziałem się, że UINavigationController ma właściwość o nazwie topViewController. Wielkie dzięki. Działa jak urok w obie strony. Edytowałem twoją odpowiedź w inny sposób. – halloway4b

+0

Niesamowite rozwiązanie. Bardzo mi to pomogło. Wielkie dzięki –

5
newTopViewController.anyVariableToShow= anyVariableToSend; 

zrobić to dość często na kilku moich apps ...

// Utwórz nowy VC

CookViewController *detailViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"CookVC"]; 

//Set recipe 
[detailViewController setRecipe:recipe]; 

//Pop over VC (can be pushed with a nav controller) 
[self presentPopupViewController:detailViewController animationType:MJPopupViewAnimationFade]; 

Jeżeli nie jesteś używając kontrolera nawigacyjnego lub segues, to myślę, że musisz ponownie rozważyć projekt swojej aplikacji.

+0

newTopViewController jest kontrolerem NavigationController, ale chcę przekazać dane do mojego secondTableViewController. – halloway4b

+0

Nowe najlepsze pokazy jako kontroler widoku –

+0

Jeśli powiem newTopViewController.title = @ "Any whatever"; tytuł nie zmienia się, ponieważ secondTableviewController jest wyświetlany z paskiem nawigacyjnym. Jeśli chciałbym bezpośrednio utworzyć drugi testTableViewController, mogę przekazać dane takie jak secondTableViewController.title = @ "Any whatever", ale nie mam paska nawigacyjnego w moim widoku tabeli. – halloway4b

0

Właściwie to nie jest tylko problem podanie danych jak to jest program kontroli i przesyłu danych kwestia razem. Nawet gdybyś musiał przemyśleć koncepcję swojej aplikacji, bo chciałbyś użyć scenorysu bez znaczenia storyboardu, to zależy od ciebie i mam nadzieję, że masz dobry powód, by robić to, co robisz.

Tak więc, gdy zdecydowałeś się nie korzystać z urządzenia typu segue, straciłeś nowy i wygodny sposób tworzenia nowego kontrolera i przesyłania danych za jego pomocą, a musisz wykonać transfer sterowania i danych w dwóch różnych etapach. Kiedy tworzysz kolejną scenę w storyboardie (tak jak robisz to przy pomocy instantiateViewControllerWithIdentifier :) właśnie stworzyłeś nowy kontroler i przesłałeś kontrolę, ale nie dane. Pomyśl o tym, kiedy tworzysz nowy kontroler z Xib w stary sposób (musisz użyć initWithCoder: lub awakeFromNib w drugim kontrolerze widoku, ponieważ storyboard nie wywoła initWithName: bundle :), ale nie zrobił nic więcej .

Więc będziesz miał nowego kontrolera (nazwa pochodzi w części tożsamości drugiego storyboardu), który jest zawieszony we wszechświecie bez żadnego związku lub połączenia z niczym innym (jak ilustruje to obrazek scenorysu) i możesz zrobić z tym, co chcesz.

Więc chcesz coś zrobić i potrzebujesz danych z poprzedniego storyboardu (ViewController). To, czego potrzebujesz, to udostępnienie tych danych do drugiego storyboardu (ViewController), a jak wiesz, istnieje wiele rozwiązań do tego, które były dostępne przez długi czas, zanim jeszcze istnieje storyboard.

Jeśli chodzi o kod, "transfer danych" zależy od projektu, niezależnie od tego, czy oba kontrolery są podklasami siebie nawzajem, czy w ogóle ...

Jeśli nie lubisz zajmować się podklasowaniem i jak rozdzielać je w jak największym stopniu, najlepiej uczynić właściwość swoich danych w pierwszym kontrolerze i odnieść do nich od drugiego (po zaimportowaniu pierwszego .h plików) i po prostu się do niego w to viewDidLoad lub w initWithCoder: lub wszędzie tam, gdzie ich potrzebujesz, jak

secondViewControllerdata = firstViewControllerdata.thatDataProperty 

oczywiście można zrobić to samo w drugą stronę i dokonać własność drugiego kontrolera i odnoszą do tego w swoim pierwszym kontrolerze widoku.

0

Można zdefiniować jakiś parametr w UIViewController otrzymywać dane:

@property (przypisać) int param1;

@property (zachowaj) NSMutableArray * param2;

i opisane poniżej przekazać dane:

[newTopViewController setParam1: XX];

[newTopViewController setParam2: XX];

Powiązane problemy