7

私はJavaでプログラミングし、クラス変数を使用して他のクラスのデータにアクセスすることに慣れています。次に、クラス変数がObj-Cで同じように機能しないことを知り、問題が発生しています。

私の問題は、ユーザーがログインした後、別のクラスでユーザーが入力したパスワードにアクセスしたいということです。さまざまなフォーラムで読んだことがあるので、これらのデータにアクセスするにはクラスメソッド(+)を使用する必要があります。ただし、クラス2の最初のクラスの新しいインスタンスを作成する必要があるため、入力されたパスワードがクラス1の新しいインスタンスに存在しないことを意味します。

私のコードは次のとおりです。

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
}

したがって、私の問題は、class2で作成されたc1インスタンスが送信されたパスワードを保持していないため、「null」を返すことです。

たぶん、これは私のJavaアプローチがそれを台無しにしているだけなのかもしれませんが、他の方法が見つからなかったので、助けてください:)!

4

4 に答える 4

14

Javaのパブリッククラス変数は、CおよびObjective-Cのグローバル変数と同等です。次のように実装します。

class1.h

extern NSString* MyGlobalPassword;

class1.m

NSString* MyGlobalPassword = nil;

そうすれば、class1.hをインポートする人は誰でも、を読み書きできますMyGlobalPassword

もう少し良いアプローチは、「クラスメソッド」を介してアクセスできるようにすることです。

class1.h:

@interface Class1 : UIViewController {
    UITextField *usernameField;
    UITextField *passwordField;
    UIButton *loginButton;    
}
+ (NSString*)password;
@end

class1.m:

static NSString* myStaticPassword = nil;

@implementation Class1
+ (NSString*)password {
    return myStaticPassword;
}

- (void)didClickLoginButton:(id)sender {
    [myStaticPassword release];
    myStaticPassword = [passwordField.text retain];
}

passwordその後、他のクラスはclassメソッドを介してパスワードを読み取ります。

Class2.m:

-(void) someMethodUsingPassword {
     thePassword = [Class1 password]; // This is how to call a Class Method in Objective C
     NSLog(@"The password is: %@", thePassword); 
}
于 2011-03-30T15:41:31.227 に答える
5

アプリの構造がどのように設定されているかを再考する必要があります。基本的なニーズは、あるクラスでパスワードを保存し、別のクラスでパスワードにアクセスする必要があるということです。NSUserDefaultsこれには完璧です(ほぼ完璧です。下記の注3を参照)。class1コードを次のように変更します。

-(IBAction) loginButtonPushed {
    NSString *username = self.usernameField.text;
    NSString *password = self.passwordField.text;

    // Do your login stuff here, if successful do the following
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefauls];
    [defaults setObject:username forKey:@"usernameKey"];
    [defaults setObject:password forKey:@"passwordKey"];
}

パスワードプロパティを削除します。今は何も必要ありません。また、+(NSString *)password; クラスメソッドを削除します。

ログインとパスワードにアクセスする必要がある場合:

-(void) someMethodUsingPassword {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefauls];
    NSString *username = [defaults stringForKey:@"usernameKey"];
    NSString *password = [defaults stringForKey:@"passwordKey"];

    // do whatever here
}

いくつかのメモ

  1. 私はこれをメモリから書いたので、何かを見つけたらエラーが発生する可能性があります。私に知らせてください。回答を更新します。
  2. クラスのメソッドとプロパティの使用方法に関するいくつかの重要なポイントが欠落しているようです。AppleのObjective-C入門を読むことを強くお勧めします。
  3. ログインとパスワードの情報をに保存するNSUserDefaultsことは安全ではありません。誰かがあなたのデバイスまたはあなたのデバイスのバックアップへのルートアクセスを取得した場合、その人はこのログイン情報を抽出できる可能性があります。セキュリティが重要な場合は、ログイン情報をキーチェーンに保存します。
于 2011-03-30T15:40:54.777 に答える
2

class1で作成されたものにはパスワードが設定されていません。これclass2は、で新しいインスタンスをインスタンス化しただけなので、他の場所[[class1 alloc] init]で作成された他のインスタンスとメンバー変数を共有しませんclass1

于 2011-03-30T15:08:44.720 に答える
1

一般的、

1つの画面でパスワードを受け入れてそれを使って何でもするとき、あなたはまだそれを持っています。別の画面に移動するときに、なぜ保持しないのか、class1のオブジェクトをclass2のプロパティとして設定し、uがコントロールをclass2に渡す前に設定します。

または、class2のメソッドを呼び出すだけの場合は、パスワードがすでに含まれているパラメーターとしてclass1objを渡す必要があります。

そして、uがそれをパラメーターとしてメソッドに渡すだけの場合、uはそれにアクセスできます。または、このクラスのプロパティとして設定している場合2。そうすれば、uはいつでもゲッターを使用できます。

このことは、JavaやObjectiveCとは何の関係もありません。

于 2012-01-07T03:58:34.700 に答える