这种尝试创建和填充NSMutableArray有什么问题?

时间:2013-10-04 14:17:23

标签: iphone ios objective-c ipad nsmutablearray

在我的.h文件中,我有:

@property (nonatomic) NSMutableArray *cards;

在我的.m文件中,我在初始化程序中:

- (id) init
{
    self = [super init];
    self.cards = [NSMutableArray alloc];
    return self;
}

在一个循环中填充可见和屏幕上的多个项目:

[self.cards addObject:noteView];

在触摸事件处理程序中,我有:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"In touchesBegan.");
    UITouch *touch = [touches anyObject];
    UIView *selectedView = nil;
    CGPoint touchLocation = [touch locationInView:self.view];

    for (UIView *card in _cards)
    {
        CGRect cardRect = [card frame];
        NSLog(@"%f", cardRect.origin.x);
        NSLog(@"%f", cardRect.origin.y);
        NSLog(@"%f", cardRect.size.height);
        NSLog(@"%f", cardRect.size.width);
        if (CGRectContainsPoint(cardRect, touchLocation)) {
            NSLog(@"Match found.");
            selectedView = card;
            CGRect selectedFrame = selectedView.frame;
            selectedFrame.origin.y = -selectedFrame.size.height;
            selectedFrame.size = selectedView.frame.size;
            float heightRatio = (float) floor([[UIScreen mainScreen] bounds].size.height + .4) / (float) selectedFrame.size.height;
            float widthRatio = (float) floor([[UIScreen mainScreen] bounds].size.width + .4) / (float) selectedFrame.size.width;
            float ratio = MIN(heightRatio, widthRatio);
            selectedFrame.size.height *= ratio;
            selectedFrame.size.width *= ratio;
            selectedFrame.origin.x = -selectedFrame.origin.x * ratio;

        }
    }
}

我所做的每次触摸的输出都是输出无条件的NSLog语句,但没有“Log this float”语句执行。似乎我没有正确初始化或没有正确填充NSMutableArray。

无论是引用_cards还是self.cards,我似乎都有同样的行为。

感谢您的帮助,

- 编辑 -

我似乎在坚持别的东西,而不是原先的想法。我现在有self.cards = [[NSMutableArray alloc] init],但行为相同:我经历一个循环并填充一堆卡片,但是当我点击其中一个时,触摸处理程序输出“In touchesBegan”。但没有漂浮物。鉴于一个更新的初始化,为什么touchesBegan会表现得好像在屏幕上看到一些卡后没有看到任何卡片? (另一个输出应该给出一些浮动线,无论触摸是否在特定卡的目标上。)

2 个答案:

答案 0 :(得分:4)

你需要初始化数组!

self.cards = [[NSMutableArray alloc] init];

self.cards = [NSMutableArray new];

它们都是等价的

使用alloc,您唯一要做的就是在内存中为该变量保留空间。

来自Apple文档:

alloc 
Returns a new instance of the receiving class.

init 
Implemented by subclasses to initialize a new object (the receiver) immediately after memory for it has been allocated.

答案 1 :(得分:2)

您是否正在使用故事板?尝试在viewDidLoad中初始化您的卡片属性。

作为快速检查,尝试在向其添加对象的循环之前初始化该属性。