Я вижу, что у некоторых людей возникают проблемы с использованием метода UITapGestureRecognizer
. Самый простой способ, которым я выполнил эту функцию, при этом оставляя неизменным поведение нажатия моей существующей кнопки, это добавление только одной строки к ответу @ Jensen2k:
[tap setCancelsTouchesInView:NO];
Это позволило моим существующим кнопкам по-прежнему работать без использования @ Метод Дмитрия Ситникова.
Читайте об этом property
здесь (ищите CancelsTouchesInView
): Справочник по классам UIGestureRecognizer
Я не уверен, как это будет работать с полосами прокрутки, так как я Я вижу, у некоторых были проблемы, но, надеюсь, кто-то другой может столкнуться с тем же сценарием, что и у меня.
Верно, #define
не связаны пространствами имен. #define
- это директива препроцессора - она приводит к манипулированию исходным файлом перед компиляцией через компилятор. Пространства имен используются на этапе компиляции, и компилятор не понимает #define
.
Вам следует по возможности избегать использования препроцессора. Для таких постоянных значений лучше использовать const вместо #define
.
Я полностью согласен с предложениями об использовании констант и неограниченной области действия для #define
s.
Однако, если вы сделаете ] должны использовать строки препроцессора #define
, пожалуйста, закройте их правильно для ожидаемой области,
namespace MyNamespace
{
#define SOME_VALUE 0xDEADBABE
// your code
#undef SOME_VALUE
}
Почему #defines
?
Я знаю один случай, когда встроенная платформа не поддерживала константы в коде.
Не было возможности их инициализировать ...
Это всегда помогает сделать его более читабельным.
Препроцессор работает (по крайней мере, концептуально, а часто и фактически тоже) до того, как «сработают» пространства имен и другие концепции уровня языка - так что да, это определенно много лучше использовать конструкции уровня языка, такие как const
значения везде, где это возможно!
Если по какой-то причине вы не можете перейти ко второму случаю, я почти уверен, что вам придется позаботиться о том, чтобы скомпилировать MyNamespace в отдельный объект и связать объекты отдельно ( или, возможно, просто запустите препроцессор в этом единственном пространстве имен). Препроцессор C ++ должен взять этот оператор #define
и, по сути, выполнить замену строки в любом месте , которое SOME_VALUE
замечено в исходном коде. Следовательно, если препроцессор не знает #define
, НЕКОТОРЫЕ_ЗНАЧЕНИЕ
не может быть заменено в другом исходном файле.
Да. В общем, использование значений const вместо значений #define'd имеет много преимуществ. Ограничение области действия переменной - одно из преимуществ. Таким образом, область видимости может быть ограничена пространством имен или любой другой допустимой областью (в том числе на уровне класса, на уровне функции и т. Д.).