Что лучший способ состоит в том, чтобы определить строковые константы в объективном-c протоколе?

'Inside the Enter event
TextBox1.SelectAll();

хорошо, после попытки это вот - то, что Вы хотите:

  • На событии Enter запускают флаг, который указывает, что Вы были во ввести событии
  • На событии Click при установке флага назовите.SelectAll () и сбросьте флаг.
  • На Событии mouseMove, набор вводимый флаг ко лжи, которая позволит Вам нажимать выделение, не имея необходимость вводить текстовое поле сначала.

Это выбрало весь текст на записи, но позволило мне выделять часть текста впоследствии или позволять Вам выделяться при первом щелчке.

запросом:

    bool entered = false;
    private void textBox1_Enter(object sender, EventArgs e)
    {
        entered = true;
        textBox1.SelectAll();   //From Jakub's answer.
    }

    private void textBox1_Click(object sender, EventArgs e)
    {
        if (entered) textBox1.SelectAll();
        entered = false;
    }

    private void textBox1_MouseMove(object sender, MouseEventArgs e)
    {
        if (entered) entered = false;
    }

Для меня, переключение вкладок в управление выбирает весь текст.

11
задан Elise van Looij 8 December 2009 в 18:10
поделиться

4 ответа

Вы можете объявить их в заголовке с протоколом (но за пределами самого интерфейса протокола), а затем определить их в файле реализации для протокола (очевидно, у него не было бы раздел @implementation - только ваши определения NSString ).

Или используйте отдельную пару .h / .m, предназначенную только для строковых констант (заголовок протокола может импортировать заголовок строковых констант) .

10
ответ дан 3 December 2019 в 04:32
поделиться

Вы сохраняете определение .h:

extern NSString * const MyPluginErrorDomain;

, но помещаете эту часть в отдельный файл .m, который включается в ваш фреймворк:

NSString * const MyPluginErrorDomain = @"MyPluginErrorDomain";

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

9
ответ дан 3 December 2019 в 04:32
поделиться

В C ++ я бы объявил их в заголовке следующим образом:

const char * const MYPLUGIN_ERROR_DOMAIN = "MyPluginErrorDomain";
const char * const MYPLUGIN_FOO_DOMAIN = "MyPluginFooDomain";

Обратите внимание, что поскольку указатели const , они будут локальными по отношению к единицам перевода заголовок #included, поэтому нет необходимости использовать extern для предотвращения множественных ошибок определения.

3
ответ дан 3 December 2019 в 04:32
поделиться

Вы должны реализовать это как внешние строки, как в вашем примере:

extern NSString * const MyPluginErrorDomain;

или предоставить внешние функции, которые возвращают статические данные хранения. Например:

 /* h */ 

 extern NSString * MyPluginErrorDomain();

 /* m */ 

 NSString * MyPluginErrorDomain() {
    static NSString * const s = @"MyPluginErrorDomain";
    return s;
 }

Причина в том, что строки и ключи часто используются и сравниваются по значению указателя или хеш-значению, а не по истинному сравнению строк (isEqualToString:).

На уровне реализации существует большая разница между:

В коде это означает, что когда сравниваемые строки определены в нескольких двоичных файлах:

Скажем, «MyPluginErrorDomain» и «key» имеют одинаковые строковые значения, но определены в разных двоичных файлах (т.е. на хосте плагина один в плагине).

/////// Pointer comparison (NSString)
BOOL a = [MyPluginErrorDomain isEqualToString:key];
BOOL b = MyPluginErrorDomain == key;

// c may be false because a may be true, in that they represent the same character sequence, but do not point to the same object
BOOL c = a == b;


/////// Hash use (NSString)
// This is true
BOOL d = [MyPluginErrorDomain hash] == [key hash];

// This is indicative if true
BOOL e = [MyPluginErrorDomain hash] == [someOtherStringKey hash];

// because
BOOL f = [MyPluginErrorDomain isEqualToString:someOtherStringKey];

// g may be false (though the hash code is 'generally' correct)
BOOL g = e == f;

Поэтому во многих случаях необходимо предоставить ключи. Это может показаться тривиальным моментом,

2
ответ дан 3 December 2019 в 04:32
поделиться