Use arguments as variable names in objective-c

I am new to objective-c and got into a problem. Can a function argument be used to use as variable names?

For example, let's say I have a bunch of images: aPic1, aPic2, bPic1, bPic2, cPic1, cPic2, and I want to create an action so that every time the button is clicked, the view controller will hide Pic1 and display Pic2, depending on which button is pressed.

- (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 } 

I know that in this case I should not use NSString or NSMutableString. Does anyone know how I can achieve my goal with such a function? Thanks.

+4
source share
3 answers

Yes, you can. (c) :)

For the solution that I suggest you work with, you will need to have access (set / get) your variables using methods (easy to make using properties or write your own setters and getters).

Here is an example:

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

In terms of properties, I was actually thinking of just giving you sample code to start using this wonderful Objective-C ASAP feature, which I will do. Although I am not sure to delve into this topic, because it may require too much Internet paper, therefore, why, after the example code, I will also add some links for further reading.

 @interface AClass : NSObject { // Here where you declare variables NSObject *objectForInternalUseWeWantToBeRetained; id linkToObjectUsuallyNotRetained; int nonObjectVariable; BOOL aVariableWithARenamedGetter; } // And here 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 where their properties are declared @property (nonatomic, retain) UIImageView *testPic1; @property (nonatomic, retain) UIImageView *testPic2; @end 

Warning: I quickly went through the day. Here is a good tutorial on CocoaCast's blog - Properties in Objective-C 2.0 , which I think can be a good starting point. By the way, they provide a lot of training materials (podcasts, screencasts, etc.), so viewing their site can be useful. And, of course, the main place to learn all about Objective-C and Cocoa is the official documentation, here where it is about properties .

+5
source

This is possible, but in a workaround. You can do ivars @properties in your class and then access them via:

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

Or you can go below at runtime and use these methods:

 #import <objc/runtime.h> id myIvarValue = nil; [text appendString:@"Pic1"]; Ivar theIvar = object_getInstanceVariable(self, [text UTF8String], &myIvarValue]; [myIvarValue setHidden:YES]; 
+3
source

You can store all your routines in a dictionary:

 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"]; 

And then:

 - (void) performAction:(NSString *) text { ((UIView *)[viewsByName objectWithKey:[NSString stringWithFormat:@"%sPic1",text]]).hidden = YES; ((UIView *)[viewsByName objectWithKey:[NSString stringWithFormat:@"%sPic2",text]]).hidden = NO; } 
+1
source

All Articles