【问题标题】:UITableview crash during pinch zooming捏缩放期间 UITableview 崩溃
【发布时间】:2011-10-06 15:36:38
【问题描述】:

iOS5:捏缩放时 UITableview 崩溃
步骤:
1.开表
2. 捏合手势缩放
iOS5 崩溃!!! SIGABRT
在 iOS 4.x 上运行良好
可能是什么原因?

信号 SIGABRT 之后

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
    return tableView;
}


*** Terminating app due to uncaught exception 'NSGenericException', reason: 
'The view returned from viewForZoomingInScrollView: must be a subview of the scroll view.
 It can not be the scroll view itself.'

【问题讨论】:

  • 您需要提供更多信息。 (崩溃日志、相关代码等)
  • 没有崩溃日志。没有。只发出信号 SIGABRT
  • 编辑您的问题以添加代码(确保使用编辑器中的{} 按钮对其进行格式化),并查明代码失败的位置。

标签: uitableview uiscrollview zooming subview ios5


【解决方案1】:

我今天刚刚在我的测试 iPad 上安装了 XCode 4.2 和 iOS5,我遇到了同样的问题。

我可以通过观察来自 Apple 的名为 ScrollViewSuite 的示例代码来解决这个问题。它包含一个名为 TapToZoom 的应用程序,它显示了捏缩放的正确实现(适用于 iOS5)。 基本上,我只需要做三件事: 1- 在视图控制器的 .m 文件的开头定义一个常量(就在#import 之后):

#define ZOOM_VIEW_TAG 100

2-然后,我在 viewDidLoad 的开头添加了一行(如果您不使用 nib 文件并通过编码创建视图,则为 loadView - 如 Apple 示例),在您的 tableView 上设置标签(嵌入在滚动视图中的表格):

[tableView setTag:ZOOM_VIEW_TAG];

3- 然后,最后,将viewForZoomingInScrollView中返回的值,从之前的'return tableView'改为:

return [scrollView viewWithTag:ZOOM_VIEW_TAG];

一旦这三个元素就位,我的缩放不仅再次起作用,而且我意识到它现在比以前平滑得多 - 这意味着我之前的实现在 iOS4 中已经存在缺陷。

我相信,如果您遵循这些指示,您的问题应该会得到解决。如果没有,请告诉我。 (从技术上讲,您可以在界面窗口中设置 tableView 的标签,然后摆脱步骤一和二,只需提供您在步骤 3 中定义的标签号,但从长远来看,代码的可读性会降低 -至少在我看来)

【讨论】:

  • 我已经按照你说的做了,但在iOS5上仍然崩溃。我也有 XCode 4.2 和 iOS5。
  • Alex,我今天(2013 年 2 月 13 日)检查了一下,发现问题已经消失了——我猜这与 iOS6 或 6.1 的更新有关。现在我不再需要这个“ZOOM_VIEW_TAG”了。就您而言,您最终找到解决问题的方法了吗?
  • 不,我刚刚重新组织了视图层次结构。
【解决方案2】:

错误消息实际上很有帮助。我在 iOS4 上运行良好的应用程序在 iOS 5 上也开始出现此错误。我通过将子视图添加到我的滚动视图(在您的情况下为 tableView)然后在委托中返回该子视图来解决了这个问题。

dummyView = [[UIView alloc] initWithFrame:tableView.bounds];
[tableView addSubview:dummyView];

...

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
return dummyView;
}

【讨论】:

  • 是的,你是对的。但我的情况很特殊,我需要缩放tableView,它也是滚动视图。如果将 tableview 嵌入到滚动视图中并设置为滚动视图比例参数,那么它可以正常工作。但是来自 Apple 的文档重要提示:您不应该在 UIScrollView 对象中嵌入 UIWebView 或 UITableView 对象。如果这样做,可能会导致意外行为,因为这两个对象的触摸事件可能会混淆和错误处理。
  • 你的意思是 - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { return dummyView; } 在你的答案中?
  • 我编辑了我的回复以使其更接近您的情况。正如你所说,tableView 是一个滚动视图,所以我用它替换了我的回复中的 mainScrollView。您对错字的看法也是正确的。
【解决方案3】:

对我来说同样的错误,解决方案只是返回 self.view 而不是 myScrollView

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
        return self.view;;
 }

我希望这会有所帮助。

【讨论】:

  • self.view 是应该滚动的视图 如果执行代码会出现同样的错误:从 viewForZoomingInScrollView 返回的视图:必须是滚动视图的子视图。它不能是滚动视图本身。
猜你喜欢
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2015-11-22
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
相关资源
最近更新 更多