将对象添加到另一个View Controller中的数组

我有一个HomeViewController有一个tableView填充数组tableViewArray (最初为空)。 当我点击一个barButton时,我模式地延续到另一个名为OutsideViewController View Controller,它具有由另一个数组填充的另一个tableView。

我想要做的是以下几点:

当我在我的OutsideViewController点击一行时,我想将所选的string值添加到tableViewArray以便当我回到HomeViewController ,tableView具有在tableView中列出的新项目。

到目前为止,这是我曾经试过的:

在我的OutsideViewController.m-didSelectRowAtIndexPath方法中,我有这段代码:

 NSString *selectedRow = [outsideArray objectAtIndex:indexPath.row]; NSMutableArray *temporaryArray = [NSMutableArray arrayWithObject:selectedRow]; HomeViewController *homeVC = [[HomeViewController alloc] init]; homeVC.tableViewArray = temporaryArray; 

该代码的作品,但HomeViewController的tableView仍然是空的,当我返回。 我必须重新加载tableView数据吗? 我做对了吗?

这是我如何在故事板中设置我的视图控制器:

 HomeViewController -(modal segue)-> Navigation Controller --> OutsideViewController 

此外,从OutsideViewController返回到HomeViewController是由这行代码完成的:

 [self dismissViewControllerAnimated:YES completion:^{ }]; 

你做错了是你分配一个新的HomeViewController 。 我会做的是在你的OutsideViewController对你的HomeViewControllerOutsideViewController 。 这是如何。

首先,在OutsideViewController.h ,创build一个属性,如下所示:

 @property (nonatomic, weak) HomeViewController *homeVC; 

不要忘记添加@class HomeViewController; 在你的.h文件中,并在你的.m文件中input#import "HomeViewController.h"

HomeViewController ,像这样实现prepareForSegue:方法(用你的segue的标识符replaceModalSegueIdentifier ):

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"ModalSegueIdentifier"]) { OutsideViewController *modalVC = (OutsideViewController*)segue.destinationViewController; modalVC.homeVC = self; } } 

然后,在OutsideViewController.m ,而不是:

 HomeViewController *homeVC = [[HomeViewController alloc] init]; homeVC.tableViewArray = temporaryArray; 

做这个 :

 _homeVC.tableViewArray = temporaryArray; 

当你离开你的模式VC,你的HomeVC将有正确的数组。 不要忘记刷新你的UITableView

注意:当然,还有很多其他的方法,可能不是最好的。 但是,它仍然应该工作。

你也可以使用委托来实现这一点。 您必须在您的OutsideViewController创build一个协议, OutsideViewController使用负责将新对象发送到您的HomeViewController 。 在OutsideViewController.h中做到这一点:

 @protocol OutsideViewDelegate <NSObject> - (void)OutsideViewController:(OutsideViewController *)controller didAddObject:(NSString *)object; @end 

在实现文件中,你必须改变一点didSelectRowAtIndexPath:方法:

 NSString *selectedRow = [outsideArray objectAtIndex:indexPath.row]; [self.delegate OutsideViewController:self didAddObject:selectedRow]; 

在你的HomeViewController.h中,你必须使你的类符合协议:

 @interface HomeViewController : UIViewController <OutsideViewDelegate> 

之后,为委托创build一个属性:

 @property (nonatomic, weak) id <OutsideViewDelegate> delegate; 

要完成该过程,请在HomeViewController.m中实现协议以接收OutsideViewController中的新对象:

 - (void)OutsideViewController:(OutsideViewController *)controller didAddObject:(NSString *)object { if (object != nil) { [self.tableViewArray addObject:object]; } [self dismissViewControllerAnimated:YES completion:nil]; } 

上面的代码取决于你的tableViewArray对象是否可变。 如果不是,则可以将协议方法中的对象参数的types更改为不可变数组对象,并将tableViewArray指定给新数组。

编辑:

prepareForSegue:方法中不要忘记设置委托:

 -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([[segue identifier] isEqualToString:@"SEGUE_IDENTIFIER"]) { OutsideViewController *outsideVC = (OutsideViewController *)[segue destinationViewController]; [outsideVC setDelegate:self]; } } 

首先确保你alloc ,在HomeViewController init你的tableViewArray

其次,在这一行

 HomeViewController *homeVC = [[HomeViewController alloc] init] 

你正在创build一个新的引用到你的HomeViewController是不正确的,你需要传递正确的引用,可能创buildHomeViewControllervariables在你的OutsideViewController

即使你正确地做第一和第二个build议,你仍然会看到一个空的tableview,因为你不重新加载tableview,不知何故你需要发射[self.tableview reloadData]; 方法。

这意味着; 您需要学习委托NSNotifications模式以在子项目与父项目之间进行通信

如何设置一个简单的委托来在两个视图控制器之间进行通信?

http://mobile.tutsplus.com/tutorials/iphone/ios-sdk_nsnotificationcenter/

对于你的问题,只需在你的Outside创build一个委托; 在你的OutsideViewController.h中

 #import <UIKit/UIKit.h> @protocol OutsideDelegate; @interface{}//bunch of interface stuff // Declare a property for the delegate @property (weak) id <OutsideDelegate> delegate; @end // Protocol Header @protocol OutsideDelegate <NSObject> @optional - (void)dismissPop:(NSMutableArray *)list; @end 

在你的OutsideViewController.m中

 @synthesize delegate; //run delegate method [delegate dismissPop:temporaryArray]; [self dismissViewControllerAnimated:YES completion:^{ }]; 

在你的HomeViewController.h中

 #import "OutsideViewController.h" @interface OutsideViewController : UITableViewController<OutsideDelegate> {} @property (strong, nonatomic) OutsideViewController *pvc; 

在你的HomeViewController.m

 @synthesize pvc; -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([[segue identifier] isEqualToString:@"your segue"]) { pvc = [segue destinationViewController]; [pvc setDelegate:self]; } } // delegate callback function - (void)dismissPop:(NSMutableArray *)list { self.tableViewArray=list; [self.tableView reloadData]; } 

另一个解决scheme将是

将您的视图堆栈更改为:

 Navigation Controller --> HomeViewController -(push segue)--> OutsideViewController 

并应用rdurand的答案

并添加到您的HomeViewController:

 -(void)viewDidAppear:(BOOL)animated { [self.tableview reloadData]; } 

在这个解决scheme中,因为您只是在浏览器堆栈中推送stream行的viewcontrollers,所以当您popupOutsideViewController时,每次都会在HomeViewController中调用DidAppear。