2

我的 Viewcontroller 中有一个滚动视图。我还创建了一个视图并将其连接到一个 IBOutlet 变量。我需要向滚动视图添加许多视图。

将视图添加到 ScrollView 的代码:

在 .h 文件中

UIView *customView_;

@property (nonatomic, retain) IBOutlet UIView *customView;

在 .m 文件中:

@synthesize customView = customView_;

    for (int i = 0; i < 2; i++) {

        UIView *tempView = customView;
        tempView.frame = CGRectMake(i * 187, 0, 187, 133);
        [scrollView addSubview:tempView];
    }

但是使用上面的代码,我只能在位置看到一个:187,0,187,133。如果我将代码更改为 for,(int i = 0; i < 3; i++) {我只能在 374,0,187,133 中看到视图。谁能帮我解决这个错误?

4

1 回答 1

5

为什么会这样?

文档addSubview:

视图只能有一个超级视图。如果视图已经有一个超级视图并且该视图不是接收者,则此方法会在使接收者成为其新的超级视图之前删除先前的超级视图。

使用此代码

UIView *tempView = customView;
tempView.frame = CGRectMake(i * 187, 0, 187, 133);
[scrollView addSubview:tempView];

您正在尝试添加相同的视图两次/三次。使用文档中的注释,这将删除前一个,并将其添加到新位置。(虽然在您的情况下,超级视图是接收者,但这并不意味着它会复制您的视图并再次添加它)。

解决方案

不幸的是,UIView不遵循NSCopying协议。因此,您无法使用copy. 您将需要创建一个工厂方法来为您创建视图,如下所示:

-(UIView)createCustomView {
    ...
}

for然后在你的循环中调用它:

UIView *tempView = [self createCustomView];
tempView.frame = CGRectMake(i * 187, 0, 187, 133);
[scrollView addSubview:tempView];

这可能会超出 .xib 文件的范围。请参阅此答案以了解如何使其与 Interface Builder 配合使用。

于 2012-11-20T10:49:07.897 回答