UIInputViewController (пользовательская клавиатура) — действие UIButton не запускается — почему, ну почему?

Я уверен, что это смехотворно просто, но я не могу заставить работать простой пример с UIInputViewController. У меня есть две кнопки, они появляются, но нажатие на них не дает никакого эффекта. В гугле я нашел несколько точно таких же вопросов — без ответов! Я смотрел видео WWDC 2017 на эту тему, но они как бы замалчивают этот момент, и их код работает, но я не мог понять, почему мой не работает.

Код (просто доказательство концепции) приведен ниже, и любая помощь будет очень признательна.

Майкл

class ViewController: UIViewController {  

    @IBOutlet weak var testTF: UITextField!  

    override func viewDidLoad() {  
        super.viewDidLoad()     
        testTF.inputView = CustomView(nibName:nil,bundle:nil).inputView  
    }  

    override func didReceiveMemoryWarning() {  
        super.didReceiveMemoryWarning()  
    }  


}  
class MyButton:UIButton {  

     init(frame: CGRect, title:String) {  
        super.init(frame: frame)  
        backgroundColor = UIColor.lightGray  
        isUserInteractionEnabled = true  
        setTitle(title, for: .normal)  
    }  

    required init?(coder aDecoder: NSCoder) {  
        fatalError("init(coder:) has not been implemented")  
    }  


}  
class CustomView: UIInputViewController {  

    override init(nibName:String?, bundle:Bundle?) {  
        super.init(nibName:nibName, bundle:bundle)  
        let keyboard:UIView = UIView(frame: CGRect(x:0.0,y:0.0,width:768.0, height:240.0))  
        keyboard.backgroundColor = UIColor.red  

        let zeroKey:MyButton = MyButton(frame: CGRect(x:0.0,y:0.0,width:45.0,height:50.0), title:"0")  
        zeroKey.addTarget(self, action: #selector(clickMe(sender:)), for: .allEvents)  
        keyboard.addSubview(zeroKey)  

        let oneKey:UIButton = MyButton(frame: CGRect(x:50.0,y:0.0,width:45.0,height:50.0), title:"1")  
        oneKey.addTarget(self, action: #selector(clickMe(sender:)), for: .allEvents)  
        keyboard.addSubview(oneKey)  

        self.inputView?.backgroundColor = UIColor.blue  
        self.inputView?.frame = CGRect(x:0.0,y:0.0,width:UIScreen.main.bounds.width, height:240.0)  
        self.inputView?.isUserInteractionEnabled = true  
        self.inputView?.addSubview(keyboard)  
    }  

    required init?(coder aDecoder: NSCoder) {  
        fatalError("init(coder:) has not been implemented")  
    }  

    @objc func clickMe(sender:Any) {  
        print("hey, why am I not being called?")  
    }
}  

person Michael Rogers    schedule 09.08.2017    source источник
comment
keyboard.bringSubViewToFront:(oneKey) попробуйте сделать это после добавления клавиатуры в поле ввода.   -  person Aadil Ali    schedule 09.08.2017
comment
Это не сработало, но спасибо за предложение.   -  person Michael Rogers    schedule 09.08.2017
comment
Я немного подправил это, попробовал работать только с .system UIButton, и это сработало. Затем я вернулся к своему классу MyButton, который также работал. Наконец, я вставил код выше, очистил проект, и он до сих пор работает. Похоже на глюк симулятора, может быть? Всё-таки что-то липкое. Какой протокол для этого? Удалить весь вопрос или оставить его в качестве предупреждения для других?   -  person Michael Rogers    schedule 10.08.2017


Ответы (2)


Удалите классы CustomView. Я только что сделал это, отлично сработало на моей стороне:

    override func viewDidLoad() {
    super.viewDidLoad()
    let keyboard:UIView = UIView(frame: CGRect(x:0.0,y:0.0,width:768.0, height:240.0))
    keyboard.backgroundColor = UIColor.red

    let zeroKey:MyButton = MyButton(frame: CGRect(x:0.0,y:0.0,width:45.0,height:50.0), title:"0")
    zeroKey.addTarget(self, action: #selector(clickMe(sender:)), for: .allEvents)
    keyboard.addSubview(zeroKey)

    let oneKey:UIButton = MyButton(frame: CGRect(x:50.0,y:0.0,width:45.0,height:50.0), title:"1")
    oneKey.addTarget(self, action: #selector(clickMe(sender:)), for: .touchUpInside)
    keyboard.addSubview(oneKey) 
    testTF.inputView = keyboard
}
@objc func clickMe(sender:Any) {
    print("hey, why am I not being called?")
}

введите здесь описание изображения

person Aadil Ali    schedule 09.08.2017
comment
Спасибо за ответ, Aadil, я действительно ценю это - это обходной путь, который я мог бы использовать, если ничего не помогает, но, поскольку Apple рекомендует использовать подклассы UIInputViewController, я все же хотел бы знать, почему мой код не работает. - person Michael Rogers; 09.08.2017
comment
Сергей Спасибо за высокую оценку! Я попробую еще раз, чтобы узнать точное решение. - person Aadil Ali; 09.08.2017

Расширение клавиатуры будет выполняться в отдельном процессе от основного процесса. Если вы явно не установили контекст отладки для расширения, в окне журнала Xcode будет отображаться только журнал, который вы делаете в своей основной программе. Хотя вы не говорите об этом выше, я подозреваю, что вы начали с попытки отладки хост-программы, а затем изменили схему на свою клавиатуру, в результате чего она «просто работает».

См. документы Apple по адресу https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionCreation.html#//apple_ref/doc/uid/TP40014214-CH5-SW8 как настроить сеанс отладки для расширений в Xcode.

person Wil Macaulay    schedule 09.11.2018