我有一个应用程序,其中一个视图控制器(A)被连续两次调用。现在每次调用它时,都会创建一个NSString对象,我需要将该值存储在NSMutableArray中,该NSMutableArray是另一个View Controller(B)的公共属性。
在A中,我创建了第二个视图控制器(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,但没有打印任何其他内容。为什么?我想要确保的一件事是视图控制器A被调用两次,这意味着我想在输出中看到“Hello World”,“Hello World”(即打印两次),而不是“Hello World”打印一次
我想指出的另一件事是视图控制器B可能根本不被调用,或者可能在稍后的时间点调用它。在任何情况下,无论何时调用View Controller B,我都希望数组中的值可用,并等待用户访问。我该怎么做?
答案 0 :(得分:1)
你的方法并不理想,可能导致一个记忆周期,两个物体相互之间保持着强烈的指针。
您可以通过两种方式实现目标;
代表协议
此方法允许您设置委托和委托方法以在视图控制器之间来回传递数据
在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]];
答案 1 :(得分:0)
我不确定你想要遵循什么样的设计模式,但从它的外观来看,恕我直言,这不是一个非常安全的模式。但是,有许多方法可以实现。
但有一件事,你说视图控制器B可能永远不会被分配,如果它被分配,它将在未来发展。因此,您无法在从未创建过的对象上设置值/属性。
由于您还没有真正遵循传统模式,因此您可以创建一个静态NSMutableArray变量,该变量在View Controller B类的.m中声明,然后通过类方法公开。
所以它看起来像这样:
viewControllerB.h
+(void)addStringToPublicArray:(NSString *)string;
viewContrllerB.m
static NSMutableArray *publicStrings = nil;
+(void)addStringToPublicArray:(NSString *)string{
if (publicStrings == nil){
publicStrings = [[NSMutableArray alloc]init];
}
if (string != nil){
[publicStrings addObject:string];
}
}
然后它将真正公开。视图控制器B的所有实例都可以访问它。当然,这不是传统或推荐的做法 - 我确信你会有很多回复指出这一点;)。
另一个想法是使用单例类并将值存储在那里。然后,当或者如果创建了视图控制器B,您可以从那里访问它们。