1

我有一个 UIScrollView 的子类,它也是委托。

当我调用下一个协议函数时:

- (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view
{
id  element;
NSEnumerator *setEnum =   [touches objectEnumerator];

while ((element = [setEnum nextObject]) != nil)
{
    NSLog(@"element:%@", element);    
}

return [super touchesShouldBegin:touches withEvent:event inContentView:view];
}

NSLog 唯一显示的是:

element:<UITouch: 0x15a9a0> phase: Ended tap count: 3 window: <UIWindow: 0x392390; frame = (0 0; 320 480); layer = <UIWindowLayer: 0x382cd0>> view: <UIButton: 0x3a5e90; frame = (0 0; 106 138); opaque = NO; layer = <CALayer: 0x3a3e90>> location in window: {228, 126} previous location in window: {227, 126} location in view: {89.6667, 77} previous location in view: {88.3333, 77}

问题是,它将 NSSet 的内容显示为一个大的 NSString。如果我从 objectEnumerator 询问 allObjects,我只会在 NSArray 中得到一个对象。与 NSLog 显示的对象(NSString)完全相同。

有人可以告诉我我是否做错了什么,或者 NSSet 只提供一个 NSString 是否不正常。

谢谢!

4

2 回答 2

3

NSLog()输出是对description对象调用的方法的结果。NSLog()输出设计为人类可读的,仅用于调试。

<UITouch: 0x15a9a0>表示对象UITouch位于地址 0x15a9a0。其余的描述只是显示了一些有趣的值UITouch

尝试:

NSLog(@"tap count:%d", element.count);

等等,你会发现它不仅仅是一个字符串。

顺便说一句,不需要使用显式NSEnumerator、快速的枚举:您可以将代码简化为:

for (UITouch *element in touches)
{
    NSLog(@"element:%@", element);    
}
于 2012-02-09T18:14:48.340 回答
1

NSSet touches 是一组 UITouch 实例,而不是 NSStrings。当您将它发送到 NSLog 时,它会调用 UITouch 实例的“description”方法,该方法会返回一个 NSString。

于 2012-02-09T18:18:01.303 回答