2012-03-06 42 views
8

Tôi mới dùng Objective-C và tôi đang tìm cách giới hạn người dùng chuyển từ phần bảng chữ cái của bàn phím thông thường sang bên số/dấu chấm câu. Điều này đang được nói, tôi muốn vô hiệu hóa nút trên bàn phím thực hiện chuyển đổi. Có lẽ tôi đang đưa vào các thông số tìm kiếm sai, nhưng tôi đang tìm thấy ít trên Google và thậm chí ít hơn trong sách tham khảo của tôi. Làm thế nào tôi sẽ thực sự vô hiệu hóa một nút trên bàn phím iOS? Với các ký tự alpha/số/dấu chấm câu, điều này có thể dễ dàng thực hiện bằng cách bỏ qua các ký tự được nhập, nhưng nút chuyển đổi giữa các phần bàn phím sẽ thực hiện hành động trái ngược với trả về một ký tự.Vô hiệu hóa các phím trên bàn phím

Cảm ơn sự giúp đỡ của bạn!

Trả lời

4

Bạn thực sự có thể thêm và loại bỏ các nút mặc định UIKeyboard

Có một số công thức nấu ăn trên Internet như thế này: http://www.iphonedevsdk.com/forum/iphone-sdk-development/6573-howto-customize-uikeyboard.html và như thế này: http://www.iphonedevsdk.com/forum/iphone-sdk-development/6275-add-toolbar-top-keyboard.html

Những bài viết cho bạn thấy làm thế nào để thêm một nút, tuy nhiên cùng một nguyên tắc có thể được sử dụng để loại bỏ.

Dưới đây tôi sẽ chỉ cho bạn một bộ sưu tập của một trong những giải pháp:

//The UIWindow that contains the keyboard view - 
//It some situations it will be better to actually 
//iterate through each window to figure out where the keyboard is, 
// but In my applications case 
//I know that the second window has the keyboard so I just reference it directly 
// 
UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] 
//      objectAtIndex:1]; 

//Because we cant get access to the UIKeyboard throught the SDK we will 
// just use UIView. 
//UIKeyboard is a subclass of UIView anyways 
UIView* keyboard; 

//Iterate though each view inside of the selected Window 
for(int i = 0; i < [tempWindow.subviews count]; i++) 
{ 
    //Get a reference of the current view 
    keyboard = [tempWindow.subviews objectAtIndex:i]; 

    //Check to see if the className of the view we have 
    //referenced is "UIKeyboard" if so then we found 
    //the keyboard view that we were looking for 
    if([[keyboard description] hasPrefix:@"<UIKeyboard"] == YES) 
    { 
     // Keyboard is now a UIView reference to the 
     // UIKeyboard we want. From here we can add a subview 
     // to th keyboard like a new button 

     //Do what ever you want to do to your keyboard here... 
    } 
} 
+0

Cảm ơn bạn! Tôi sẽ phải xem xét điều đó. Đến từ một nền Java và C/C++, đôi khi cách Objective-C thực hiện những điều có vẻ hơi, một chút, kỳ lạ. – alownx

1

tôi thực hiện một giải pháp gọn gàng. Bí quyết là đặt một hình ảnh khóa bị vô hiệu hóa lên trên bàn phím.

Để làm điều này

  1. Chạy giả lập (quy mô 100%) và màn hình lấy nội dung bạn muốn (trong trường hợp của tôi, đây là một nút Done khuyết tật ở cuối dưới bên phải)
  2. đặt hình ảnh này trên đầu của bàn phím

Lưu ý rằng bàn phím được đặt trong một UIWindow riêng biệt (kể từ iOS5 tôi tin) và do đó, bạn sẽ cần phải làm như sau

+ (void) addSubviewToTop:(UIView *)view { 
    int count = [[[UIApplication sharedApplication] windows] count]; 
    if(count <= 0) { 
     warn(@"addSubviewToTop failed to access application windows"); 
    } 
    UIWindow *top_window = [[[UIApplication sharedApplication] windows] objectAtIndex:count-1]; 
    [top_window addSubview:view]; 
    [top_window bringSubviewToFront:view]; 
} 
0

Tôi không chắc liệu SDK đã thay đổi sao cho câu trả lời của @ ppaulojr không còn hoạt động, hoặc nếu tôi có những thứ được thiết lập lạ trên hệ thống của mình, nhưng với các tinh chỉnh sau tôi có thể làm việc đó!

Các bài đăng được liên kết trong câu trả lời của @ ppaulojr rất tuyệt vời (http://www.iphonedevsdk.com/forum/iphone-sdk-development/6573-howto-customize-uikeyboard.htmlhttp://www.iphonedevsdk.com/forum/iphone-sdk-development/6275-add-toolbar-top-keyboard.html) và chúng đã giúp tôi làm việc này.

Dường như chế độ xem bàn phím thực tế hiện được nhúng dưới dạng chế độ xem phụ trong một số cấu trúc khung nhìn UIKeyboard lớn hơn nên có một chút đệ quy. Tôi có này để làm việc:

-(void) findKeyboard { 

    NSArray* windows = [[UIApplication sharedApplication] windows]; 

    for (int i = 0; i < [windows count]; i++) { 

     UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] 
                  objectAtIndex:i]; 

     for(UIView *subView in [tempWindow subviews]) 
     { 
      [self checkViews:subView]; 
     } 
    } 
} 

-(void)checkViews:(UIView *)inView 
{ 
    for(UIView *keyboard in inView.subviews) 
    { 
     NSLog(@"ViewName: %@", [keyboard description]); // Which view are we looking at 

     //Check to see if the className of the view we have 
     //referenced is "UIKeyboard" if so then we found 
     //the keyboard view that we were looking for 
     if([[keyboard description] hasPrefix:@"<UIKeyboard"] == YES) 
     { 
      // Keyboard is now a UIView reference to the 
      // UIKeyboard we want. From here we can add a subview 
      // to th keyboard like a new button 

      //Do what ever you want to do to your keyboard here... 


      break; 
     } 

     // Recurse if not found 
     [self checkViews:subView]; 
    }  
} 

Tôi cũng phát hiện ra rằng nơi tốt nhất để gọi chức năng này là từ -(void)textViewDidBeginEditing:(UITextView *)textView như vậy:

- (void)textViewDidBeginEditing:(UITextView *)textView { 
    NSLog(@"textViewDidBeginEditing"); 

    [self findKeyboard]; 

} 

này không những sửa đổi bàn phím ngay sau khi bàn phím được thêm vào cửa sổ, nhưng trước khi nó thực sự xuất hiện, để toàn bộ thời gian nó tăng từ phía dưới, nó sẽ bị sửa đổi.

Các vấn đề liên quan