2012-03-03 7 views
1

数字キーパッド付きの小さなUITextFieldを含む小さなプロジェクトがあります。キーボードが表示されたら、ユーザーがキーボードを閉じるためのサブビューとしてボタンを追加します。アプリケーションがバックグラウンドで実行されて戻ってきたときにUIButtonが消えます

しかし、キーボードがアクティブで、アプリケーションを閉じると、追加したボタンは、アプリケーションを再起動すると消えます。

これは、ボタンを追加するために使用するコードです(xibに設定された「完了済み」ボタン)。これは、マルチタスクを使用して、非アクティブのままです。あなたは- (void)keyboardWillShowでオブザーバを削除しているので、

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

+0

はハイテク、答えに感謝しかし、私はまだ私のボタンをlossing。 –

1

にこのライン[[NSNotificationCenter defaultCenter] removeObserver:self];を入れてみてください、あなたの問題を考えます - 問題を抱えている、または抱えている可能性のある皆さん - これはコードです: 注:ボタン自体は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やストーリーボードに何かが指定されているかどうかを心配する必要はありません。 –

関連する問題