2012-03-03 86 views
1

我有一個小型項目,其中包含幾個帶數字小鍵盤的UITextFields。當顯示鍵盤時,我添加一個按鈕作爲用戶的子視圖來關閉鍵盤。當我的應用程序從後臺運行返回時,UIButton消失

但是,如果鍵盤是主動和我關閉應用程序,我已經添加的按鈕將在重新推出的應用程序消失。 (該應用程序處於非活動狀態,通過多任務處理,因此不能完全退出。)

這是使用添加按鈕(在廈門國際銀行配置了我的「完成」按鈕)的代碼IM。

- (void)viewDidLoad 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self 
    selector:@selector(keyboardWillShow)name:UIKeyboardWillShowNotification object:nil]; 

    [super viewDidLoad]; 
} 

- (void)keyboardWillShow{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 

    // We must perform on delay (schedules on next run loop pass) for the keyboard subviews to be present. 
    [self performSelector:@selector(addHideKeyboardButtonToKeyboard) withObject:nil afterDelay:0]; 
} 

- (void)addHideKeyboardButtonToKeyboard{ 
    // Locate non-UIWindow. 
    doneButton.hidden=NO; 

    UIWindow *keyboardWindow = nil; 
    for (UIWindow *testWindow in [[UIApplication sharedApplication] windows]) { 
     if (![[testWindow class] isEqual:[UIWindow class]]) { 
      keyboardWindow = testWindow; 
      break; 
     } 
    } 
    if (!keyboardWindow) return; 

    // Locate UIKeyboard. 
    UIView *foundKeyboard = nil; 
    for (UIView __strong *possibleKeyboard in [keyboardWindow subviews]) { 

     // iOS 4 sticks the UIKeyboard inside a UIPeripheralHostView. 
     if ([[possibleKeyboard description] hasPrefix:@"<UIPeripheralHostView"]) { 
      possibleKeyboard = [[possibleKeyboard subviews] objectAtIndex:0]; 
     }                     

     if ([[possibleKeyboard description] hasPrefix:@"<UIKeyboard"]) { 
      foundKeyboard = possibleKeyboard; 
      break; 
     } 
    } 

    if (foundKeyboard) { 
     [doneButton setImage:[UIImage imageNamed:@"doneupHeb.png"] forState:UIControlStateNormal]; 
     [doneButton setImage:[UIImage imageNamed:@"donedownHeb.png"] forState:UIControlStateHighlighted]; 
     doneButton.frame = CGRectMake(-1, 163, 106, 53); 
     [foundKeyboard addSubview:doneButton]; 
     // Add the button to foundKeyboard. 
    } 

} 

-(void)textFieldDidEndEditing:(UITextField *)textField{ 
    [loan resignFirstResponder]; 
    [YearCycle resignFirstResponder]; 
    [prime resignFirstResponder]; 
    [MothlyReturn resignFirstResponder]; 

    [doneButton removeFromSuperview]; 
    doneButton = nil; 
} 


- (void)textFieldDidBeginEditing:(UITextField *)textField{ 

    textField.delegate=self; 
    //editingField = textField; 

    if ([prime isFirstResponder]||[MothlyReturn isFirstResponder]){ 

     scroll.contentOffset = CGPointMake(0, 166); 
    } 
// if ([YearCycle isFirstResponder]){ 
     // scroll.contentOffset = CGPointMake(0, 200); 

} 

- (IBAction)closeNumpad:(id)sender{ 

    [loan resignFirstResponder]; 
    [YearCycle resignFirstResponder]; 
    [prime resignFirstResponder]; 
    [MothlyReturn resignFirstResponder]; 

    scroll.contentOffset = CGPointMake(0, 0); 
    doneButton.hidden=YES; 
} 

回答

0

我認爲你的問題,因爲你是在- (void)keyboardWillShow消除觀察者..嘗試把此行[[NSNotificationCenter defaultCenter] removeObserver:self];-(void)viewDidUnload

+0

您好,感謝的答案,但我仍然損耗我的按鈕。 – 2012-03-04 14:41:59

1

我從網站上的其他問題一點幫助解決了這一問題 - 對於你們所有有或將有問題的人 - 這是代碼: 請注意:按鈕本身是在xib文件中設計的,而不是在代碼中。

.h文件:

BOOL firstTime; 
BOOL add; 
BOOL keyboardOpened; 
IBOutlet UIButton *doneButton; 

.m文件:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    firstTime = TRUE; 
    add = TRUE; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil]; // Do any additional setup after loading the view, typically from a nib. 
} 

- (void)viewDidUnload 
{ 

    // [[NSNotificationCenter defaultCenter] removeObserver:self]; 

    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    // Return YES for supported orientations 
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); 
} 

- (void)addButtonToKeyboard { 
    // create custom button 
    /* UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    doneButton.frame = CGRectMake(0, 163, 106, 53); 
    doneButton.adjustsImageWhenHighlighted = NO; 
    [doneButton setImage:[UIImage imageNamed:@"DoneUp.png"] forState:UIControlStateNormal]; 
    [doneButton setImage:[UIImage imageNamed:@"DoneDown.png"] forState:UIControlStateHighlighted]; 
    doneButton.tag = 3; 
    [doneButton addTarget:self action:@selector(doneButton:) forControlEvents:UIControlEventTouchUpInside];*/ 
    // locate keyboard view 
    UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1]; 
    UIView* keyboard; 
    for(int i=0; i<[tempWindow.subviews count]; i++) { 
     keyboard = [tempWindow.subviews objectAtIndex:i]; 
     // keyboard found, add the button 
     if ([[keyboard description] hasPrefix:@"<UIPeripheralHostView"] == YES && add){ 
      doneButton.frame = CGRectMake(-1, 163, 106, 53); 
      [keyboard addSubview:doneButton]; 

     }  
    } 
} 

- (void)removeButtonFromKeyboard 
{ 
    // locate keyboard view 
    UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1]; 
    UIView* keyboard; 
    for(int i=0; i<[tempWindow.subviews count]; i++) { 
     keyboard = [tempWindow.subviews objectAtIndex:i]; 
     // keyboard found, remove the button 
     if([[keyboard description] hasPrefix:@"<UIPeripheralHost"] == YES) [[keyboard viewWithTag:3] removeFromSuperview]; 
    } 
} 

- (IBAction)doneButton:(id)sender { 
    [loan resignFirstResponder]; 
    [YearCycle resignFirstResponder]; 
    [ageOfCeo resignFirstResponder]; 
    [YearofBusiness resignFirstResponder]; 
    scroll.contentOffset = CGPointMake(0, 0); 

    if (![[[UIDevice currentDevice] model] isEqualToString:@"iPad"] && ![[[UIDevice currentDevice] model] isEqualToString:@"iPad Simulator"]) 
    { 
     [self removeButtonFromKeyboard]; 
     firstTime = TRUE; 
    } 
} 

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField { 
    [theTextField resignFirstResponder]; 
    return YES; 
} 

- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    if ([ageOfCeo isFirstResponder]||[YearofBusiness isFirstResponder]){ 

     scroll.contentOffset = CGPointMake(0, 166); 
    } 

    // firstResponder = textField; 
} 

- (void)keyboardDidShow:(id)sender 
{ 
    if (![[[UIDevice currentDevice] model] isEqualToString:@"iPad"] && ![[[UIDevice currentDevice] model] isEqualToString:@"iPad Simulator"]) 
    { 
     NSLog(@"%@",[[UIDevice currentDevice] model]); 
     [self addButtonToKeyboard]; 
     keyboardOpened = TRUE; 
    } 
} 

- (void)textFieldDidEndEditing:(UITextField *)textField 
{ 

    if (![[[UIDevice currentDevice] model] isEqualToString:@"iPad"] && ![[[UIDevice currentDevice] model] isEqualToString:@"iPad Simulator"]) 
    { 
     [self removeButtonFromKeyboard]; 
     keyboardOpened = FALSE; 
    } 
} 
+0

如果它是IBOutlet,則不必擔心在xib或故事板中指定何時指定了某些內容。 – 2012-03-04 21:33:19

相關問題