Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как динамически настраивать имена и вызовы методов с помощью Objective-C

Автор вопроса: MarcZeroОтветов: 5

Я пытаюсь сжать свой код для метода, и мне было интересно, как я смогу достичь следующего:

У меня есть несколько переменных, которые отличаются только своим количеством, например:

int intVariable1
int intVariable2
UILabel Label1
UILabel Label2
BOOL bool1
BOOL bool2

и Т. Д.

Итак, я хочу вызвать метод и передать int. Этот int будет определять, над какими целыми числами, UILablels и BOOL будут работать. Таким образом, если бы в методе была передана 1, эти переменные работали бы следующим образом:

- (void) DyanamicMethod: (int) inputNumber {
     //something that uses the inputNumber to act on the 1 variables

     intVariable1 = someValue;
     [Label1 setText:someText];
     bool1 = YES;
}

Очевидно, что если бы было передано 2, я бы хотел, чтобы переменные были 2-го типа. Я предполагаю, что вы каким-то образом сделаете что-то с созданием строки, но я не уверен, как это настроить, чтобы использовать ее в качестве имени переменной. Любое понимание будет оценено. Спасибо за уделенное время.

iphoneobjective-cvariablesdynamicmethods

Ответы

Ответ 1 · рейтинг 4 · Community

Объявите переменные как массивы:

int intVariable[2];
UILabel *Label[2];
BOOL bools[2];

Тогда метод будет выглядеть так:

intVariable[inputNumber] = someValue;
[Label[inputNumber] setText:@"someText"];
bools[inputNumber] = YES;

Имейте в виду, что индексы массивов отсчитываются от нуля, поэтому в массивах выше переменная "1" имеет индекс 0, а переменная "2" - индекс 1. Ваш метод также может просто взять inputNumber и вычесть из него единицу, чтобы получить индекс массива.

Ответ 2 · рейтинг 4 · gcamp

Вы можете использовать кодирование "ключ-значение".

- (void) DyanamicMethod: (int) inputNumber {
     //something that uses the inputNumber to act on the 1 variables

     NSString* key = [NSString stingWithFormat:@"Label%i", number];
     UILabel* label = [self valueForKey:key];
     label.text = newString;
}

Ответ 3 · рейтинг 3 · Eld

Если вам нужно что-то подобное, вы можете сохранить NSArray всех меток ... Как в разделе интерфейса класса:

NSArray* labels ;

В init: (или loadView)

labels = [[NSArray alloc] initWithObjects:Label1, Label2,etc] ;

В dealloc:

[labels release] ;

в DyanamicMethod: (int) inputNumber

UILabel* label = [labels objectAtIndex:inputNumber] ;

Повторите для каждого типа ... Или создайте новый класс, содержащий метку, int и bool, и сделайте массив этого типа.

Другой способ:
Создать свойства для каждой из ваших переменных-членов.
Затем в вашей функции:

UILabel label1 = [self performSelector:sel_getUid([[NSString stringWithFormat:@"label%d", inputNumber] UTF8String])] ;

Я думаю, что в этой ситуации лучше использовать какой-либо массив, но это возможно. См. Документация NSObject для performSelector.

Ответ 4 · Ben Gottlieb

Вы можете сделать это с помощью свойств (ну, вам не НУЖНЫ свойства, но они упростят), хотя вам придется переключиться на объекты:

@property (nonatomic, readwrite, retain) NSNumber *variable1, *variable2;
@property (nonatomic, readwrite, retain) NSNumber *bool1, *bool2;
@property (nonatomic, readwrite, retain) UILabel *label1, *label2;

- (void) DyanamicMethod: (int) inputNumber {
    [[self valueForKey: [NSString stringWithFormat: @"label%d", inputNumber] setText: someText];
    [self setValue: [NSNumber numberWithInt: inputNumber]
            forKey: [NSString stringWithFormat: @"variable%d", inputNumber]];
    [self setValue: [NSNumber numberWithBool: YES]
            forKey: [NSString stringWithFormat: @"bool%d", inputNumber]];
}

Ответ 5 · рейтинг -1 · sbooth

У вас слишком много переменных для простого оператора switch?

switch(inputNumber) {
  case 1:
    intVariable1 = someValue;
    [Label1 setText:someText];
    bool1 = YES;
    break;
  case 2:
    intVariable2 = someValue;
    [Label2 setText:someText];
    bool2 = YES;
    break;
// etc
}

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы