从 UITableView 加载 UIWebView 仅第一次有效

Posted

技术标签:

【中文标题】从 UITableView 加载 UIWebView 仅第一次有效【英文标题】:Loading UIWebView from UITableView works only 1st time 【发布时间】:2013-02-28 11:26:24 【问题描述】:

我正在使用带有promotion 框架的rubymotion 来开发我的第一个ios 应用程序。我有一个表格视图(在导航控制器内部),点击表格单元格会打开带有加载本地 html 文件的 web 视图的新屏幕。问题是 Web 视图仅在我第一次加载时显示。当我返回(导航控制器)并再次点击任何单元格时,它会打开新屏幕,但不会显示 Web 视图。 Web 视图委托方法被触发,因此它加载它,但我只看到黑屏(带导航栏)。

这是带有网页视图的屏幕的代码:

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

感谢您的任何建议

【问题讨论】:

【参考方案1】:

我是 ProMotion 的创建者之一。通常最好使用will_appear 方法来设置视图元素,因为on_load 通常会过早触发以获取正确的视图bounds。但是,如果您确实在 will_appear 中加载它,您需要确保只实例化一次 Web 视图(每次切换到该屏幕时都会触发 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

【讨论】:

Jamon,感谢您的帮助以及您在 ProMotion 上所做的工作!它使 RubyMotion 开发更加愉快:)

以上是关于从 UITableView 加载 UIWebView 仅第一次有效的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 无法从 CustomCell 重新加载数据

从下载的 plist 中重新加载 UITableView 数据

从笔尖加载的 UITableView 单元格不显示背景颜色

从 iOS 中的 UIView 子视图重新加载时 UITableView 未重新加载

在加载 UITableVIew 之前从解析中检索图像?

从 AFNetworking 2.0 加载带有 JSON 的 UITableView