将对象添加到另一个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
对你的HomeViewController
的OutsideViewController
。 这是如何。
首先,在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。