我有一个应用程序,其中视图控制器(A)连续两次被调用。现在,每次调用它时,都会创建一个NSString对象,并且我需要将此值存储在NSMutableArray中,该NSMutableArray是ANOTHER View Controller(B)的公共属性。

在A中,我创建第二个View Controller(B)的实例,然后使用该实例,将NSString对象添加到我作为公共属性创建的NSMutableArray中。稍后,当我进入View Controller B并打印NSMutableArray属性的内容时,该数组为空。为什么?这是View Controller A内部的代码:

-(void)viewDidLoad {

    ViewControllerA *aVC = [[ViewControllerA alloc] init];
    if (aVC.stringArray == nil) {
        aVC.stringArray = [[NSMutableArray alloc] init];
    }

    [aVC.stringArray addObject:@"hello"];
    [aVC.stringArray addObject:@"world"];

    for (NSString *wow in aVC.stringArray) {
        NSLog(@"The output is: %@", wow);
    }

}


在View Controller B类中,我有以下代码:

- (IBAction)buttonAction:(UIButton *)sender {


        NSLog(@"Button selected");
        for (NSString *test in self.stringArray) {
            NSLog(@"Here are the contents of the array %@", test);
        }

}


现在,调用buttonAction方法,就像我在系统输出中看到的选择行Button一样,但是没有打印其他内容。为什么?我想确保的是,View Controller A被调用了两次,这意味着我想在输出中看到“ Hello World”,“ Hello World”(即打印两次),而不是“ Hello World”仅打印一次。

我想指出的另一件事是,可能根本不会调用View Controller B,或者可能在以后的某个时间点调用它。无论如何,无论何时调用View Controller B,我都希望数组中的值可用,并等待用户访问。我该怎么做呢?

最佳答案

您的方法并不理想,可能导致一个内存周期,因为两个对象相互之间拥有很强的指针。

相反,您可以通过两种方式实现目标:

委托协议

此方法允许您设置委托和委托方法以在视图控制器之间来回传递数据

在viewControllerA.h中

@protocol viewControllerADelegate <NSObject>

- (void)addStringToNSMutableArray:(NSString *)text;

@end

@interface viewControllerA : UIViewController

@property (nonatomic, weak) id <viewControllerADelegate> delegate;


在viewControllerB.m中

// create viewControllerA class object
[self.viewControllerA.delegate = self];

- (void)addStringToNSMutableArray:(NSString *)text
{
    [self.mutableArray addObject:text];
}


在viewControllerA.m中

[self.delegate addStringToNSMutableArray:@"some text"];


实用程序类

或者,您可以将公用程序类与可公开访问的方法(和临时数据存储)一起使用。这允许两个viewController类都访问共享的数据存储,而且,如果您使用类方法,则甚至不需要实例化实用程序类。

在XYZUtilities.h中

#import <Foundation/Foundation.h>

@interface XYZUtilities : NSObject

+ (void)addStringToNSMutableArray;
@property (strong, nonatomic) NSMutableArray *array;

@end


在XYZUtilities.m中

+ (void)addStringToNSMutableArray
{
    NSString *result = @"some text";
    [self.array addObject:result];
}

+ (NSArray)getArrayContents
{
    return self.array;
}


在viewControllerA.m中

NSString *stringFromObject = [XYZUtilities addStringToNSMutableArray];


在viewControllerB.m中

self.mutableArray = [[NSMutableArray alloc] initWithArray:[XYZUtilities getArrayContents]];

关于ios - 尝试存储在ViewController中接收的值,并将它们存储在iOS中另一个View Controller中的NSMutableArray的单个实例中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21469668/

10-12 03:30