Я знаю, что была задана пара вопросов, похожих на эти, но я думаю, что мои проблемы немного отличаются, так что терпите меня.
У меня есть приложение с вкладками в виде таблиц, настроенное на 2 из 3 вкладок. Я хочу иметь возможность обновлять только представление таблицы выбранной вкладки, когда приложение снова активируется. Я пытался использовать центр уведомлений, чтобы сказать, что моя вкладка обновляется, но это приводит к сбою другой вкладки, потому что он крадет представление из моего прогресса. Я добавлю сюда код, так что, надеюсь, я найду решение, которое будет работать для меня.
Tab 1 ViewController
- (void)viewDidLoad {
// becomeActive just calls viewDidAppear:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(becomeActive:)
name:UIApplicationDidBecomeActiveNotification
object:nil];
[super viewDidLoad];
}
-(void)viewDidAppear:(BOOL)animated {
HUD = [[MBProgressHUD alloc] initWithView:self.view];
[self.view addSubview:HUD];
HUD.delegate = self;
HUD.labelText = @"Updating";
HUD.detailsLabelText = @"Please Wait";
[HUD showWhileExecuting:@selector(refreshData) onTarget:self withObject:nil animated:YES];
}
Tab 2 ViewController
- (void)viewDidLoad
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
self.navigationItem.title = [defaults valueForKey:@"companyName"];
self.view.backgroundColor = background;
tableView.backgroundColor = [UIColor clearColor];
tableView.opaque = YES;
tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
// becomeActive just calls viewDidAppear
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(becomeActive:)
name:UIApplicationDidBecomeActiveNotification
object:nil];
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
if (_refreshHeaderView == nil) {
EGORefreshTableHeaderView *view = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0.0f, 0.0f - self.tableView.bounds.size.height, self.view.frame.size.width, self.tableView.bounds.size.height)];
view.delegate = self;
[self.tableView addSubview:view];
_refreshHeaderView = view;
[view release];
}
// update the last update date
[_refreshHeaderView refreshLastUpdatedDate];
}
-(void)viewDidAppear:(BOOL)animated {
HUD = [[MBProgressHUD alloc] initWithView:self.view];
[self.view addSubview:HUD];
HUD.delegate = self;
HUD.labelText = @"Updating";
HUD.detailsLabelText = @"Please Wait";
[HUD showWhileExecuting:@selector(updateBoard) onTarget:self withObject:nil animated:YES];
// update the last update date
[_refreshHeaderView refreshLastUpdatedDate];
}
При такой настройке мое приложение будет обновлять вкладку 2 очень хорошо, при условии, что вкладка 2 была последней открытой вкладкой перед тем, как вы закрыли приложение. Если при закрытии приложения я переключаюсь на вкладку 1, то после перезапуска приложения уведомление сначала вызывает вкладку 2 и выкраивает представление из-под моего прогресса, поэтому при попытке вызвать метод viewDidAppear представление становится пустым, и приложение вылетает. , Мне нужно либо выяснить, как лучше реализовать центр уведомлений, чтобы он не зависал на другой вкладке, либо лучше всего просто обновить страницу, когда приложение станет активным. Ждем хорошего ответа. Заранее спасибо.
EDIT
Когда я запускаю с этой настройкой, она прерывается внутри MBProgressHUD
- (id)initWithView:(UIView *)view {
// Let's check if the view is nil (this is a common error when using the windw initializer above)
if (!view) {
[NSException raise:@"MBProgressHUDViewIsNillException"
format:@"The view used in the MBProgressHUD initializer is nil."]; // <-- Aborts on this line, so they know it can happen
}
id me = [self initWithFrame:view.bounds];
// We need to take care of rotation ourselfs if we're adding the HUD to a window
if ([view isKindOfClass:[UIWindow class]]) {
[self setTransformForCurrentOrientation:NO];
}
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceOrientationDidChange:)
name:UIDeviceOrientationDidChangeNotification object:nil];
return me;
}