同一 UIView 对象的多个实例的问题

Posted

技术标签:

【中文标题】同一 UIView 对象的多个实例的问题【英文标题】:Issue with multiple instances of same UIView object 【发布时间】:2011-02-07 10:29:37 【问题描述】:

我在为 ios 编程时遇到了问题。已经找了一些类似的问题,但还没有找到。

我正在创建至少 8 个自定义 UIView。正如您在附加代码中看到的那样,我正在通过一个循环运行,每轮创建一个实例。每个对象的引用都在内存中的不同空间上,但是当我更改一个对象中的值时,它只会影响在最后一个循环中创建的对象(最后创建的实例)。 有任何想法吗?

PadView.h:

#import <UIKit/UIKit.h>

@interface PadView : UIView 



- (void)setText:(NSString*)text;

@end

PadView.m:

#import "PadView.h"
#import "AVFoundation/AVFoundation.h";

@implementation PadView

AVAudioPlayer *player;
UILabel *label;

- (void)setText:(NSString*)text 

    label.text = text;


- (void)initialize 

    label = [[ UILabel alloc ] initWithFrame:CGRectMake(0.0, 93.0, 107.0, 13.0)];
    label.backgroundColor = [UIColor clearColor];
    label.font = [UIFont boldSystemFontOfSize:9];
    label.textAlignment = UITextAlignmentCenter;
    label.text = @"Empty";
    [self addSubview:label];
    [label release];


- (id) initWithCoder:(NSCoder *)aCoder 

    if (self = [super initWithCoder:aCoder]) 

        [self initialize];
    
    return self;


- (id) initWithFrame:(CGRect)rect 

    if (self = [super initWithFrame:rect]) 

        [self initialize];
    
    return self;


- (void)dealloc 

    [super dealloc];


@end

创建对象:

NSMutableArray *pads = [[NSMutableArray alloc] initWithCapacity:8];

for (int i = 0; i < 8; i++) 

    PadView *pad = [[PadView alloc] initWithFrame:CGRectMake(0.0, i*150, 107.0, 107.0)];
    [padsView addSubview:pad];
    [pads addObject:pad];

调用 setText:

PadView *pad = [pads objectAtIndex:5];
[pad setText:@"test"];

【问题讨论】:

会影响在最后一个循环中创建的对象?或者,它会影响在最后一个循环中创建的对象? 很抱歉告诉你,在这种情况下,你的问题很难解决。如果我们看到您的项目,也许可以。 【参考方案1】:

你的变量:

AVAudioPlayer *player;
UILabel *label;

@implementation 块中定义,因此它们实际上是全局变量(在C 意义上)。

所以基本上,当您设置 PadView 的 text 属性(这解释了您所看到的行为)时,您的所有 PadView 实例都会更改相同的 UILabel

我缺少一些上下文,但您似乎希望 label 成为实例变量(我也假设 player )。如果是这种情况,您需要在 @interface 块中声明它们,如下所示:

@interface PadView : UIView 

    AVAudioPlayer *player;
    UILabel *label;



- (void)setText:(NSString*)text;

@end

【讨论】:

【参考方案2】:

pads 未初始化

NSMutableArray *pads = [[NSMutableArray alloc] initWithCapacity:8];

并且您必须在添加为子视图和数组后释放焊盘

按照惯例,该类应命名为PadView,而不是padView

编辑

for(padView *pad in pads)
    //manipulate each pad 




//manipulate a certain pad
padView *pad = [pads objectAtIndex:5];
pad. //...

【讨论】:

我已经用这种方式初始化了数组。忘了说对不起。发布并没有带来改变。但是初始化垫是什么意思? InitWithFrame 等应该是初始化不应该吗? 或者更准确地说,你想做什么? 我的自定义 UIView 需要 UIViewController 吗?现在我只是从 UIView 类(PadView : UIView)中遗赠(谷歌翻译?!)我的自定义 UIView 我想做的事:我正在开发一个有 8 个打击板的应用程序,每个打击板都包含一个 avaudioplayer,当我触摸一个打击板时,触摸板应该开始播放,但应用程序总是只播放最后初始化的垫子,无论我按哪个垫子 您应该将其添加到原始帖子中,以便每个人都知道它。

以上是关于同一 UIView 对象的多个实例的问题的主要内容,如果未能解决你的问题,请参考以下文章

在python中同时产生同一对象的多个实例

同一个 Statefulwidget 的多个实例似乎共享同一个 State 对象?

R在同一引用类对象的多个实例上调用函数

如何跟踪同一用户(对象)的多个实例

子类化 UIView 并显示多个实例

在 Interface Builder 中实例化同一类的多个对象会导致共享属性