Показать popView tableView, как только данные загружены - PullRequest
2 голосов
/ 13 октября 2011

Я хочу показать мой Popover с TableView с самого начала, когда приложение загружается. Проблема в том, что у tableView нет содержимого. Я использую этот метод:

 UIBarButtonItem *barItem = [self.toolbar.items objectAtIndex:0];
[self.popoverController presentPopoverFromBarButtonItem:barItem permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];

Теперь моя идея состояла в том, чтобы иметь метод делегата, который запускается, когда tableView заканчивает выборку данных, но, к сожалению, ничего не происходит:

RootViewController.h

@protocol RootDelegate <NSObject>
@optional
 -(void)didFinishLoading;
@end

RootViewController.m:

- (void)viewDidLoad
{
[super viewDidLoad];
[self.tableView initWithFrame:self.tableView.frame style:UITableViewStyleGrouped];
self.clearsSelectionOnViewWillAppear = NO;
[self setTitle:@"Zielscheiben"];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dataSaved:) name:@"DataSaved" object:nil];

[[self delegate] didFinishLoading];
}

DetailViewController.m (соответствует протоколу)

 - (void)didFinishLoading
 {
    UIBarButtonItem *barItem = [self.toolbar.items objectAtIndex:0];
    [self.popoverController presentPopoverFromBarButtonItem:barItem permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];

  }

Ответы [ 2 ]

2 голосов
/ 20 сентября 2012

Вам нужно поместить ваш поповер в viewDidAppear:

- (void)viewDidAppear {
    UIBarButtonItem *barItem = [self.toolbar.items objectAtIndex:0];
    [self.popoverController presentPopoverFromBarButtonItem:barItem permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
}

viewDidAppear вызывается после того, как ваш UITableView завершил вызов своих методов делегата источника данных и табличного представления.

2 голосов
/ 14 октября 2011

Методы табличного представления являются многопоточными, поэтому ваш вызов в конце viewDidLoad произойдет в непредсказуемое время, очевидно, здесь до заполнения таблицы. Я не вижу ни одного метода делегата, ссылающегося на событие «таблица заполнена», поэтому я предпочел бы сохранить ваш код и задержать его выполнение:

[[self delegate] performSelector:@selector(didFinishLoading) withObject:nil afterDelay:1]

при условии, что для заполнения таблицы достаточно 1 секунды.

Другой вариант, который вы можете исследовать, - запускать его когда-то в cellForRowAtIndexPath, когда вы считаете, что в таблице достаточно данных, но это несколько сложнее.

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