2010-01-17 2 views
2

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

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

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

т.д.

так что я хочу, чтобы вызвать метод и передать в междунар. Этот int определит, какие ints, UILablels и BOOLs будут работать. Так, если 1 был принят в методе будет работать на этих переменных, как это:

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

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

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

ответ

-1

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

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

Не так уж много. Я мог бы сделать это так. Я делаю это с помощью ряда утверждений if. Я бы предположил, что есть способ сделать это динамически, но я ничего не вижу в своих поисках. Я не уверен, использую ли я правильные условия поиска. Я просто пытаюсь сконденсировать свой код, если это возможно. – MarcZero

3

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

NSArray* labels ; 

В INIT: (или loadView)

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

В dealloc:

[labels release] ; 

в DyanamicMethod: (интермедиат) inputNumber

UILabel* label = [labels objectAtIndex:inputNumber] ; 

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

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

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

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

4

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

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

Тогда метод будет выглядеть следующим образом:

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

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

+0

Я на самом деле всегда сохраняю свои нумерованные переменные 0, поэтому коммутатор должен быть простым. Это выглядит хорошо. Я настрою свой код и попробую это. Благодарю. – MarcZero

+1

Единственным недостатком здесь является то, что вы не сможете настроить IBOutlets в IB с помощью массивов. –

+0

Зачем использовать массивы стиля 'C' над NSArray? Используя NSArray, вы можете использовать быстрое перечисление для повторения значений, содержащихся в нем. –

0

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

@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

Вам не нужно '@ property's для участия в KVC. – kennytm

+0

@KennyTM: Либо свойства, либо самокодированные аксессоры, но это не имеет отношения к ответу Бена. –

+0

Да, я упомянул, что вам НЕ НУЖНО, но это облегчит ситуацию. –

4

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

- (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; 
} 
+0

Умм, я не знал о valueForKey Дополнительная информация здесь: http://stackoverflow.com/questions/1062183/объектив-c-whats-the-difference-between-objectforkey-and-valueforkey – Eld

Смежные вопросы