Почему OpenFileDialog изменяет мой рабочий каталог?

Я бы не стал маскировать предупреждение об устаревшей функции. Они осудили это по причине. Я считаю, что эта функция устарела, потому что эта серия функций NSString + UIKit была основана на библиотеке UIStringDrawing, которая не была поточно-ориентированной. Если вы попытаетесь запустить их не в главном потоке (как любая другая функциональность UIKit), вы получите непредсказуемое поведение. В частности, если вы одновременно запускаете функцию в нескольких потоках, это может привести к сбою приложения. Вот почему в iOS 6 они представили метод boundingRectWithSize:... для NSAttributedStrings. Он был построен поверх библиотек NSStringDrawing и является потокобезопасным.

Если вы посмотрите на новую функцию NSString boundingRectWithSize:..., она запрашивает массив атрибутов так же, как NSAttributeString. Если бы мне пришлось угадывать, эта новая функция NSString в iOS 7 является просто оболочкой для функции NSAttributeString из iOS 6.

На этой ноте, если бы вы поддерживали только iOS 6 и iOS 7, то я бы определенно замените все NSString sizeWithFont:... на NSAttributeString boundingRectWithSize. Это избавит вас от головной боли, если у вас будет странный многопоточный угловой корпус! Вот как я преобразовал NSString в sizeWithFont:constrainedToSize::

Что раньше было:

NSString *text = ...;
CGFloat width = ...;
UIFont *font = ...;
CGSize size = [text sizeWithFont:font 
               constrainedToSize:(CGSize){width, CGFLOAT_MAX}];

Может быть заменено на:

NSString *text = ...;
CGFloat width = ...;
UIFont *font = ...;
NSAttributedString *attributedText =
    [[NSAttributedString alloc]
        initWithString:text
        attributes:@
        {
            NSFontAttributeName: font
        }];
CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX}
                                           options:NSStringDrawingUsesLineFragmentOrigin
                                           context:nil];
CGSize size = rect.size;

Обратите внимание на упоминание в документации:

В iOS 7 и более поздних версиях этот метод возвращает дробные размеры (в компоненте размера возвращенного CGRect); чтобы использовать возвращаемый размер для представления размера, вы должны использовать повышение его значения до ближайшего более высокого целого числа с помощью функции ceil.

Таким образом, чтобы вывести вычисленную высоту или ширину, которая будет использоваться для размеров, я бы использовал:

CGFloat height = ceilf(size.height);
CGFloat width  = ceilf(size.width);
15
задан 30 May 2009 в 22:56
поделиться

3 ответа

Или вы можете заставить его этого не делать. См. Свойство FileDialog.RestoreDirectory .

19
ответ дан 1 December 2019 в 00:54
поделиться

Это неприятно, хотя в некотором смысле вы можете этого предвидеть ... если вы заходите в открытый диалог несколько раз (в приложении), вы часто находите его там, где вы его последний раз оставляли.

Если это повлияет на ваш код, вы можете сделать снимок GetCurrentDirectory () перед входом в диалоговое окно, а затем восстановить его (чтобы ваш код не увидел изменений). Вы можете захотеть сохранить рабочий каталог пользователя отдельно (и поменять их местами), чтобы пользователь также получил ожидаемое поведение.

7
ответ дан 1 December 2019 в 00:54
поделиться

Невозможно заставить Intellisense автоматически записывать имя универсального типа, используемого для вашего конкретного вызова. Лучшее, что вы можете сделать, это использовать тег typeparamref ,

6
ответ дан 1 December 2019 в 00:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: