#ios #objective-c #iphone #user-interface #view
#iOS #objective-c #iPhone #пользовательский интерфейс #Вид
Вопрос:
Я пытаюсь создать приложение в OC и иметь константу в .h
файле, подобную этой, которая определяет, сколько столбцов должно быть в меню:
// cellManager.h
static int const cellNumberPerRow = 4;
Теперь в моем файле view manager ( .m
) мне нужно изменить количество столбцов на 3 при изменении размера шрифта. До сих пор я пытался:
// menuManagerView.m
if ([self isBigFontSize]) {
// ....
cellNumberPerRow = 3;
// ...
Но это выдает мне ошибку Cannot assign to variable 'cellNumberPerRow' with const-qualified type 'const int'
; И когда я пытался добавить идентификатор раньше, как это:
static int const cellNumberPerRow = 3;
Появляется предупреждение Unused variable 'cellNumberPerRow'
, и номер столбца остается 4;
Я чувствую, что должен быть элегантный способ сделать это, но нигде не смог его найти. Я действительно новичок в разработке iOS, поэтому был бы признателен за чей-либо вклад, спасибо!
Обновить
Я определил новую целочисленную переменную, присвоил ей значение переменной const и заменил все старые cellNumberPerRoe
новой переменной в .m
файле. Теперь это сработало. Но мне интересно, есть ли какой-нибудь лучший способ сделать это?
static int newCellNumberPerRow = cellNumberPerRow;
Ответ №1:
Если вы хотите изменить значение константы при некоторых обстоятельствах, это означает, что она больше не является константой. Вы могли бы обойти const
проверку компилятора с помощью указателя, но это контрпродуктивно. Было бы намного проще просто отказаться const
от определения вообще.
В качестве альтернативы я бы предложил вычисляемое свойство в вашем классе файлового менеджера, определенное следующим образом:
typedef NS_ENUM(int, CellNumberPerRow) {
defaultCellNumberPerRow = 4,
smallerCellNumberPerRow = 3,
};
@interface YourManager: NSObject
@property(readonly,nonatomic) int currentCellNumberPerRow;
@end
@implementation DocumentItem
-(int)currentCellNumberPerRow {
if ([self isBigFontSize]) {
return smallerCellNumberPerRow;
}
return defaultCellNumberPerRow;
}
@end
Теперь, чтобы получить соответствующий номер ячейки в строке, вместо этого вы должны использовать currentCellNumberPerRow
свойство.
Возможно, создание currentCellNumberPerRow
свойства класса @property(class,...)
вместо свойства экземпляра также может оказаться удобным.