如何在touchesBegan:和touchesEnded :?之间以一致的方式跟踪触摸?

问题描述 投票:10回答:4

[在维护某些多点触摸“屏幕上绘制”代码时,遇到了一个与应如何在touchesBegan:withEvent:,touchesMoved:withEvent:和touchesEnded:withEvent:之间设置对触摸实例的引用有关的错误。

该代码使用NSDictionary实例在touchesBegan:withEvent:中存储触摸的引用,如下所示:

for (UITouch *touch in touches]) {
    NSValue *touchValue = [NSValue valueWithPointer:touch];
    NSString *key = [NSString stringWithFormat:@"%@", touchValue];
    [myTouches setValue:squiggle forKey:key];
}

并通过touchesEnded:withEvent检索它们:这种方式:

for (UITouch *touch in touches) {
    NSValue *touchValue = [NSValue valueWithPointer:touch];
    NSString *key = [NSString stringWithFormat:@"%@", touchValue];
    NSObject *valueFromDictionary = [myTouches valueForKey:key];
    [myTouches removeObjectForKey:key];
}

在这最后的代码中,由于字典不知道键,因此valueFromDictionary偶尔会变为nil。偶尔,我指的是大约1%的时间。

现在已设置上下文,我的问题是:

  1. 知道为什么此代码有错误吗?我不确定为什么它不起作用,特别是因为错误发生的频率非常低]

  2. Some doc from Apple指出,最好使用UITouch对象的地址作为键:,但是这意味着使用NSValue *对象而不是NSString *对象(,因此,由于事实,因此使用CFDictionaryRef而不是NSDictionary UITouch没有实现复制协议)。 为什么存储地址的NSString表示而不是NSValue本身不是一个能够使用NSDictionary的简单解决方案? [[更新:Apple更新了页面并删除了通过NSString,只是提到了“不是所有对象”的CFDictionaryRef解决方案。

恐怕我离C和指针的东西还很远,需要帮助来了解此代码中存在错误的原因。
ios pointers reference multi-touch touchesbegan
4个回答
5
投票

[当您使用stringWithFormat将NSValue实例转换为字符串时,我相信您实际上是在调用[touchValue description],但我不确定这是否可以保证结果的一致性。例如,与许多对象一样,如果描述中包含指向NSValue实例本身的指针怎么办?在这种情况下,存储完全相同的指针的两个不同的NSValue实例将产生不同的字符串键。


4
投票

0
投票

-1
投票
© www.soinside.com 2019 - 2024. All rights reserved.