2014-09-16 19 views
31

Có tùy chọn nào để ngừng hiển thị bàn phím biểu tượng cảm xúc trong iOS 8 không? Nó không có sẵn trong văn bản đầy đủ và an toàn nhưng đối với email thì nó ở đó. Nếu không thể vô hiệu hóa cách lấy các giá trị chuỗi từ biểu tượng cảm xúc?Làm thế nào để vô hiệu hóa bàn phím biểu tượng cảm xúc iOS 8?

+1

thể trùng lặp của [Làm thế nào để vô hiệu hóa bàn phím biểu tượng cảm xúc trong iOS 7?] (Http://stackoverflow.com/questions/24927351/ how-to-disable-the-emoji-keyboard-in-ios-7) –

Trả lời

82

Hãy thử điều này:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{   
    if ([textField isFirstResponder]) 
    { 
     if ([[[textField textInputMode] primaryLanguage] isEqualToString:@"emoji"] || ![[textField textInputMode] primaryLanguage]) 
     { 
      return NO; 
     } 
    } 
    return YES; 
} 

để biết thêm thấy here.

EDIT:

Bạn có thể ẩn biểu tượng cảm xúc từ bàn phím sử dụng mã này:

txtField.keyboardType=UIKeyboardTypeASCIICapable; 

EDIT:

Ẩn lựa chọn biểu tượng cảm xúc từ bàn phím sử dụng xây dựng giao diện.

enter image description here

+3

Một Gợi ý khác: Bạn có thể thiết lập trực tiếp từ Xcode/Interface Builder. – BastiBen

+1

ẩn trong IB là tốt đẹp nhất. Tôi thích nó. Cảm ơn. – Noundla

+1

Nếu biểu tượng cảm xúc được sao chép từ trường văn bản khác, việc kiểm tra này sẽ được thực hiện nếu chỉ các ký tự ASCII chấp nhận string.canBeConvertedToEncoding (NSASCIIStringEncoding), hoặc nếu chỉ cần biểu tượng cảm xúc sẽ bị xóa lib này có thể được sử dụng https://github.com/woxtu/NSString-RemoveEmoji –

16

này hoạt động trên iOS 7 và 8:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    // Disable emoji input 
    return [textField textInputMode] != nil; 
} 
+0

Điều duy nhất thực sự hoạt động mà không có phương pháp không dùng nữa! –

7

Các giải pháp mà làm việc cho tôi:

self.texField.keyboardType = UIKeyboardTypeASCIICapable; 

Bàn phím biểu tượng cảm xúc sẽ không có sẵn với KeyboardType đó. .

Nhưng nó bắt buộc phải kiểm tra các loại mỗi char thêm vào trong TextField, vì người dùng có thể sao chép một biểu tượng cảm xúc từ nơi khác sau đó dán nó vào

Đây là cách bạn có thể làm như vậy:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { 
    return [text canBeConvertedToEncoding:NSASCIIStringEncoding]; 
} 

Được cảnh báo rằng, khi tôi đọc trong một bài đăng khác, điều này cũng có thể ngăn người dùng sử dụng bàn phím với các ký tự đặc biệt, như ký tự Trung Quốc.

+1

đây phải là câu trả lời được chấp nhận vì mọi người vẫn có thể sao chép/dán biểu tượng cảm xúc với câu trả lời được chấp nhận ở trên – tettoffensive

7

Chỉ cần cập nhật các câu trả lời tuyệt vời trên cho bất cứ ai phải đối mặt với vấn đề tương tự như tôi:

  1. Một trường email thiết lập như keyboardType = .EmailAddress vẫn cho phép biểu tượng cảm xúc
  2. Bạn có thể có nhiều hơn một tình trạng mà bạn muốn để lọc
  3. Swift
  4. Ngăn chặn C & P

Đây là cách w e đã làm nó:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { 
    if !string.canBeConvertedToEncoding(NSASCIIStringEncoding){ 
     return false 
    } 
    //other conditons 
} 

Sửa

Okay giải pháp với NSASCIIStringEncoding là không tốt nếu bạn muốn cho phép một số ký tự cho các ngôn ngữ khác.

Một số chữ bị chặn với NSASCIIStringEncoding:

  • Tất cả các phiên bản khác của a: àáâäæãåā
  • Tất cả các phiên bản khác của e: èéêëēėę
  • Tất cả các phiên bản khác của o: ôöòóœøōõ

Sử dụng NSASCIIStringEncoding không phải là ý tưởng hay nếu bạn muốn hỗ trợ người dùng từ các quốc gia khác!

Tôi cũng đã cố gắng NSISOLatin1StringEncoding:

  • Blocked phiên bản của một: a
  • phiên bản bị chặn của e: Eee
  • phiên bản bị chặn của o: OEO

này là tốt hơn nhiều thông suốt.

Tôi cũng đã cố gắng NSISOLatin2StringEncoding:

  • phiên bản bị chặn của a: àæãåā
  • phiên bản bị chặn của e: EEEE
  • phiên bản bị chặn của o: òœøōõ

Tệ hơn nữa.

Edit2:

Sau đây dường như làm việc:

extension String { 
    func containsEmoji() -> Bool { 
     for i in self.characters { 
      if i.isEmoji() { 
       return true 
      } 
     } 
     return false 
    } 
} 

extension Character { 
    func isEmoji() -> Bool { 
     return Character(UnicodeScalar(0x1d000)) <= self && self <= Character(UnicodeScalar(0x1f77f)) 
      || Character(UnicodeScalar(0x1f900)) <= self && self <= Character(UnicodeScalar(0x1f9ff)) 
      || Character(UnicodeScalar(0x2100)) <= self && self <= Character(UnicodeScalar(0x26ff)) 
    } 
} 

Bây giờ chúng ta gọi là:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { 
    if string.containsEmoji() { 
     return false 
    } 
    //other conditons 
} 
1

Đây là phiên bản nhanh chóng.

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool { 
    if textView.isFirstResponder() { 
     if textView.textInputMode?.primaryLanguage == nil || textView.textInputMode?.primaryLanguage == "emoji" { 
      return false; 
     } 
    } 
    return true; 
} 
0

Trong Swift: - Nó sẽ hạn chế về quá khứ emoji trong TextView của mình và Chỉ cần thay đổi kiểu bàn phím để ascii khả năng

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool { 
    var result = Bool() 

      let disallowedCharacterSet1 = NSCharacterSet.symbolCharacterSet() 
      let replacementStringIsLegal = text.rangeOfCharacterFromSet(disallowedCharacterSet1) == nil 
      result = replacementStringIsLegal 


     let newLength = textView.text!.utf16.count + text.utf16.count - range.length 
     return newLength <= 300 && result // Bool 

} 
0

tôi muốn một câu trả lời cho Swift 3.0 mà sẽ làm việc trên shouldChangeTextInRange và đưa ra những điều sau đây thực sự đơn giản và có thể xử lý bất kỳ ngôn ngữ nào bạn ném vào nó (tôi bao gồm ảnh bằng tiếng Trung Quốc để minh họa).

Tuyên bố bảo vệ sẽ bỏ qua văn bản tùy chọn và câu lệnh trả về kiểm tra xem nó có rút ra giá trị thỏa mãn kiểm tra trimmingCharacters hay không. Nếu có một giá trị (nghĩa là nó không phải là một phần của ngôn ngữ đầu vào của thiết bị hiện tại), thì nó sẽ không trống, vì vậy phương thức trả về false và không cho phép ký tự được nhập vào.

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
    guard let text = (textField.text as NSString?)?.replacingCharacters(in: range, with: string) else { 
     return true 
    } 

    return text.trimmingCharacters(in: CharacterSet.alphanumerics).isEmpty 
} 

này dựa trên Apple CharacterSet.alphanumerics, do đó không cần phải duy trì và cập nhật một danh sách các nhân vật đã được phê duyệt, trừ khi bạn muốn thêm hoặc xoá các mục.

enter image description here

Yay cho ngôn ngữ bất khả tri!

Một ứng dụng phổ biến khác là dành cho email, vì bàn phím email mặc định cung cấp biểu tượng cảm xúc. Tôi tìm thấy với một sửa đổi nhỏ, tôi đã có thể hạn chế các ký tự đến những gì tôi muốn cho một địa chỉ email để làm việc.

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
    guard let text = (textField.text as NSString?)?.replacingCharacters(in: range, with: string) else { 
     return true 
    } 

    return text.trimmingCharacters(in: CharacterSet.alphanumerics).isEmpty || 
    !text.characters.filter { $0 == "@" || $0 == "." }.isEmpty 
} 
5

Trong nhanh chóng 3,0

textField.keyboardType = .asciiCapable

2

Swift 3.1 Giải pháp

// MARK: - Text Field Delegate 

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
     return textField.textInputMode != nil 
    } 
0

Dù Câu hỏi là siêu cũ, 012.Tôi đã Đối mặt với cùng một vấn đề và đã có thể giải quyết nó bằng thời gian trang này nạp bởi lừa nhỏ này:

Đơn giản chỉ cần chọn "ASCII Capable" hoặc "Số và punctuations" trong giao diện Builder Xcode 8.2.1

enter image description here enter image description here

Output là Không Emoji Keyboard = D

enter image description here

tôi chắc chắn rằng nó sẽ giúp người =)

+0

Vui lòng không thêm [cùng câu trả lời cho nhiều câu hỏi] (http://meta.stackexchange.com/questions/104227/is -it-chấp nhận-để-thêm-một-trùng-trả-cho-nhiều câu hỏi). Trả lời câu trả lời hay nhất và gắn cờ phần còn lại dưới dạng bản sao, khi bạn kiếm đủ danh tiếng. Nếu nó không phải là bản sao, hãy điều chỉnh bài đăng thành câu hỏi và gắn cờ để hủy xóa. –

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