แสดงระบบคีย์บอร์ด Emoji ตามค่าเริ่มต้นบน iOS 13


17

สารละลาย

นี่คือวิธีการแก้ปัญหาอย่างเต็มรูปแบบ /สำหรับปัญหานี้โปรดโหวตให้คำตอบของ Blld เช่นกันเพราะนี่เป็นข้อมูลสำคัญที่จำเป็น!

ชื่ออื่นเพื่อช่วยในการค้นหา

  • แสดงคีย์บอร์ด Emoji เป็นค่าเริ่มต้นสำหรับวัตถุ UIKeyInput (ใน iOS 13)
  • บังคับให้ iOS 13 แสดงแป้นพิมพ์ Emoji
  • การตั้งค่าเป็นUITextInputMode.primaryLanguageอิโมจิ
  • ตั้งแป้นคีย์บอร์ดเป็นแบบอิโมจิ

ก่อนที่จะกลับมาUITextInputModeพร้อมกับprimaryLanguage"อีโมจิ" ที่เท่ากับจะเริ่มต้นเพื่อแสดงคีย์บอร์ด Emoji (ดูภาพด้านล่าง)

ภาพหน้าจอคีย์บอร์ด Emoji

รหัสตัวอย่างกลับมา UITextInputMode"อิโมจิ"

//
//  ViewController.swift
//  Keyboard Info
//
//  Created by Richard Stelling on 30/09/2019.
//  Copyright © 2019 Richard Stelling. All rights reserved.
//

import UIKit

class TestButton: UIButton, UIKeyInput {

    var hasText: Bool = true

    func insertText(_ text: String) { print("\(text)") }

    func deleteBackward() {}


    override var canBecomeFirstResponder: Bool { return true }

    override var canResignFirstResponder: Bool { return true }

    override var textInputMode: UITextInputMode? {
        for mode in UITextInputMode.activeInputModes {
            if mode.primaryLanguage == "emoji" {
                return mode
            }
        }
        return nil
    }
}

การเรียกใช้รหัสนี้บน iOS 12 จะเป็นการตั้งค่าแป้นพิมพ์เป็นระบบ Emoji Keyboard แต่บน iOS 13 จะไม่มีผลกระทบใด ๆ

นี่เป็นข้อบกพร่องที่รู้จักหรือไม่? มีวิธีแก้ปัญหาหรือไม่?

อัพเดท

  • ร้องขอโดย@Navillusรายการทั้งหมดของ "โหมดอินพุตที่ใช้งาน" คือ; "en-GB", "emoji"
  • ทดสอบและยืนยันเมื่อวันที่; 13.0, 13.1, 13.1.1, 13.1.2 และ 13.2 (เมล็ด 1)

สิ่งที่ตลก: ฉันสามารถเรียกใช้รหัสนี้ได้สำเร็จบนตัวจำลอง แต่ไม่ใช่ในอุปกรณ์ iOS 13 สำหรับทั้งคู่ ตอนนี้ฉันสนใจ
Marina Aguilar

ทำงานให้ฉันในการจำลองด้วย @rjstelling รายการ activeInputModes ทั้งหมดในอุปกรณ์ของคุณคืออะไร คุณสามารถตรวจสอบกับสิ่งนี้: พิมพ์ (UITextInputMode.activeInputModes.map ({(m) -> สตริงที่ส่งคืน m.primaryLanguage ?? ""}))
Navillus

@Navillus - คำตอบในคำถาม "en-GB" และ "emoji"
rjstelling

1
ตอนนี้ได้รับการแก้ไขแล้วใน iOS 13.4 / Xcode 11.4
Stephen

คำตอบ:


9

ฉันยื่นเรดาร์เรื่องนี้สำหรับ iOS 13 เพราะฉันมีแอพสองภาษาญี่ปุ่น / อังกฤษ บางฟิลด์เป็นภาษาญี่ปุ่นและภาษาอังกฤษบางส่วนดังนั้นจึงเหมาะสมที่จะนำเสนอประเภทแป้นพิมพ์ที่ถูกต้องให้กับผู้ใช้แทนที่จะทำให้พวกมันพลิกกลับไปกลับมา 20 ครั้ง

มีวิธีแก้ไขปัญหานี้และนั่นก็คือหลังจากที่ UIKit เรียก 'textInputMode' ในเธรดหลักคุณสามารถทำสิ่งนี้ได้:

// has to be done after the textInputMode method is called
if #available(iOS 13, *) {
    textField.keyboardType = textField.keyboardType
} 

สิ่งนี้บังคับให้คีย์บอร์ดโหลดซ้ำหลังจากตอบด้วย textInputMode ที่คุณต้องการ ฉันแจ้งให้พวกเขาทราบถึงข้อผิดพลาดและวิธีแก้ไขปัญหาเพื่อให้ได้พฤติกรรมที่ถูกต้อง

ดังนั้นใน iOS 13.1 ข้อผิดพลาดไม่ได้รับการแก้ไข แต่พวกเขาบล็อกวิธีแก้ปัญหาของฉัน

ดี ฉันจะไม่รายงานข้อผิดพลาดใด ๆ กับพวกเขาอีกครั้ง หากฉันพบวิธีแก้ปัญหาฉันจะใช้มัน

ดังนั้นดูเหมือนว่าตอนนี้พวกเขาจะปิดการใช้งานคุณลักษณะนี้อย่างเงียบ ๆ และมันก็เป็นฟีเจอร์นี่คือจุดประสงค์ของการเรียกใช้เมธอดนี้อย่างแท้จริงเพื่อค้นหาว่าโหมดการป้อนข้อมูลใดที่ควรนำเสนอแก่ผู้ใช้

มันยังใช้งานได้ดีถ้าคุณมีภาษาอื่นและต้องการเลือกภาษาอังกฤษ

ดังนั้นหากผู้ใช้ของฉันตั้งค่าภาษาญี่ปุ่นเป็นตัวเลือกแป้นพิมพ์ฉันสามารถบังคับให้ใช้แป้นพิมพ์ภาษาอังกฤษได้ ไม่ใช่วิธีอื่น ๆ ความพยายามใด ๆ ที่จะทำให้โหมดการป้อนข้อมูลภาษาญี่ปุ่นเป็นแบบแป้นพิมพ์ภาษาอังกฤษ

แก้ไข:

มีเส้นทางอื่นที่คุณสามารถแก้ไขได้ แต่มันเกี่ยวข้องกับการค้นพบและการใช้ API ภายในซึ่งไม่ตรงไปตรงมา คุณต้องค้นหาฟังก์ชันที่ใช้เพื่อจัดการผลลัพธ์ของการกดปุ่มโลก หากคุณทำเช่นนั้นคุณกำลังจำลองก๊อกน้ำของผู้ใช้และมีเอฟเฟกต์ที่หลากหลายนั่นคือแป้นพิมพ์จะถูกเปลี่ยนสำหรับแอพอื่นเช่นกัน ดังนั้นจึงไม่แนะนำ 100% มันจะล้มเหลวในการส่ง App Store ฉันไม่ต้องการโพสต์เพราะผลลัพธ์ของการแก้ไขครั้งสุดท้าย

ฉันคิดว่ามันเป็นไปไม่ได้ที่จะเข้าใจ Apple อย่างง่ายดาย ทั้งหมดที่ฉันรู้คือ:

  1. API ไม่ทำงานตามที่เผยแพร่
  2. มีรายงานและพวกเขาไม่ได้แก้ไขข้อผิดพลาด
  3. ตั้งแต่เวลาของการรายงานพวกเขาทำลาย (โดยเจตนาหรือไม่) วิธีแก้ปัญหา

ดังนั้นการแก้ไขปัญหาในอนาคตควรสะสมไว้จนกว่าความตั้งใจของพวกเขาจะชัดเจนและ / หรือพวกเขาแก้ไขข้อผิดพลาดนี้ (ซึ่งเป็นสิ่งที่พวกเขาควรทำ) เพียงเพิกถอนส่วนหนึ่งของ API โดยไม่ต้องเผยแพร่การเปลี่ยนแปลงเป็นข้อบกพร่องที่สำคัญ


ขอบคุณสำหรับสิ่งนี้! มันช่วยให้ฉันเข้าใจสิ่งนี้มากขึ้น ฉันสงสัยว่าพวกเขาจงใจปิดกั้นวิธีการแก้ปัญหาของคุณนี้รู้สึกเหมือนเป็นข้อบกพร่องให้ฉันมากขึ้น หากพวกเขาต้องการที่จะลบคุณลักษณะที่พวกเขาสามารถเลิกมันได้
rjstelling

"อย่ากล่าวร้ายต่อสิ่งที่อธิบายอย่างโง่เขลาอย่างพอเพียง"
rjstelling

มีใครพบวิธีแก้ปัญหานี้อีกหรือไม่
shujaat

8

NB: ตรวจสอบให้แน่ใจว่าคุณเปิดใช้งานแป้นพิมพ์ Emoji

ดูเหมือนว่าจะเป็นข้อบกพร่องของ iOS 13 การทำงาน (สำหรับอุปกรณ์ซึ่งไม่ส่งผลกระทบต่อตัวจำลอง) คือการแทนที่textInputContextIdentifierคุณสมบัติและส่งคืนค่าที่ไม่เป็นศูนย์

//
//  ViewController.swift
//  Keyboard Info
//
//  Created by Richard Stelling on 30/09/2019.
//  Copyright © 2019 Richard Stelling. All rights reserved.
//

import UIKit

class TestButton: UIButton, UIKeyInput {

    var hasText: Bool = true

    override var textInputContextIdentifier: String? { "" } // return non-nil to show the Emoji keyboard ¯\_(ツ)_/¯ 

    func insertText(_ text: String) { print("\(text)") }

    func deleteBackward() {}

    override var canBecomeFirstResponder: Bool { return true }

    override var canResignFirstResponder: Bool { return true }

    override var textInputMode: UITextInputMode? {
        for mode in UITextInputMode.activeInputModes {
            if mode.primaryLanguage == "emoji" {
                return mode
            }
        }
        return nil
    }
}

ขอบคุณblldสำหรับคำตอบของเขา


1
ฉันมีปัญหาประเภทเดียวกันในการแสดงแผ่นทศนิยมภาษาอังกฤษ ภาษาของแอพของฉันเป็นภาษาอาหรับและฉันต้องการให้ฟิลด์ข้อความของฉันแสดงแผ่นทศนิยมภาษาอังกฤษ ฉันได้ทำตามขั้นตอนที่กล่าวไว้ข้างต้นโดยการแทนที่ vars และวิธีการเหล่านี้ ใน textInputMode ฉันกลับโหมด "en-US" เท่านั้น แต่ยังคงแสดงแผ่นเลขทศนิยมแบบอาหรับใน iOS 13
shujaat

ใช้งานไม่ได้กับฉันใน iOS 13.2
atereshkov

ฉันสามารถยืนยันได้ว่านี่จะไม่ทำงานอีกต่อไปสำหรับ iOS 13.2 ...
เจลี

@JayLee ตรวจสอบให้แน่ใจว่าคุณได้เปิดใช้งานแป้นพิมพ์ Emoji
rjstelling

7

คุณต้องตั้งค่าtextinputcontextidentifierบนฟิลด์ข้อความเพื่อให้ iOS รู้ตำแหน่งที่จะบันทึกแบบกำหนดเองtextInputMode

มันไม่ได้เขียนใน doc แต่ใช้งานได้

อ้างอิง: https://developer.apple.com/documentation/uikit/uiresponder/1621091-textinputcontextidentifier


2
นี้ทำงานให้ฉันบน iOS 13. เพียงแค่กลับมา"emoji"หรือ""สำหรับtextInputContextIdentifierในการกำหนดของฉันUITextFieldแสดงแป้นพิมพ์อีโมจิ (เมื่อรวมกับtextInputModeการแทนที่ในคำถาม) ขอบคุณสำหรับเคล็ดลับในเอกสารที่ซ่อนอยู่ 👍
Baza207

ไม่ทำงานเมื่อเราต้องการบังคับใช้แผ่นทศนิยมภาษาอังกฤษสำหรับ UITextField เมื่อการโลคัลไลเซชันของแอปเป็นภาษาอาหรับ
shujaat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.