簡體   English   中英

從另一個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中保留對HomeViewControllerOutsideViewController 這是怎么回事。

首先,在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]; 方法。

那意味着 您需要學習DelegateNSNotifications模式才能在子級->父級方案之間進行通信

如何設置一個簡單的委托以在兩個視圖控制器之間進行通信?

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM