2012-07-16 4 views
0

У меня есть текстовое поле внизу моего представления. Когда вы нажимаете для редактирования, клавиатура закрывает его, и вы не можете видеть, что вы печатаете. Я хочу создать метод, который будет перенастраивать представление всякий раз, когда это текстовое поле редактируется.Назначение метода UITextField в коде

Если бы у меня было текстовое поле, объявленное через построитель интерфейсов, то я знаю, что все, что мне нужно было бы сделать, - это связать (ctrl click then drag). Но у меня есть текстовое поле, объявленное в коде, поэтому мне интересно, как назначить ему метод.

псевдо-код, что я хотел бы сделать:

if (the text field is currently being edited){ 
    call method: adjust view 
} 

ответ

3

Реализовать UITextFieldDelegate в ваших .h как так:

@interface ShippingInfoViewController : UIViewController < UITextFieldDelegate>

и убедитесь, чтобы установить делегат вашего TextField на self

Тогда у вас есть доступ ко многим методам, например,

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

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

-(BOOL)textFieldShouldReturn:(UITextField *)textField{

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

и многие другие.

apple reference

+0

в моем.ч файла я мой интерфейс объявлен следующим образом '@interface SecondDetailViewController: UIViewController ' когда я установить делегат текстовое поле, чтобы сам он выходит из строя во время выполнения каких-либо идеи? – BloonsTowerDefence

+0

Как вы это делаете? это текстовое поле в раскадровки или в коде? Обычно я делаю это в раскадровки, управляя щелчком (или щелчком правой кнопки мыши) от поля до владельца файла (желтый квадрат внизу) и выбора делегата. в коде он должен быть просто 'textField.delegate = self;' – jacerate

+0

Я нашел проблему; Я назначал делегата, прежде чем я выделил. Спасибо за ваш ответ. – BloonsTowerDefence

0

Вы должны назначить делегатом на текстовом:

[textView setDelegate: self] 

где я полагаю, что self ваш контроллер представления, который должен соответствовать UITextViewDelegate protocol. Текстовое представление будет вызывать textViewShouldBeginEditing:/textViewWillBeginEditing всякий раз, когда он начинает цикл редактирования.

+0

Это просто повторяет то, что уже было сказано – jacerate

+0

@ user1458968 Что очень верно; но как я это узнаю? Мой ответ был первым :-) Nevermind. – Dirk

1

Когда вы создаете текстовое поле, установите его делегат на себя.

[textField setDelegate:self]; 

затем реализовать методы делегата

- (void)textFieldDidBeginEditing:(UITextField *)textField { 
    //adjust view here 
} 

- (void)textFieldDidEndEditing:(UITextField *)textField { 
    //move view back to correct position here 
} 

Вы также можете зарегистрироваться для UIKeyboardWillShow/UIKeyboardWillHide или UIKeyboardDidShow/UIKeyboardDidHide сообщений и осуществлять функции для этого, а также.

0

использовать следующие функции:

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

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

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; 
} 


- (void)keyboardWillShow:(NSNotification *)notification 
{ 
    [self moveTextViewForKeyboard:notification up:YES]; 
} 


- (void)keyboardWillHide:(NSNotification *)notification 
{ 
    [self moveTextViewForKeyboard:notification up:NO]; 
} 


- (void)moveTextViewForKeyboard:(NSNotification*)notification up:(BOOL)up { 
    NSDictionary *userInfo = [notification userInfo]; 
    NSTimeInterval animationDuration; 
    UIViewAnimationCurve animationCurve; 
    CGRect keyboardRect; 

    [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve]; 
    animationDuration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]; 
    keyboardRect = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; 
    keyboardRect = [self.view convertRect:keyboardRect fromView:nil]; 

    [UIView beginAnimations:@"ResizeForKeyboard" context:nil]; 
    [UIView setAnimationDuration:animationDuration]; 
    [UIView setAnimationCurve:animationCurve]; 

if (up == YES) { 
    CGFloat keyboardTop = keyboardRect.origin.y; 
    CGRect newTextViewFrame = self.noteTextView.frame; 
    originalTextViewFrame = self.noteTextView.frame; 
    newTextViewFrame.size.height = keyboardTop - self.noteTextView.frame.origin.y - 10; 

    self.noteTextView.frame = newTextViewFrame; 
} else { 
    // Keyboard is going away (down) - restore original frame 
    self.noteTextView.frame = originalTextViewFrame; 
} 

    [UIView commitAnimations]; 
} 

Использование статической переменной для originalTextViewFrame:

static CGRect originalTextViewFrame; 
Смежные вопросы