我在ios7中创建了一个像这样的单身人士:
SharedData.h
@interface SharedData : NSObject
{
}
+ (id)sharedInstance;
@property (strong, nonatomic) NSMutableArray *list;
@end
SharedData.m
#import "SharedData.h"
@implementation SharedData
@synthesize list;
// Get the shared instance thread safe
+ (SharedData *)sharedInstance {
static dispatch_once_t once = 0;
static SharedData *sharedInstance = nil;
dispatch_once(&once, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
- (id)init {
self = [super init];
if (self) {
//initialize
list = [[NSMutableArray alloc] init];
}
return self;
}
@end
我总是使用此代码来访问此类:
SharedData *sharedData = [SharedData sharedInstance];
问题是,当我在viewDidLoad方法中切换视图时,列表为空,但在我的viewDidAppear方法中,一切都很好。有什么想法吗?
编辑: 这是我改变视图的代码:
SharedData *sharedData = [SharedData sharedInstance];
//clear feed and add new feed
[sharedData.list removeAllObjects];
[sharedData.list addObjectsFromArray:newList];
//show new gui
[self.navigationController performSegueWithIdentifier:@"goToMain" sender:self];
注意:我从普通的ViewController推送到TabBarController - > NavigationController - > TableViewController显示列表。
答案 0 :(得分:0)
您如何从一个viewController更改为另一个? Wich类是目标ViewController的父亲,
如果要在prepareForSegue
方法中修改视图的属性...则强制加载视图。
例如,您在prepareForSegue
中设置单个列表,但在设置列表之前,您正在修改目标viewController的属性。 (如果您正在为UITabBarViewController创建子类,则执行类似destVC.view = XXX
或destVC.viewControllers = XX
的操作...)然后,您将触发viewDidLoad方法,并在将列表设置为正确值之前执行它。
或者你可能在两个不同的地方搜索到destinationViewController。当viewDidLoad发生时,你仍然没有更新单例上的列表。
以下是与问题海报聊天的转录:http://chat.stackoverflow.com/transcript/55218
答案 1 :(得分:0)
我猜你在这两个viewcontroller方法之间存在混淆:
-(void)viewDidLoad{
//
}
&安培;
-(void) viewDidAppear{
//
}
viewDidAppear是每次视图更改时调用的方法,但viewDidLoad是每次视图更改时不一定调用的方法。
第一次加载视图时会调用ViewDidLoad方法,之后在删除/释放视图之前不会调用它。
P.S :我建议您将断点放在viewDidLoad和viewDidAppear方法中并感受它。你的答案就在那里。
希望这对你有所帮助。
祝你好运。
答案 2 :(得分:0)
问题是我创建了一个从按钮到下一个视图的segue。因此,viewDidLoad比先前分配的列表更早被调用。我刚刚改变了segue从视图到视图。