2

この種の問題がここで何度か議論されていることは知っていますが、すでに検索して試してみましたが成功しませんでした。一般メニューの上部に簡単なログイン ビューを作成しようとしています。このログイン ページには、2 つのテキスト フィールド (ユーザー名とパスワード) と 1 つのボタン (ログイン) があります。私の問題は、[ログイン] ボタンをクリックするとすべてが完全に表示されるのに、応答しないことです。

* moveTo メソッドを使用して開始点から終了点までアニメーション化されたログイン ビュー。その部分にコメントしますが、まだ応答していません。

Main.m

- (void)viewDidLoad
{

    prefs = [NSUserDefaults standardUserDefaults];

    if (![prefs objectForKey:@"userName"]) {
        LoginScreen *login = [[LoginScreen alloc] initWithFrame:CGRectMake(35, 400, 250, 350)];
        [self.view addSubview:login];
        [login moveTo:CGPointMake(35.0, 65.0) duration:0.6 option:UIViewAnimationOptionCurveEaseOut];  
    }        

    [super viewDidLoad];
}

LoginScreen.m

@synthesize login;

    - (id)initWithFrame:(CGRect)frame
    {
         self = [super initWithFrame:frame];
         if (self) {

             self.layer.masksToBounds = YES;
             self.userInteractionEnabled = YES;

             [self addButton:login withTitle:@"Login" andSize:CGRectMake(85, 200, 90, 35)];
             [login addTarget:self action:@selector(attemptLogin)
                   forControlEvents:UIControlEventTouchUpInside];

         }

         return self;
    }

        - (void) addButton: (UIButton*) button withTitle: (NSString*) title andSize: (CGRect) size{

            button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
            button.frame = size;
            [button setTitle:title forState:UIControlStateNormal];
            button.userInteractionEnabled = YES;
            [self addSubview:button];
        }


        - (void)attemptLogin{

            NSString *user = usernameTxt.text;
            NSString *pass = passwordTxt.text;
            NSString *url = [[NSString alloc] initWithFormat:@"http://domain.com/login.php?username=%@&password=%@", user, pass];

            NSLog(@"%@", url);

        }

画面に何も印刷されません。

前もって感謝します

4

3 に答える 3

2

これは、ボタンがクリックされたときに呼び出すセレクターを指定せずにボタンを作成したためです。この行をメソッドに追加addButtonすると、問題が解決します。

[button addTarget:self action:@selector(attemptLogin) forControlEvents:UIControlEventTouchUpInside];

合成されたloginプロパティを使用して同じことをしようとすると、 を設定していないため、コードは機能しませんlogin。関数に渡すとaddButton、値は無視されます (すぐに再割り当てします)。loginただし、Objective C はパラメーターを値で渡すため、割り当てによって の値が変更されることはありません。

コードを修正する別の方法は、次のように、それ自体でloginはなくへのポインターを渡すことです。login

- (void) addButton: (UIButton**) button withTitle: (NSString*) title andSize: (CGRect) size {
    *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    (*button).frame = size;
    [*button setTitle:title forState:UIControlStateNormal];
    (*button).userInteractionEnabled = YES;
    [self addSubview:*button];
}

コードを修正するこの方法には反対することをお勧めします。login内部で直接使用するaddButton方がおそらく良い選択です。

于 2013-01-24T17:49:07.953 に答える
2

問題は主に、新しいボタンを割り当てているため、ログインボタンが機能しないことです。コードの割り当てについてコメントしましたが、これは機能するはずです:

// 古いバージョンのコードは削除されました。編集を確認してください

編集

  - (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

        self.layer.masksToBounds = YES;
        self.userInteractionEnabled = YES;

        login = [self addButtonWithTitle:@"Login" andSize:CGRectMake(85, 200, 90, 35)];
        [login addTarget:self action:@selector(attemptLogin)
        forControlEvents:UIControlEventTouchUpInside];

    }

    return self;
}

- (UIButton) addButtonWithTitle: (NSString*) title andSize: (CGRect) size{

    button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.frame = size;
    [button setTitle:title forState:UIControlStateNormal];
    button.userInteractionEnabled = YES;
    [self addSubview:button];
    return button;
}


- (void)attemptLogin{

    NSString *user = usernameTxt.text;
    NSString *pass = passwordTxt.text;
    NSString *url = [[NSString alloc] initWithFormat:@"http://domain.com/login.php?username=%@&password=%@", user, pass];

    NSLog(@"%@", url);

}
于 2013-01-24T17:49:56.697 に答える
1

私はあなたが意味したと思います:

- (void) addButton: (UIButton*) button withTitle: (NSString*) title andSize: (CGRect) size{

    button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.frame = size;
    [button setTitle:title forState:UIControlStateNormal];
    button.userInteractionEnabled = YES;
     [button addTarget:self action:@selector(attemptLogin)
           forControlEvents:UIControlEventTouchUpInside];
    [self addSubview:button];
}

それも削除する必要があります。

     [login addTarget:self action:@selector(attemptLogin)
           forControlEvents:UIControlEventTouchUpInside];

init メソッドから。

于 2013-01-24T17:50:00.790 に答える