2013-01-24 50 views
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); 

     } 

沒有打印。

在此先感謝

+1

關鍵字:C通過值傳遞函數參數,而不是通過引用。 – 2013-01-24 17:49:08

回答

2

的問題主要是你allocting一個新的按鈕,因此不與你的登錄按鈕的工作,我已在你的代碼的分配,這應該工作:

//舊的清除代碼版本,請編輯

編輯

- (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); 

} 
+0

是登錄是IBOutlet。說實話,並不瞭解你的解釋。我將「登錄」按鈕作爲參數發送給該方法。爲什麼要刪除這條初始化? – OutOfBoundsException

+0

@PanayiotisNicolaou這很有趣,登錄按鈕已經在界面構建器(筆尖或故事板)上初始化,因此您將刪除您在界面上放置的任何內容,並且由於您以前添加了也會被擦除的目標操作,因此在執行初始化你基本上擦除了以前的所有屬性,你在技術上正在使用一個新的登錄按鈕:) – perrohunter

+0

要查看我的意思是在添加按鈕方法之前和之後打印指向同一按鈕的指針,您會注意到針對相同登錄的不同指針按鈕,使用NSLog(@「登錄按鈕指針%p」,登錄); – perrohunter

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

我會建議不要固定你的代碼是這樣的:直接使用loginaddButton可能會是更好的選擇。

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]; 
} 
0123從init方法

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

你也應該刪除。

+0

沒想到這麼快回復!你是對的,那就解決問題。但是,如果將來想要添加更多按鈕,我該怎麼辦?每個按鈕都會觸發attemptLogin。謝謝 :) – OutOfBoundsException

相關問題