获取UIScrollView的所有子视图

4

我需要获取UIScrollView中所有子视图的数组。目前我正在使用

NSArray *subviews = [myScrollView subviews];

但是它似乎只返回在代码运行时可见的子视图。我需要整个UIScrollView的所有子视图,即使那些当前隐藏(例如屏幕外)的视图也要包括在内。如何获得呢?
基本上,我正在寻找类似于UIScrollView的contentSize属性,但是它不仅返回UIScrollView如果足够大以显示其所有内容的大小,而且还要返回内容本身。
编辑:我想我已经弄清楚了:这个滚动视图实际上是一个UITableView,我认为它正在为我关闭屏幕之外的单元格,这就是它们没有显示的原因。我将进行一些测试来确认。

那段代码应该可以工作。这些视图是如何/何时添加到滚动视图中的? - Jesse Rusak
1
Subviews会返回所有的子视图,无论它们是否可见。实际上,这个问题的常见错误是Subviews会返回太多的子视图,包括滚动指示器。请发布您认为添加了比获取更多的代码。 - danh
你的修改是正确的。一旦一个单元格离开屏幕,它就会从滚动视图中移除并放入重用队列中。 - Craig Siemens
@CleverError:我从我的cellForRowAtIndexPath中删除了这一行代码UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell Identifier"];,因为我认为这是移除屏幕外单元格的代码,但似乎并没有帮助 - 屏幕外的单元格仍然没有被放入我的数组中。我该如何阻止它在单元格离开屏幕时将其删除? - GeneralMike
据我所知,没有办法阻止TableView删除单元格。为什么你需要获取一个不可见的单元格呢? - Craig Siemens
@CleverError:我基本上想将“屏幕截图”保存为.pdf文件,但需要在一个文件中包含表中的所有数据。 - GeneralMike
2个回答

8
尝试使用以下代码,这对我来说有效。
请注意,保留 HTML 标记。
for(UIView * subView in myScrollView.subviews ) // here write Name of you ScrollView.
{ 
     // Here You can Get all subViews of your myScrollView.
    // But For Check subview is specific UIClass such like label, button, textFiled etc.. write following code (here checking for example UILabel class).

        if([subView isKindOfClass:[UILabel class]]) // Check is SubView Class Is UILabel class?
        {
            // You can write code here for your UILabel;
        }
}

谢谢您快速回复,但我不认为您完全理解我的问题。我不需要关于如何使用子视图的任何帮助,我需要帮助获取所有的子视图 - 即使它们当前处于“屏幕之外”。 - GeneralMike
我刚试了一下,它应该返回所有的子视图。subviews属性是从UIView继承而来的,不是特定于UIScrollView的。你怎么知道你没有得到所有的子视图? - Christian Di Lorenzo

3

简而言之:

事实证明,

NSArray *subviews = [myScrollView subviews];
UIScrollView *myScrollView确实会返回所有子视图,即使它们不在屏幕上。


细节

我遇到的问题实际上是,我尝试使用这个方法的滚动视图实际上是一个UITableView。当UITableView中的UITableViewCell移出屏幕时,它实际上被从UITableView中删除 - 所以当我调用subviews时,我正在查找的单元格已经不在滚动视图中了。

我的解决方法是,在viewDidLoad中创建所有的UITableViewCell,然后将所有这些单元格放入一个数组中。然后,我没有使用subviews,而是使用了那个数组。当然,这样做会略微降低性能(在cellForRowAtIndexPath中,你只需从数组中返回单元格,这比通常使用的dequeueReusableCellWithIdentifier方法慢),但这是我能找到的唯一实现需要行为的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接