我正在使用以下文件从nib文件加载 View :

NSArray *nibViews = [[NSBundle mainBundle] loadNibNamed:@"AnalysisView" owner:self options:nil];
AnalysisView *gridView = [nibViews objectAtIndex: 0];

Nib 包含一个称为gridScrollView的滚动 View ,并且在AnalysisView实现文件中,我有一个将 View 作为 subview 添加到该滚动 View 的方法:
for (NSInteger i = [results count] -1; i >= 0; i--)
{
    Result *result = [results objectAtIndex:i];
    [self loadResult: result];
}

- (void) loadResult: (Result *) result
{
    NSArray *nibViews = [[NSBundle mainBundle] loadNibNamed:@"GridView" owner:self options:nil];
    GridView *gridView = [nibViews objectAtIndex: 0];
    gridView.tag = self.graphCount;

    CGRect gridFrame = gridView.frame;

    CGFloat yOffset = gridFrame.size.height * self.graphCount;
    gridView.frame = CGRectMake(0, yOffset, gridFrame.size.width, gridFrame.size.height);

    [self.gridScrollView addSubview: gridView];
    self.gridScrollView.contentSize = CGSizeMake(self.gridScrollView.frame.size.width, (yOffset + gridFrame.size.height));

    self.graphCount++;
}

我已经将scrollviews委托(delegate)设置为AnalysisView,并连接了doce end decelaring方法
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
      NSLog(@"%d", [scrollView.subviews count]);
}

当scrollViewDidEndDecelerating方法触发时,它报告 subview 的数量为5。这些 subview 中的3个是我期望的GridViews。但是有2个UIImageViews,我不知道它们为什么在那里。

这是一个问题,因为我打算在scrollViewDidEndDecelerating方法中使用viewWithTag检索 View 并在 View 上调用方法,但是,每当我尝试检索标记为0的 View 时,我都会检索UIImageView的其中一个,这将导致我的应用崩溃,因为无法在 ImageView 上调用该方法。

我知道一种解决方法是将GridViews存储在单独的实例数组中并从那里引用它们。但是我很好奇知道2个UIImageViews是什么以及它们如何到达那里。

最佳答案

默认情况下,UIScrollView包含2个UIImageViews作为滚动指示器的 subview 。尽管我在文档中找不到关于滚动指示器实现的任何特定信息,但这些 ImageView 仍存在于类声明中(请参见UIScrollView.h header ):

UIKIT_CLASS_AVAILABLE(2_0) @interface UIScrollView : UIView <NSCoding> {
    ...
    UIImageView* _verticalScrollIndicator;
    UIImageView* _horizontalScrollIndicator;

您还可以开始分配标签,而不是从0开始,而是从某个正数开始-这样可以避免与标准 subview 冲突

关于ios - UIScrollView幻像 subview ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5664281/

10-16 23:24