2015-11-03 5 views
7

मैंने एक इन-ऐप कस्टम कीबोर्ड बनाया है जो सिस्टम कीबोर्ड को प्रतिस्थापित करता है और जब मैं UITextField के अंदर टैप करता हूं तो पॉप अप करता है।इन-ऐप कस्टम कीबोर्ड के बटन का उपयोग करके टेक्स्ट इनपुट कैसे करें

class ViewController: UIViewController { 

    var myCustomKeyboard: UIView! 
    @IBOutlet weak var textField: UITextField! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let keyboardNib = UINib(nibName: "Keyboard", bundle: nil) 
     myCustomKeyboard = keyboardNib.instantiateWithOwner(self, options: nil)[0] as! UIView 

     textField.inputView = myCustomKeyboard 
    } 

} 

कीबोर्ड लेआउट एक xib फ़ाइल से भरी हुई है:

enter image description here

यहाँ मेरी कोड है।

प्रश्न

मैं कैसे पाठ फ़ील्ड में बटन पाठ मिलता है?

नोट्स:

  • एक कस्टम प्रणाली कुंजीपटल (जो स्थापित करने की आवश्यकता है) बनाने के बारे में कई ट्यूटोरियल हैं, लेकिन मैं केवल इन-ऐप कुंजीपटल चाहते हैं। ट्यूटोरियल सिर्फ कीबोर्ड के लिए एक विशेष दृश्य नियंत्रक का उपयोग करते हैं, लेकिन यहां ऐसा लगता है कि मैं बस कीबोर्ड दृश्य सेट कर रहा हूं।
  • मैंने Custom Views for Data Input दस्तावेज पढ़ा है।
  • This निकटतम स्टैक ओवरफ़्लो प्रश्न है जो मुझे मिल सकता है, लेकिन यह बटन तक टेक्स्ट कैसे प्राप्त करना है, यह वर्णन नहीं करता है।

अद्यतन

  • This tutorial इंगित करने के लिए कस्टम इनपुट दृश्य के लिए एक दृश्य के नियंत्रक है कि वहाँ लगता है। हालांकि, मैं उद्देश्य-सी कोड में खो रहा हूँ। स्विफ्ट में प्रक्रिया क्या होगी?
  • This answerUIKeyInput प्रोटोकॉल का उल्लेख करता है कि UITextField अनुरूप है, लेकिन मैं इसका उपयोग कैसे करूं?
  • यदि कोई भी अंतर्निहित तरीका है तो कस्टम ऐप-ऐप कीबोर्ड भी बनायेगा, मैं वास्तव में सामान्य कस्टम दृश्य बनाने के लिए पसंद करूंगा।
+0

बस पाठ क्षेत्र के लिए बटन शीर्षक संलग्न: 'textField.text = textField.text + button.title'? – ryancrunchi

+0

चूंकि बटन किसी xib फ़ाइल में संग्रहीत हैं, इसलिए मैं उन्हें संदर्भ कैसे प्राप्त करूं? – Suragch

+1

आप अपने कीबोर्ड के लिए कस्टम व्यू उप-वर्ग बना सकते हैं और बटन को सार्वजनिक बना सकते हैं, या बेहतर प्रतिनिधि को कार्यान्वित कर सकते हैं। या यदि आप अपना xib रखना चाहते हैं, तो अपने बटन को xib में एक टैग दें। फिर उन्हें 'myCustomKeyboard.viewWithTag (टैग) ' – ryancrunchi

उत्तर

4

सेटअप

  • xib फ़ाइल बनाएं जिसमें आपकी सभी चाबियां शामिल हैं
  • ऑटोलाउट का उपयोग करें ताकि कुंजी सही अनुपात में आकार बदल जाए, इससे कोई फर्क नहीं पड़ता कि कुंजीपटल बाद में कितना बड़ा सेट है।
  • swift फ़ाइल को xib फ़ाइल के समान नाम से फ़ाइल बनाएं और इसे xib फ़ाइल सेटिंग में फ़ाइल स्वामी के रूप में सेट करें।

    enter image description here

    enter image description here enter image description here

  • swift फ़ाइल में एक IBAction विधि करने के लिए सभी प्रमुख बटन हुक। मैं कस्टम कुंजीपटल देख सकते हैं और मुख्य दृश्य नियंत्रक के बीच संवाद की delegate pattern उपयोग कर रहा हूँ (कोड नीचे देखें।)

कोड

। यह उन्हें decoupled करने की अनुमति देता है। मुख्य दृश्य नियंत्रक में विस्तृत कार्यान्वयन कोड को बदलने की आवश्यकता के बिना कई अलग-अलग कस्टम कीबोर्ड को अंदर और बाहर बदला जा सकता है।

Keyboard.swift फ़ाइल

import UIKit 

protocol KeyboardDelegate { 
    func keyWasTapped(character: String) 
} 

class Keyboard: UIView { 

    var delegate: KeyboardDelegate? 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     initializeSubviews() 
    } 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     initializeSubviews() 
    } 

    func initializeSubviews() { 
     let xibFileName = "Keyboard" // xib extention not needed 
     let view = NSBundle.mainBundle().loadNibNamed(xibFileName, owner: self, options: nil)[0] as! UIView 
     self.addSubview(view) 
     view.frame = self.bounds 
    } 

    @IBAction func keyTapped(sender: UIButton) { 
     self.delegate?.keyWasTapped(sender.titleLabel!.text!) 
    } 

} 

मुख्य दृश्य नियंत्रक

ध्यान दें कि ViewControllerKeyboardDelegate प्रोटोकॉल है कि हम बनाया के अनुरूप है। साथ ही, कीबोर्ड दृश्य का उदाहरण बनाते समय, height सेट करने की आवश्यकता है लेकिन width नहीं है। स्पष्ट रूप से टेक्स्ट फ़ील्ड के inputView को स्क्रीन चौड़ाई पर कीबोर्ड दृश्य चौड़ाई अपडेट करता है, जो सुविधाजनक है।

class ViewController: UIViewController, KeyboardDelegate { 

    @IBOutlet weak var textField: UITextField! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // get an instance of the Keyboard (only the height is important) 
     let keyboardView = Keyboard(frame: CGRect(x: 0, y: 0, width: 0, height: 300)) 

     // use the delegate to communicate 
     keyboardView.delegate = self 

     // replace the system keyboard with the custom keyboard 
     textField.inputView = keyboardView 
    } 

    // required method for keyboard delegate protocol 
    func keyWasTapped(character: String) { 
     textField.insertText(character) 
    } 

} 

सूत्रों का कहना है

से This answer संबंधित

+0

आप इस समाधान के साथ पूरी तरह से सही हैं :)। बस एक छोटी सी बात: 'xib मेट्रिक्स को निम्नानुसार सेट करें' इस बात को प्रभावित नहीं करेगा कि जब आप ऐप चलाते हैं तो दृश्य कैसे प्रस्तुत होता है। यह इंटरफ़ेस बिल्डर में सिमुलेट किया गया है यह देखने के लिए कि मेट्रिक्स सेट किए जाने पर सेट किए जाने पर यह कैसा होगा। – ryancrunchi

+0

आह, किसी भी तरह से मैंने "नकली" शब्द के महत्व को याद किया था। यह बात बताने के लिए धन्यवाद। मैंने अपने जवाब से उस कदम को हटा दिया। – Suragch

+0

कार्यान्वयन किया जाता है। लेकिन जब मैं बटन क्लिक करता हूं, तो यह 'textfiled' में टेक्स्ट नहीं डालता है। यह keyWasTapped – Piraba

3

मैं कुछ इस तरह की कल्पना:

एक नया समारोह को संभालने के लिए बटन घटना

func updateTextfield(sender: UIButton) { 
    textField.text = (textField.text ?? "") + (sender.titleForState(.Normal) ?? "") 
} 

और init अपने कस्टम कुंजीपटल के बाद, रजिस्टर बटन:

myCustomKeyboard.subviews 
    .filter { $0 as? UIButton != nil } // Keep the buttons only 
    .forEach { ($0 as! UIButton).addTarget(self, action: "updateTextfield", forControlEvents: .TouchUpInside)} 
संबंधित मुद्दे

 संबंधित मुद्दे