Как динамически корректировать имена методов и вызовы с помощью Objective-C - PullRequest
2 голосов
/ 17 января 2010

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

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

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

и т.д.

Итак, я хочу вызвать метод и передать int. Это 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. Я предполагаю, что вы что-то сделаете с созданием строки, но я не уверен, как настроить это, чтобы использовать его, чтобы стать именем переменной. Любое понимание будет оценено. Спасибо за ваше время.

Ответы [ 5 ]

4 голосов
/ 17 января 2010

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

- (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;
}
4 голосов
/ 17 января 2010

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

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

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

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

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

3 голосов
/ 17 января 2010

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

NSArray* labels ;

В init: (или loadView)

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

В сделке:

[labels release] ;

в DyanamicMethod: (int) inputNumber

UILabel* label = [labels objectAtIndex:inputNumber] ;

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

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

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

Я думаю, что использование некоторого массива лучше для этой ситуации, но это возможно сделать таким образом. См. Документация по объекту NSO для executeSelector.

0 голосов
/ 17 января 2010

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

@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]];
}
0 голосов
/ 17 января 2010

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

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