Не удается найти полезное местоположение из -mouseDown: событие - PullRequest
0 голосов
/ 01 января 2011

Полное переписывание

Теперь я воспроизвел проблему, о которой я писал ранее, в тривиальном примере проекта, и поэтому у меня абсолютно нет представления о том, кем я могу бытьделать неправильно.Вот что я сейчас делаю.

  1. Создайте новое ванильное приложение какао (без базовых данных, не на основе документов)
  2. Добавьте класс с именем "MyImageView.m", нетзаголовок
  3. Заменить содержимое MyImageView.m на:

    @interface MyImageView :NSImageView {} @end
    
    
    @implementation MyImageView
    - (void)mouseDown:(NSEvent *)event {
        NSLog( @"mouse down event: %@", event );
        NSPoint point = [event locationInWindow];
        NSLog( @"mouseDown location: (%d,%d)", point.x, point.y );
    }
    @end
    
  4. Открыть MainMenu.xib в Интерфейсном Разработчике

  5. Перетащите изображение хорошо в ваше окно
  6. Измените его класс на MyImageView
  7. Сохраните все и запустите
  8. Нажмите в любом месте изображения скважины

Затем я вижу сообщение на консоли ниже:

2011-01-01 13:58:12.351 TestApp[1167:903] mouse down event: NSEvent: type=LMouseDown loc=(237,242) time=2033.7 flags=0x100 win=0x0 winNum=573 ctxt=0x0 evNum=286 click=1 buttonNumber=0 pressure=1

2011-01-01 13:58:12.353 TestApp[1167:903] mouseDown location: (-2057547688,16)

Почему «loc» в строковом представлении NSEvent корректно, но -locationInWindow это так явно не так?Что я мог сделать, чтобы такой тривиальный код был неправильным?

Я уже перезапустил систему на случай, если это может помочь.

1 Ответ

5 голосов
/ 01 января 2011

Два элемента NSPoint являются числами с плавающей запятой, поэтому неправильным является ваш оператор NSLog, а не возвращаемые значения. Вы должны убедиться, что тип в строке формата соответствует типу переменных, что вы можете сделать с помощью приведений:

Это будет работать:

NSLog( @"mouseDown location: (%d,%d)", (int) point.x, (int) point.y );

Как будет это:

NSLog( @"mouseDown location: (%f,%f)", (float) point.x, (float) point.y );

Наличие в NSPoint 32-битной или 64-битной плавающей запятой зависит от версии ОС и системы. Возможно, стоит использовать встроенную функцию «точка-строка»:

NSLog( @"mouseDown location: %@", NSStringFromPoint(point) );

(Обратите внимание, что при выполнении математических вычислений и сравнений все будет работать автоматически без вставки приведений. Только NSLog нуждается в помощи, чтобы получить это право.)

...