【问题标题】:How to keep objects in NSMutableArray?如何将对象保存在 NSMutableArray 中?
【发布时间】:2015-08-09 08:18:16
【问题描述】:

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

代码:

- (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 = @"";
}

【问题讨论】:

  • 请添加启动 AddViewController 的代码
  • 展示你的故事板。你是如何“放松”的?
  • 每次进行导航时,都会创建一个新的 NSMutablearray。
  • @MuhammadWaqasBhati 你能告诉我正确的方法吗?
  • 那是因为你总是从一个全新的视图控制器实例开始。如果您需要持久化数据,请将其存储在外部(保存到磁盘,存储在 NSUserDefaults,静态变量,......任何最适合您的意图)

标签: ios objective-c


【解决方案1】:

您可以在两个视图控制器之间共享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];
}

在这种情况下,您无需将NSMutableArray 共享给 AddViewController。

【讨论】:

    【解决方案2】:

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

    1) 按 CMD+N 并选择“Cocoa Touch Class”/子类NSMutableArray

    2) 转到该类的 .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 将始终是同一个对象。

    【讨论】:

    • 我认为你的方法是对的,但代码不起作用...谢谢
    • 给猫剥皮的方法不止一种。不过,这将是您实现所需目标的一种方式。很抱歉您遇到代码问题。你怎么了?
    • 我对单例不熟悉,我想我以后会弄明白的。再次感谢。我没有足够的声望投票......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    相关资源
    最近更新 更多