iOS单例viewDidLoad为空并且在viewDidAppear上没有

时间:2014-06-06 15:15:50

标签: ios ios7 singleton

我在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显示列表。

3 个答案:

答案 0 :(得分:0)

您如何从一个viewController更改为另一个? Wich类是目标ViewController的父亲,

如果要在prepareForSegue方法中修改视图的属性...则强制加载视图。

例如,您在prepareForSegue中设置单个列表,但在设置列表之前,您正在修改目标viewController的属性。 (如果您正在为UITabBarViewController创建子类,则执行类似destVC.view = XXXdestVC.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从视图到视图。