2015-03-24 5 views
3

У меня есть UITableViewController в моем приложении с добавленным UIRefreshControl. Иногда, однако (я не уверен, как воспроизвести это, это случается время от времени), я получаю лишние пробелы в верхней части табличного представления, когда контроль обновления смещается даже ниже этого.UITableView и UIRefreshControl перемещаются по неизвестной причине

Это то, что он выглядит (холостой ход на левой стороне, тянет вниз справа):

screenshot

Я не имею никакого понятия, что может быть причиной этого. В моей viewdidload я только создаю экземпляр элемента управления обновлением и вызываю функцию обновления, которая устанавливает атрибутный заголовок. Я переместил добавление элемента управления обновлением в представление таблицы в viewDidAppear, как я читал в другом месте. Вот как выглядит этот код:

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.refreshControl = UIRefreshControl() 

    updateData() 
} 

override func viewDidAppear(animated: Bool) { 
    refreshControl!.addTarget(self, action: "updateData", forControlEvents: UIControlEvents.ValueChanged) 
    tableView.insertSubview(self.refreshControl!, atIndex: 0) 
} 

func updateData() { 
    //... 
    ServerController.sendParkinglotDataRequest() { 
     (sections, plotList, updateError) in 
     //... 

     // Reload the tableView on the main thread, otherwise it will only update once the user interacts with it 
     dispatch_async(dispatch_get_main_queue(), {() -> Void in 
      self.tableView.reloadData() 

      // Update the displayed "Last update: " time in the UIRefreshControl 
      let formatter = NSDateFormatter() 
      formatter.dateFormat = "dd.MM. HH:mm" 
      let updateString = NSLocalizedString("LAST_UPDATE", comment: "Last update:") 
      let title = "\(updateString) \(formatter.stringFromDate(NSDate()))" 
      let attributedTitle = NSAttributedString(string: title, attributes: nil) 
      self.refreshControl!.attributedTitle = attributedTitle 
     }) 
    } 
} 
+0

Вы пытались удалить uirefreshcontrol и проверить, сохраняется ли проблема? Как выглядит ваша иерархия взглядов? У вас есть другие подпункты в представлении контроллера вида, которые находятся ниже вашего представления в таблице? – croX

+0

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

+0

Ой, подождите, эта строка «tableView.insertSubview» ... У меня есть это до того, как я перешел к использованию UITableViewController и прочитал, что UIRefreshControl не должен использоваться так, как в обычных UITableViews. В этом случае это не обязательно, может быть, проблема? –

ответ

3

Нужно ли добавить элемент управления обновлением в качестве подзона таблицыView? Я думаю, все, что вам нужно сделать, это назначить self.refreshControl. Согласно документации:

Значением по умолчанию для этого свойства является nil.

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

Добавление подсмотра в viewDidAppear может выполняться не один раз. Если вы вытащите контроллер из ячейки и поп назад, это снова будет вызвано. Возможно, что insertSubview проверяет, имеет ли обновление уже родительский элемент и сначала удаляет его, поэтому может и не быть вашей проблемой. Вы должны делать только вставку, когда контроллер появляется в первый раз.

updateData также может быть добавлен несколько раз.

Поэтому я думаю, что вам нужно назначить self.refreshControl, а затем добавить обработчик для действия обновления, как и сейчас, используя addTarget, но на этот раз сделайте это на self.refreshControl.

Вы также можете сделать все это из раскадровки. В раскадровке вы выбираете UITableViewController, а в инспекторе атрибутов просто установите для атрибута Refreshing значение enabled. Это добавляет UIRefreshControl в таблицу, и вы можете видеть ее в иерархии представлений. Затем вы можете просто CTRL перетащить как обычно из элемента управления обновлением в .h-файл и добавить действие для valueChange, которое будет запущено, когда вы вытащите элемент управления обновлением в таблице.

+0

Я считаю, что вы, возможно, были правы, я начал добавлять управление обновлением в качестве подзадачи в обычный UITableView и только позже реорганизовал мой контроллер представлений как UITableViewController. Но я никогда больше не думал об этой линии. Это довольно сложно проверить, так как проблема возникает только время от времени, но это кажется логичным. Как я могу добавить добавление обработчика в раскадровку? Управление регенерацией на самом деле не существует в раскадровке. –

+0

Обновлен ответ, чтобы объяснить, как добавить UIRefreshControl в раскадровку. Его так же просто, как включение Refreshing в инспекторе атрибутов, и он добавляет его для вас. Затем вы можете добавить свое действие, используя CTRL перетащить в .h. С этим вы можете удалить весь свой код и просто выполнить действие. –

+0

Раскадровка была для меня «решением». Жаль, что я все еще не могу найти объяснения, почему это происходит. Я делаю это в документах Apple, но он дает эту неприятную ошибку в пользовательском интерфейсе. – Sirens

0

Ну, я считаю, что описанное поведение может не обязательно быть вызвано контролем обновления. В соответствии с тем, что у вас нет других подзонов под табличным представлением, я бы порекомендовал вам попробовать поместить «поддельный» вид ниже вашего представления в таблице. Обычно я предпочитаю пустую метку с длиной 0 сторон.

enter image description here

Я имел аналогичные проблемы, как ваша, где мой стол с видом на вставках были разбиты в некоторых случаях. И как только я использовал этот «поддельный» подход, проблемы исчезли. Я читал об этой проблеме и в некоторых других потоках. И решение было так.Кажется, это странное поведение/ошибка.

Дайте ему попробовать :)

+0

На самом деле не представляется возможным добавить что-то прямо над табличным представлением в UITableViewController? Кажется, что-то может сработать, но я просто не могу получить ярлык там: D –

+0

Вы правы, я думал, что вы используете UIViewController. Я не видел этого, когда читал ваш вопрос. Но помните об этом, если у вас есть табличный вид в «нормальном» контроллере. – croX

+0

Определенно, спасибо, спасибо! –

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