如何在NSMutableArray中保留对象?

时间:2015-08-09 08:18:17

标签: ios objective-c

有两个视图控制器。一个用于添加项目,另一个用于显示(表格视图)。所有项目都存储在NSMutableArray.But每次放松以添加项目时,当我返回到表格视图时,只剩下最新的项目。

代码:

- (void)viewDidLoad {
   [super viewDidLoad];
   [self addData];
}

- (void)addData {

  if (!self.items) {
     self.items = [[NSMutableArray alloc] init]; 
  }
  [self.items addObject:self.textFromFirst];
}

// textFormFirst is an NSString which received from the previous view controller

<小时/> 添加视图控制器

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

   UINavigationController *nav = [segue destinationViewController];
   SecondController *second = [nav.viewControllers objectAtIndex:0];

   second.textFromFirst = [self getText]; // get inputed string 
   self.aTextField.text = @"";
}

2 个答案:

答案 0 :(得分:0)

如何在视图控制器之间保持NSMutableArray?如果您需要在整个应用程序中保留一个数组,我建议您使用 singleton 。单例是每个实例只有 1 内存地址的对象,因此始终是同一个对象。您可以通过执行以下操作来完成此操作:

1)按CMD + N并选择&#34; Cocoa Touch Class&#34; / subclass NSMutableArray

2)去那个班级&#39; .m文件并在init

中添加单例
static YourNSMutableArray *highlander;

@implementation YourNSMutableArray

- (instancetype)init {
    static dispatch_once_t onceToken;

        dispatch_once(&onceToken, ^{
        highlander = [super init];

    });

   return highlander;
}

3)现在,无论何时在这样的任何视图控制器中创建新实例

if (!self.items) {

    self.items = [YourNSMutableArray new]; 
}

[self.items addObject:self.textFromFirst];

self.items将始终存储self.textFromFirst,因为您在应用中创建的任何YourNSMutableArray始终都是同一个对象。

答案 1 :(得分:0)

您可以在两个视图控制器之间共享NSMutableArray。只需使用一个属性:

<强> MainViewController

// .m
@interface MasterViewController ()

@property (nonatomic, strong) NSMutableArray *items;

@end

@implementation MasterViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.items = [NSMutableArray array];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"ShowDetail"]) {
        DetailViewController *controller = (DetailViewController *)[segue destinationViewController];
        controller.items = self.items;
        controller.textFromFirst = @"This is a test";
    }
}

@end

<强> AddViewController

// .h
@interface DetailViewController : UIViewController

@property (nonatomic, copy) NSString *textFromFirst;
@property (nonatomic, strong) NSMutableArray *items;

@end

// .m
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self addData];
}   

- (void)addData {
    [self.items addObject:self.textFromFirst];
}

这是一个示例项目:https://www.dropbox.com/s/ymum4zivgi0z688/TestUnwindSegue.zip?dl=0

我不知道你为什么在AddViewController中使用数组。也许你更喜欢使用unwind segue,如下:

// MainViewController.m
- (IBAction)saveItem:(UIStoryboardSegue *)segue {
    DetailViewController *detailVC = segue.sourceViewController;
    [self.items addObject:detailVC.textFromFirst];
}

在这种情况下,您不需要与AddViewController共享NSMutableArray