2014-01-24 4 views
10

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

Проблема в том, что иногда, когда вы просматриваете таблицуView, UIRefreshControl появляется не в том месте, и то, что кажется выше/поверх самого tableView. Я прикрепляю скриншот о том, что проблема выглядит, а также мой код, используемый для добавления UIRefreshControl и его метода обновления.

Я ценю любую помощь, предлагаемую!

enter image description here

- (void)viewDidLoad 
{ 
    self.refreshControl = [[UIRefreshControl alloc] init]; 

    [self.refreshControl addTarget:self action:@selector(refreshing:) forControlEvents:UIControlEventValueChanged]; 

    [self.tableView addSubview:self.refreshControl]; 

    self.tableView.tableFooterView = [[UIView alloc] init]; 
} 

- (void)refreshing:(UIRefreshControl*)refreshControl 
{ 
    [refreshControl beginRefreshing]; 

    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 

    [refreshControl endRefreshing]; 

    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
} 

ответ

25

Это известная ошибка с iOS7; иногда элемент управления обновлением помещается неправильно перед иерархией представлений, а не обратно. Вы можете противостоять часть проблемы, отправив его обратно после того, как макет:

- (void)viewDidLayoutSubviews 
{ 
    [super viewDidLayoutSubviews]; 

    [self.refreshControl.superview sendSubviewToBack:self.refreshControl]; 
} 

анимация будет по-прежнему несовершенна, но, по крайней мере, она все равно будет ниже табличном. Пожалуйста, откройте bug report with Apple по этой проблеме.

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

Swift версия

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 
    refreshControl?.superview?.sendSubview(toBack: refreshControl!) 
} 
+0

Как добавить это к таблицеView тогда? Просто вызовите функцию alloc init в элементе управления обновлением? – klcjr89

+0

@ troop231 Создайте его, добавьте цель/действие и назначьте его контроллеру табличного представления. Он позаботится о тебе. –

+0

Я просто удалил часть addSubview, и у меня уже есть цель/действие, теперь как мне ее назначить? Поскольку в представлении таблицы уже показано это, – klcjr89

13

У меня была такая же проблема, и установил ее с этим:

override func viewDidLoad() { 
    let refreshControl = UIRefreshControl() 
    refreshControl.addTarget(self, action: "refresh:", forControlEvents: .ValueChanged) 
    tableView.backgroundView = refreshControl // <- THIS!!! 
} 

Вместо добавления подвид назначить refreshControl в backgroundView

+0

Это работает только в том случае, если вы хотите только 1 вещь в своем представлении, но если у вас есть такие вещи, как бесконечный свиток или другие вещи это нарушит это –

Смежные вопросы