![](/img/trans.png)
[英]Add Objects From One View Controller To An Array On Another View Controller
[英]Add objects to an Array from another View Controller
我有一個HomeViewController
,其中有一個tableView填充有數組tableViewArray
(最初為空)。 當我點擊barButton時,我會模態選擇到另一個名為OutsideViewController
視圖控制器,該控制器具有另一個由不同數組填充的tableView。
我想做的是以下幾點:
當我在OutsideViewController
點擊一行時,我想將所選的字符串值添加到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
,創建一個屬性,如下所示:
@property (nonatomic, weak) HomeViewController *homeVC;
不要忘記添加@class HomeViewController;
在.h中,並在.m中#import "HomeViewController.h"
在HomeViewController
,實現如下的prepareForSegue:
方法(將ModalSegueIdentifier替換為您的segue的標識符):
- (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
!
NB:當然,還有很多其他方法,可能不是最好的方法。 但是仍然可以。
您也可以使用委托來實現。 您必須使用一種負責將新對象發送到HomeViewController
的方法,在OutsideViewController
創建一個協議。 在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>
之后,為委托創建一個屬性:
@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
對象是否可變。 如果不是,則可以將protocol方法中的object參數的類型更改為不可變的數組對象,只需將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]
您正在創建對HomeViewController
的不正確的新引用,您需要傳遞正確的引用,可能在OutsideViewController
創建HomeViewController變量
即使您正確地執行了第一和第二個建議,您仍然會看到一個空的tableview,因為您沒有重新加載tableview,但是您還是需要觸發[self.tableview reloadData];
方法。
那意味着 您需要學習Delegate或NSNotifications模式才能在子級->父級方案之間進行通信
http://mobile.tutsplus.com/tutorials/iphone/ios-sdk_nsnotificationcenter/
對於您的問題,只需在您的Outside
創建代表; 在您的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];
}
另一個解決方案是
將您的視圖堆棧更改為此:
Navigation Controller --> HomeViewController -(push segue)--> OutsideViewController
並應用rdurand的答案
並將其添加到您的HomeViewController中:
-(void)viewDidAppear:(BOOL)animated
{
[self.tableview reloadData];
}
在此解決方案中,由於您只是在棧堆棧中的推入式視圖控制器,因此每次您在彈出OutsideViewController時,都會在HomeViewController中調用viewDidAppear
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.