[英]iOS singleton viewDidLoad empty and on viewDidAppear not
我在ios7中創建了一個單例,如下所示:
SharedData.h
@interface SharedData : NSObject
{
}
+ (id)sharedInstance;
@property (strong, nonatomic) NSMutableArray *list;
@end
共享數據
#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以顯示列表。
您如何從一個viewController更改為另一個? Wich類是目標ViewController的父類嗎?
如果要在prepareForSegue
方法中修改視圖的屬性, prepareForSegue
強制加載視圖。
例如,您要在prepareForSegue
中設置單身人士的列表,但是在設置列表之前,您要修改目標viewController的屬性。 (如果要對UITabBarViewController進行子類化,請執行諸如destVC.view = XXX
或destVC.viewControllers = XX
。)然后,您將觸發viewDidLoad方法,該方法將在將列表設置為正確值之前執行。
或者,也許您在兩個不同的地方與destinationViewController爭吵。 並且當viewDidLoad發生時,您仍未更新單例上的列表。
這是與問題發布者的聊天記錄: http : //chat.stackoverflow.com/transcript/55218
我猜您在這兩個viewcontroller方法之間有混淆:
-(void)viewDidLoad{
//
}
和
-(void) viewDidAppear{
//
}
viewDidAppear是每次視圖更改時都會調用的方法,而viewDidLoad是每次視圖更改時不一定調用的方法。
首次加載視圖時,將調用ViewDidLoad方法,此后直到刪除/釋放視圖后才調用ViewDidLoad方法。
PS :我建議您將斷點放在viewDidLoad和viewDidAppear方法中並感受一下。 您的答案就在那里。
希望這對您有很大幫助。
祝好運。
問題是我創建了一個按鈕,從按鈕轉到下一個視圖。 因此,viewDidLoad的調用早於分配的列表。 我只是將segue更改為從一個視圖到另一個視圖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.