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 の内容が 1 つの大きな NSString として表示されることです。objectEnumerator から allObjects を要求すると、NSArray 内のオブジェクトが 1 つだけ取得されます。NSLog とまったく同じオブジェクト (NSString) が表示されています。

私が何か間違ったことをしているのか、それとも NSSet がただ 1 つの 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 は、NSString ではなく、一連の UITouch インスタンスです。NSLog に送信すると、NSString を返す UITouch インスタンスの「説明」メソッドが呼び出されます。

于 2012-02-09T18:18:01.303 に答える