Fügen Sie Objekte zu einem Array aus anderer Sicht-Controller
Ich habe eine HomeViewController
die eine tableView aufgefüllt, mit dem array tableViewArray
(ursprünglich leer). Wenn ich Tippen Sie auf eine barButton, ich segue Modal zu einem anderen View-Controller genannt OutsideViewController
die anderen tableView aufgefüllt, durch ein anderes array.
Was ich tun möchte ist Folgendes:
Wenn ich Tippen Sie auf eine Zeile in meinem OutsideViewController
ich möchte hinzufügen: die ausgewählte string-Wert in der tableViewArray
so, dass, wenn ich gehen Sie zurück zu HomeViewController
, der tableView ist, dass die neuen Artikel aufgeführt, die in der tableView.
So weit, das ist, was ich versucht habe:
In der -didSelectRowAtIndexPath
Methode meiner OutsideViewController.m
ich habe dieses Stück code:
NSString *selectedRow = [outsideArray objectAtIndex:indexPath.row];
NSMutableArray *temporaryArray = [NSMutableArray arrayWithObject:selectedRow];
HomeViewController *homeVC = [[HomeViewController alloc] init];
homeVC.tableViewArray = temporaryArray;
Code funktioniert, aber der tableView in HomeViewController
ist noch immer leer, wenn ich zurückkomme. Muss ich neu laden der tableView Daten?
Tue ich das richtige?
Dies ist, wie ich meine View Controller im Storyboard:
HomeViewController -(modal segue)-> Navigation Controller --> OutsideViewController
Auch die Rückkehr aus OutsideViewController zu HomeViewController ist getan, indem Sie diese Zeile code:
[self dismissViewControllerAnimated:YES completion:^{ }];
- Ich benutze eine Globale singleton-Klasse, die Sachen lagern können wie arrays zugegriffen werden muss, von jedem controller.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was du falsch machst ist, du bist allocationg eine neue
HomeViewController
. Was ich tun würde, ist keeep einen Verweis auf IhreHomeViewController
in IhremOutsideViewController
. Hier ist, wie.Ersten, in
OutsideViewController.h
, eine Eigenschaft erstellen, wie diese :Vergessen Sie nicht, fügen Sie
@class HomeViewController;
in Ihr .h, und#import "HomeViewController.h"
in Ihr .mIn
HomeViewController
implementieren Sie dieprepareForSegue:
- Methode wie folgt aus (ersetzen Sie ModalSegueIdentifier mit Ihrem segue id) :Dann, in
OutsideViewController.m
anstatt das zu tun :Hierzu :
Wenn Sie lassen Sie Ihren modal VC, Ihre HomeVC haben die richtige array. Vergessen Sie nicht, aktualisieren Sie Ihre
UITableView
!NB: natürlich gibt es viele andere Möglichkeiten, und es ist vielleicht nicht die beste. Aber trotzdem, sollte es funktionieren.
OutsideViewController *modalVC = (OutsideViewController*)segue.destinationViewController;
zuOutsideViewController *modalVC = (OutsideViewController*)[segue.destinationViewController topViewController];
da der Navigation-Controller in der zwischen den AnsichtenDies können Sie erreichen, auch mit delegation. Sie erstellen ein Protokoll, in Ihrem
OutsideViewController
mit einer Methode, die verantwortlich für das senden der neuen Sache zu IhremHomeViewController
. Tun Sie dies in OutsideViewController.h:In der Umsetzung-Datei, die Sie ändern müssen, ein wenig die
didSelectRowAtIndexPath:
Methode:In Ihrem HomeViewController.h Sie müssen Ihre Klasse entspricht dem Protokoll:
Nach, erstellen Sie eine Eigenschaft für die Delegierten:
Den Prozess beenden, implementieren Sie das Protokoll in Ihrem HomeViewController.m an erhält das neue Objekt aus der OutsideViewController:
Den obigen code hängt, wenn Sie Ihr
tableViewArray
Objekt ist veränderlich ist oder nicht. Wenn nicht, können Sie ändern Sie den Typ der Objekt-argument in der Protokoll-Methode, um eine inmutable array-Objekt und weisen Sie einfachtableViewArray
in das neue array.EDIT:
In der
prepareForSegue:
Methode, vergessen Sie nicht, um die Delegierten:Zunächst stellen Sie sicher, dass Sie
alloc
,init
IhretableViewArray
imHomeViewController
Zweite , In dieser Zeile
erstellen Sie einen neuen Bezug zu Ihrem
HomeViewController
was nicht richtig ist, muss man die richtige Referenz, möglicherweise erstellen von HomeViewController variable in IhremOutsideViewController
Obwohl Sie richtig tun ersten und zweiten Vorschlag, den Sie werden noch sehen, eine leere tableview, da Sie nicht der tableview neu laden, irgendwie muss man Feuer
[self.tableview reloadData];
Methode.Das bedeutet; Sie müssen lernen, Delegieren oder NSNotifications Muster für die Kommunikation zwischen Kind->parent Szenarien
Wie richte ich ein einfaches delegieren, um die Kommunikation zwischen zwei view-Controllern?
http://mobile.tutsplus.com/tutorials/iphone/ios-sdk_nsnotificationcenter/
Für deine Frage erstellen Sie einfach einen Delegierten in Ihre
Outside
;in Ihrem OutsideViewController.h
in Ihrem OutsideViewController.m
in Ihrem HomeViewController.h
in Ihrem HomeViewController.m
Eine andere Lösung Wäre,
Ändern Sie Ihre Ansicht stack zu diesem:
anwenden und rdurand's Antwort
und fügen Sie diese zu Ihrem HomeViewController :
In dieser Lösung, da Sie nur push-und pop-viewcontrollers in einem nabigation-stack
viewDidAppear
wird HomeViewController jedes mal, wenn Sie pop OutsideViewController.delegate
richtig eingerichtet ist habe ich nicht getestet, der code, aber ich habe auch aktualisiert, meine Antwort mit einer extra-Lösung, Sie müssen lernen, zu delegieren und nsnotification früher oder später doch