Загрузка UIWebView из UITableView работает только в первый раз

Я использую rubymotion с фреймворком promotion для разработки своего первого приложения для iOS. У меня есть табличное представление (внутри навигационного контроллера), нажатие на ячейку таблицы открывает новый экран с веб-представлением, которое загружает локальный html-файл. Проблема в том, что веб-представление отображается только в первый раз, когда я его загружаю. Когда я возвращаюсь (контроллер навигации) и снова нажимаю на любую ячейку, открывается новый экран, но веб-просмотр не отображается. Запускается метод делегирования веб-представлений, поэтому он загружает его, но я вижу только черный экран (с панелью навигации).

Вот код для экрана с веб-представлением:

class XXXDetailScreen < ProMotion::Screen

  attr_accessor :screen_title

  def on_load
    XXXDetailScreen.title = self.screen_title

    @web_view = add_element UIWebView.alloc.initWithFrame(self.view.bounds)
    @web_view.delegate = self
    @web_view.scrollView.scrollEnabled = false
    @web_view.scrollView.bounces = false

    @web_view.loadRequest(NSURLRequest.requestWithURL(NSURL.fileURLWithPath(NSBundle.mainBundle.pathForResource('index', ofType: 'html', inDirectory: 'html'))))
  end

  def webView(inWeb, shouldStartLoadWithRequest: inRequest, navigationType: inType)
    true
  end
end

Экран выше открывается с помощью этого кода:

def tableView(tableView, didSelectRowAtIndexPath: indexPath)
    tableView.deselectRowAtIndexPath(indexPath, animated: true)

    open GalleryDetailScreen.new(screen_title: @data[indexPath.row][:title]), hide_tab_bar: true
end

Спасибо за любые предложения


person V.S.    schedule 28.02.2013    source источник


Ответы (1)


Я один из создателей ProMotion. Обычно лучше использовать метод will_appear для настройки элементов представления, так как on_load обычно срабатывает слишком рано, чтобы получить правильное представление bounds. Однако, если вы загрузите его в will_appear, вам нужно убедиться, что вы создаете экземпляр веб-представления только один раз (will_appear срабатывает каждый раз, когда вы переключаетесь на этот экран).

Я продемонстрирую:

class XXXDetailScreen < ProMotion::Screen

  attr_accessor :screen_title

  def on_load
    XXXDetailScreen.title = self.screen_title
  end

  def will_appear
    add_element draw_web_view
  end

  def draw_web_view
    @web_view ||= begin
      v = UIWebView.alloc.initWithFrame(self.view.bounds)
      v.delegate = self
      v.scrollView.scrollEnabled = false
      v.scrollView.bounces = false

      v.loadRequest(NSURLRequest.requestWithURL(NSURL.fileURLWithPath(NSBundle.mainBundle.pathForResource('index', ofType: 'html', inDirectory: 'html'))))
      v
    end
  end

  def webView(inWeb, shouldStartLoadWithRequest: inRequest, navigationType: inType)
    true
  end
end

В качестве примечания: вам действительно не нужен аксессор :screen_title. Просто сделайте это при загрузке:

open GalleryDetailScreen.new(title: @data[indexPath.row][:title]), hide_tab_bar: true
person Jamon Holmgren    schedule 01.03.2013
comment
Жамон, спасибо за помощь и за работу над ProMotion! Это делает разработку RubyMotion намного более приятной :) - person V.S.; 01.03.2013