Общие проблемы разработки iPhone с UITextField и UITextViews - PullRequest
3 голосов
/ 05 апреля 2011

Я пользуюсь iPhone SDK за последние 2 месяца. Одна вещь, которую я заметил, это то, что SDK не очень хорош с точки зрения ввода текста.

Каждый раз, когда я использую UITextView и UITextField, вот общие проблемы, с которыми мне всегда приходится сталкиваться:

  1. Клавиатура перекрывает ввод текста.
  2. Нет способа скрыть клавиатуру по умолчанию.

Хотя я знаю, как справиться с обоими, во-первых, я прокручиваю весь вид при вызове уведомления на клавиатуре и, чтобы скрыть, я знаю resignFirstResponder. Вот как я с этим справляюсь.

Но я ненавижу то, как я работаю !!

Я не хочу копировать один и тот же код на все файлы .h и .m.

Мне нравится, как клавиатура Safari работает как панель инструментов.

Будь добр, посоветуй мне, есть ли какой-нибудь повторно используемый класс, который я могу использовать в своих проектах для решения проблемы. Я уверен, что должно быть какое-то многократное решение этой проблемы, так как это общая проблема, с которой сталкивался каждый разработчик!

Ответы [ 3 ]

0 голосов
/ 23 ноября 2011

Хотя это может быть болезненно, как Apple может кодировать эту функциональность для учета каждого возможного варианта использования?

Вместо этого вам нужно выяснить, каковы ваши общие случаи использования, а затем запрограммировать соответственно. Это объектно-ориентированное программирование - повторное использование кода приветствуется! Но если вы копируете и вставляете между проектами, вы делаете это неправильно.

Например, для меня очень распространено делать это с текстовыми вставками в UITableViews, которые не являются частью контроллера UITableView. Очевидно, что клавиатура становится проблемой, которую мне нужно исправить.

Итак, я пишу необходимый код, чтобы исправить это каждый раз? Нет, я написал это один раз в подклассе UITableView, и я использую этот класс во всех своих проектах.

Помните, хорошие программисты ленивы и будут использовать доступные им инструменты, чтобы не писать одно и то же снова и снова. Создайте свой собственный класс, категории и т. Д., Чтобы справиться с общими проблемами, и у вас все будет хорошо.

0 голосов
/ 21 июня 2013
Textfield's  and scrolling view in up/down's. using NSNotificationCenter code.

Write code in "viewDidLoad":


    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector (keyboardDidShow:)
                                                 name: UIKeyboardDidShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector (keyboardDidHide:)
                                                 name: UIKeyboardDidHideNotification object:nil];

add to code in delegate methods:


-(void) keyboardDidShow: (NSNotification *)notif 
{  [calendarView removeFromSuperview];
    // If keyboard is visible, return
    if (keyboardVisible) 
    {
        NSLog(@"Keyboard is already visible. Ignore notification.");
        return;
    }

    // Keyboard is now visible
    keyboardVisible = YES;
}

-(void) keyboardDidHide: (NSNotification *)notif 
{  [calendarView removeFromSuperview];
    // Is the keyboard already shown
    if (!keyboardVisible) 
    {
        NSLog(@"Keyboard is already hidden. Ignore notification.");
        return;
    }

    if (up == 1) {

        up = 0;
        [self down];
    }
    // Keyboard is no longer visible
    keyboardVisible = NO;

}

add to remaining default methods:


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

    if(textField == txt_Zip){
        NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];

        return !([newString length] > 6);
    }
    else {
        return YES;
    }

}
-(void) touchesBegan :(NSSet *) touches withEvent:(UIEvent *)event
{

    if(up==1)
    {
        up=0;
        [self down];
    } 
    [txtMake_Model resignFirstResponder];
    [txtSerial_Vin resignFirstResponder];
    [txtDaysPerWeek resignFirstResponder];
    [txtAnnualMiles resignFirstResponder];
    [txtPurchasedDate resignFirstResponder];
    [txtInterestLocation resignFirstResponder];
    [txtInterestSequence resignFirstResponder];
    [txtInterestName resignFirstResponder];
    [txt_City resignFirstResponder];
    [txtAddress1 resignFirstResponder];
    [txtAddress2 resignFirstResponder];
    [txt_Zip resignFirstResponder];
    [txtAdditionalInfo resignFirstResponder];
    [txtVehicleNumber resignFirstResponder];
    [txtMilesToWork resignFirstResponder];
    [txtCostNew resignFirstResponder];

    [super touchesBegan:touches withEvent:event ];
}

//- (BOOL)textFieldShouldReturn:(UITextField *)textField              // called when 'return' key pressed. return NO to ignore.
//{
//  [textField resignFirstResponder];
//  return YES;
//}
- (BOOL)textFieldShouldReturn:(UITextField *)textField{


    [textField resignFirstResponder];

    if (up==1) {

        up =0;
        [self down];
    }


    return YES ;


}

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


    if(textField == txtInterestSequence)
    {   if(up==0){up=1;[self moveUp];}

    }else if(textField == txtInterestName)
    {  if(up==0){up=1;[self moveUp];}

    }else if(textField == txtAddress1)
    {   if(up==0){up=1;[self moveUp];}

    } else if(textField == txtAddress2)
    {   if(up==0){up=1;[self moveUp];}

    }  else if(textField == txt_City)
    {  if(up==0){up=1;[self moveUp];}

    }  else if(textField == txt_Zip)
    {  if(up==0){up=1;[self moveUp];}

    }  else if(textField == txtAdditionalInfo)
    {  if(up==0){up=1;[self moveUp];}

    } else if(textField == txtMilesToWork)
    {  if(up==0){up=1;[self moveUp];}

    } else if(textField == txtCostNew)
    {   if(up==0){up=1;[self moveUp];}

    }   

}


-(void)moveUp{
    // up=1;
    [UIView beginAnimations:nil context:nil];
    self.view.center=CGPointMake(self.view.center.x, self.view.center.y-200);
    [UIView commitAnimations];

}
-(void)down{
    [UIView beginAnimations:nil context:nil];
    self.view.center=CGPointMake(self.view.center.x, self.view.center.y+200);
    [UIView commitAnimations];
    //  up=0;
}
0 голосов
/ 23 ноября 2011

UITableViewController автоматически изменит свой размер UITableView, когда клавиатура будет показана / скрыта.Если ваш пользовательский интерфейс имеет табличный дизайн, вы можете разместить свои элементы управления внутри UITableView, чтобы вам не пришлось реализовывать изменение размера вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...