Используйте аргументы в качестве имен переменных в target-c - PullRequest
4 голосов
/ 19 января 2010

Я новичок в объективе-c и застрял с проблемой. Можно ли взять аргумент функции для использования в качестве имен некоторых переменных?

Например, скажем, у меня есть несколько изображений: aPic1, aPic2, bPic1, bPic2, cPic1, cPic2, и я хочу создать действие, чтобы при каждом нажатии кнопки контроллер представления скрывал Pic1 и отображать Pic2, в зависимости от того, какая кнопка нажата.

- (void) performAction:(NSMutableString *) text
{
    [text appendString:@"Pic1"].hidden = YES;    //I wanna hide textPic1, which is a UIImageView
    [text appendString:@"Pic2"].hidden = NO;     //I wanna show textPic2, which is also a UIImageView
}

Я знаю, что я не должен использовать NSString или NSMutableString в этом случае. У кого-нибудь есть идеи, как мне достичь своей цели с помощью такого рода функций? Спасибо.

Ответы [ 3 ]

5 голосов
/ 19 января 2010

Да, вы можете. (с):)

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

Вот пример:

- (void)performAction:(NSMutableString *)text {
    [(UIImageView *)[self performSelector:NSSelectorFromString([text stringByAppendingString:@"Pic1"])] setHidden:YES];
    [(UIImageView *)[self performSelector:NSSelectorFromString([text stringByAppendingString:@"Pic2"])] setHidden:NO];
}

Что касается свойств, я на самом деле думал просто дать вам пример кода, чтобы начать использовать эту замечательную функцию Objective C ASAP, что я и сделаю. Хотя я не уверен, что углублюсь в эту тему, потому что для этого может потребоваться слишком много интернет-бумаги, поэтому после примера кода я также добавлю несколько ссылок для дальнейшего чтения.

@interface AClass : NSObject {
    // Here's where you declare variables
    NSObject *objectForInternalUseWeWantToBeRetained;
    id linkToObjectUsuallyNotRetained;
    int nonObjectVariable;
    BOOL aVariableWithARenamedGetter;
}

// And here's where their properties are declared
@property (nonatomic, retain) NSObject *objectForInternalUseWeWantToBeRetained;
@property (nonatomic) id linkToObjectUsuallyNotRetained;
@property (nonatomic, assign) int nonObjectVariable;
@property (nonatomic, assign, getter=renamedVariableGetter) BOOL aVariableWithARenamedGetter;


@end


@implementation AClass

// Here we command the machine to generate getters/setters for these properties automagically
@synthesize objectForInternalUseWeWantToBeRetained, linkToObjectUsuallyNotRetained, nonObjectVariable, aVariableWithARenamedGetter;

// But you can implement any of the getters/setters by yourself to add some additional behaviour
- (NSObject *)objectForInternalUseWeWantToBeRetained {
    // Some additional non-usual stuff here

    // And after that we do the getters job - return the variables value
    return objectForInternalUseWeWantToBeRetained;
}

// And of course we don't forget to release all the objects we retained on dealloc
- (void)dealloc {
    [objectForInternalUseWeWantToBeRetained release];

    [super dealloc];
}


@end

// And here's where their properties are declared
@property (nonatomic, retain) UIImageView *testPic1;
@property (nonatomic, retain) UIImageView *testPic2;


@end

Предупреждение: я быстро прошел через суффи. Вот хороший урок в блоге CocoaCast - Свойства в Objective-C 2.0 , который, я думаю, может быть хорошей отправной точкой. Кстати, они предоставляют много учебных материалов (подкасты, скринкасты и т. Д.), Поэтому просмотр их сайта может быть полезным. И, конечно же, основное место, где можно узнать все о Objective-C и какао, - это официальная документация, здесь о свойствах .

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

Это возможно, но окольным путем. Вы можете сделать ivars @properties в своем классе, а затем получить к ним доступ через:

id myIvar = [self valueForKey:[text appendString:@"Pic1"]];
[myIvar setHidden:YES];

Или вы можете пойти ниже во время выполнения и использовать эти методы:

#import <objc/runtime.h>

id myIvarValue = nil;
[text appendString:@"Pic1"];
Ivar theIvar = object_getInstanceVariable(self, [text UTF8String], &myIvarValue];
[myIvarValue setHidden:YES];
1 голос
/ 19 января 2010

Вы можете хранить все свои подпредставления в словаре:

NSMutableDictionary *viewsByName = [[NSMutableDictionary alloc] init];

[viewsByName addObject:aPic1 withKey:@"aPic1"];
[viewsByName addObject:aPic2 withKey:@"aPic2"];
[viewsByName addObject:bPic1 withKey:@"bPic1"];
[viewsByName addObject:bPic2 withKey:@"bPic2"];

А потом:

- (void) performAction:(NSString *) text
{
    ((UIView *)[viewsByName objectWithKey:[NSString stringWithFormat:@"%sPic1",text]]).hidden = YES;
    ((UIView *)[viewsByName objectWithKey:[NSString stringWithFormat:@"%sPic2",text]]).hidden = NO;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...