Обновить tableView, когда приложение становится активным - PullRequest
0 голосов
/ 11 сентября 2011

Я знаю, что была задана пара вопросов, похожих на эти, но я думаю, что мои проблемы немного отличаются, так что терпите меня.

У меня есть приложение с вкладками в виде таблиц, настроенное на 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;
}

Ответы [ 2 ]

1 голос
/ 11 сентября 2011

Основная проблема здесь в том, что уведомления принимаются всеми представлениями, независимо от того, появятся они или нет.Хорошей практикой будет уведомление только тех представлений, которые появятся на экране

. Вы можете использовать метод делегата приложения (void)applicationWillEnterForeground:(UIApplication *)application для обработки изменений в приложении вместо уведомления.

  1. если проблема заключается в обновлении вкладки, которая находится на экране, тогда лучше отслеживать изменения на вкладке в AppDelegate и использовать ее, когда приложение выходит на передний план, было бы лучше, чем уведомление.

  2. Другой вариант - использовать метод viewWillAppear в tabbarcontroller.Когда этот метод вызывается, вы можете обновить текущую вкладку.

0 голосов
/ 11 сентября 2011

Там действительно не так много, чтобы помочь ответить на этот вопрос. @Learner дал мне идею, которая в конечном итоге привела к тому, как я решил эту проблему.

Поскольку вся логика, которая у меня есть, работает, проблема заключалась в том, чтобы не дать HUD украсть представление у другого, так как они оба были вызваны при ответе на событие уведомления. Поэтому в моем событии -becomeActive для обеих вкладок я добавил проверку, соответствует ли selectedIndex текущей вкладке, если нет, то нет обновления. Работал как шарм.

-(void)becomeActive:(NSNotification *)notification {
    // only respond if the selected tab is our current tab
    if (self.tabBarController.selectedIndex == 1) { // just set the number to your tab index
        [self viewDidAppear:YES];
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...