I am used to programming in Java and to use class variables to access data from other classes. Then I found out that class variables does not work the same way in Obj-C, and are having problems with that.
My problem is that i want to access the user inputted password in another class after the user is logged in. Have read in different forums and such that I should use class methods (+) to access these data. But because I need to create a new instance of the first class in class two it means that the inputted password does not exist in the new instance of class one.
My code is as follows:
class1.h
@interface class1 : UIViewController {
UITextField *usernameField;
UITextField *passwordField;
UIButton *loginButton;
NSString *password;
}
@property (nonatomic, retain) IBOutlet UITextField *usernameField;
@property (nonatomic, retain) IBOutlet UITextField *passwordField;
@property (nonatomic, retain) IBOutlet UIButton *loginButton;
@property (nonatomic, retain) NSString *password;
-(IBAction) loginButtonPushed;
+(NSString *)password;
@end
class1.m
#import "viewSwitcherViewController.h"
@implementation viewSwitcherViewController
@synthesize usernameField;
@synthesize passwordField;
@synthesize loginButton;
@synthesize password; // not needed
-(IBAction) loginButtonPushed {
password = passwordField.text; //not needed
// ...Code for switching view if successful login... EDITED:
class2 *c2 = [class2 alloc] init]; //Instantiating new class2 object
c2.password = passwordField.text; //Assigning tekst from passworField to thePassword-variable in the class2 instance.
}
class2.m
#import "class2.h"
#import "class1.h"
@implementation class2
@synthesize thePassword; //NSString variable
// this method is also not needed
-(void) someMethodUsingPassword {
class1 *c1 = [[class1 alloc] init];
thePassword = [c1 password];
NSLog(@"The password is: %@", thePassword); //This call returns null
}
So my problem is that the c1 instance created in class2 does not hold the submitted password and therefore returns "null".
Maybe this is just my Java approach messing it up, but I couldn't find any other way so please help:)!
A public class variable in Java is equivalent to a global variable in C and Objective-C. You would implement it as:
class1.h
class1.m
Then, anyone that imports class1.h can read and write to
MyGlobalPassword
.A slightly better approach would be make it accessible via a "class method".
class1.h:
class1.m:
Other classes would then read the password through the
password
class method.Class2.m :
The
class1
created inclass2
won't have a password set, because you just instantiated a new instance with[[class1 alloc] init]
-- this will not share member variables with other instances ofclass1
created elsewhere.You should rethink how your app structure is set up. Your basic need is that you need to save your password in one class and access it in another, right?
NSUserDefaults
is perfect (almost perfect, see note #3 below) for this. Change yourclass1
code to look like this:Get rid of your password property, you don't need it for anything now. Also, get rid of your
+(NSString *)password;
class method.When you need to access the login and password:
A few notes
NSUserDefaults
is NOT secure. If someone gains root access to your device or to your device backups, they may be able to extract this login information. If security is crucial to you, store the login information in Keychain.Generally,
When you accept the password in one screen and do whatever with it, you still have it. When you are moving to someother screen why dont you keep, class1's object as a property in class2 and set it before u pass the control to class 2.
Or if you are just calling the method of class2 ust pass class1 obj as a parameter with password already in it.
and in case u just pass it to the method as a parameter, u can access it. Or if you are setting it as a property of this class2. then u can always use a getter.
This thing has got nothing t do with Java or Objective C.