iPhone开发UITextField和UITextView的常见问题

iPhone开发UITextField和UITextView的常见问题,iphone,objective-c,uitextfield,uitextview,Iphone,Objective C,Uitextfield,Uitextview,过去两个月我一直在使用iphonesdk。 我观察到的一件事是SDK在获取文本输入方面不是很好 每次我使用UITextView和UITextField时,以下是我必须经常处理的常见问题: 键盘与文本输入重叠 没有隐藏键盘的默认方式 虽然我知道如何处理这两个问题,但首先,我在键盘上滚动显示通知调用的整个视图,并隐藏我知道辞职的FirstResponder。 我是这样处理的 但是我讨厌我的工作方式 我不想在所有的.h和.m文件中复制相同的代码 我喜欢safari键盘像工具栏一样工作的方式 如果在我的

过去两个月我一直在使用iphonesdk。 我观察到的一件事是SDK在获取文本输入方面不是很好

每次我使用UITextView和UITextField时,以下是我必须经常处理的常见问题:

  • 键盘与文本输入重叠
  • 没有隐藏键盘的默认方式
  • 虽然我知道如何处理这两个问题,但首先,我在键盘上滚动显示通知调用的整个视图,并隐藏我知道辞职的FirstResponder。 我是这样处理的

    但是我讨厌我的工作方式

    我不想在所有的.h和.m文件中复制相同的代码

    我喜欢safari键盘像工具栏一样工作的方式

    如果在我的项目中有任何可重用的类可以用来解决这个问题,请告诉我。
    我相信应该有一些可重用的解决方案来解决这个问题,因为这是每个开发人员都必须看到的常见问题

    当显示/隐藏键盘时,
    UITableView控制器将自动调整其
    UITableView
    的大小。如果您的UI具有类似表格的设计,您可以将控件放在
    UITableView
    中,这样您就不必手动调整大小。

    虽然这可能是一件痛苦的事情,但苹果怎么可能将该功能编码为每个可能的用例

    相反,您需要弄清楚您的常见用例是什么,然后进行相应的编程。这是面向对象的编程-鼓励代码重用!但是,如果您在项目之间进行复制和粘贴,那么您就做错了

    例如,对于我来说,在UITableView中输入不属于UITableView控制器的文本是非常常见的。显然,键盘成了我需要解决的问题

    那么,我是否每次都要编写必要的代码来修复它?不,我曾经在UITableView子类中编写过一次,并且我在所有项目中都使用该类


    记住,好的程序员是懒惰的,他们会使用可用的工具来避免反复编写相同的东西。创建您自己的类、类别等来处理常见问题,您就会没事。

    有一种方法可以隐藏键盘-告诉textField退出它的第一响应者。如果您有两个,您可以将它们保存在某个数组中,并在该数组上调用makeObjectsPerformSelector方法,并将其传递给@selector(resignFirstResponder)选择器来执行。这将为您节省一些迭代和查找这些文本字段的工作。
    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;
    }