Ios Swift中的自定义输入视图

Ios Swift中的自定义输入视图,ios,cocoa-touch,swift,uitextinput,uiinputviewcontroller,Ios,Cocoa Touch,Swift,Uitextinput,Uiinputviewcontroller,我花了好几个小时试图弄清楚如何创建一个自定义的inputView。 我有一个由TextInputs(想想拼字板)组成的网格,按下该网格时,应加载自定义inputView以插入文本 我已经创建了一个.xib文件,其中包含自定义inputView的UI元素。我能够创建一个CustomInputViewController并显示inputView,但从未能够获得实际的TextInput来更新它的值/text 苹果的文档似乎对如何实现这一点很有帮助,我看到的许多教程都在使用Obj-C(由于一些小事情现在

我花了好几个小时试图弄清楚如何创建一个自定义的
inputView
。 我有一个由
TextInputs
(想想拼字板)组成的网格,按下该网格时,应加载自定义
inputView
以插入文本

我已经创建了一个.xib文件,其中包含自定义
inputView
UI元素。我能够创建一个
CustomInputViewController
并显示
inputView
,但从未能够获得实际的
TextInput
来更新它的值/text

苹果的文档似乎对如何实现这一点很有帮助,我看到的许多教程都在使用Obj-C(由于一些小事情现在似乎无法在swift中完成,我一直无法转换Obj-C)


为多个
文本输入
(委托链、控制器、.xib、视图等)创建
自定义输入视图
应该实现什么样的总体架构和必要的代码片段?

您不应该经历所有这些麻烦。iOS 8中有一个新类,名为:
UIAlertController
,您可以在其中为用户添加文本字段以输入数据。您可以将其样式设置为警报或操作表

例如:

let alertAnswer = UIAlertController(title: "Input your scrabble Answer", message: nil, preferredStyle: .Alert) // or .ActionSheet
现在您有了控制器,请向其添加字段:

alertAnswer.addTextFieldWithConfigurationHandler { (get) -> Void in
            getAnswer.placeholder = "Answer"
            getAnswer.keyboardType = .Default
            getAnswer.clearsOnBeginEditing = true
            getAnswer.borderStyle = .RoundedRect
        } // add as many fields as you want with custom tweaks
添加操作按钮:

let submitAnswer = UIAlertAction(title: "Submit", style: .Default, handler: nil)
let cancel = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)
alertAnswer.addAction(submitAnswer)
alertAnswer.addAction(cancel)
在需要时随时向控制器展示:

self.presentViewController(alertAnswer, animated: true, completion: nil)
如您所见,在任何步骤中都有各种处理程序来传递自定义代码

例如,它的外观如下所示:
使用适当的inputView布局和项目设置nib文件。在我的例子中,我将每个按钮设置为对按下的
inputViewButtonPressed
的文件所有者执行的操作

为视图控制器设置故事板(或nib,如果愿意)

然后使用以下代码,您应该可以得到您想要的:

class ViewController: UIViewController, UITextFieldDelegate {
    var myInputView : UIView!
    var activeTextField : UITextField?

    override func viewDidLoad() {
        super.viewDidLoad()

        // load input view from nib
        if let objects = NSBundle.mainBundle().loadNibNamed("InputView", owner: self, options: nil) {
            myInputView = objects[0] as UIView
        }

        // Set up all the text fields with us as the delegate and
        // using our input view
        for view in self.view.subviews {
            if let textField = view as? UITextField {
                textField.inputView = myInputView
                textField.delegate = self
            }
        }
    }

    func textFieldDidBeginEditing(textField: UITextField) {
        activeTextField = textField
    }

    func textFieldDidEndEditing(textField: UITextField) {
        activeTextField = nil
    }

    @IBAction func inputViewButtonPressed(button:UIButton) {
        // Update the text field with the text from the button pressed
        activeTextField?.text = button.titleLabel?.text

        // Close the text field
        activeTextField?.resignFirstResponder()
    }
}
或者,如果您希望更像键盘,可以将此函数用作操作(它使用Swift 1.2中的新let语法),如果需要1.1兼容性,可以将其拆分:

    @IBAction func insertButtonText(button:UIButton) {
        if let textField = activeTextField, title = button.titleLabel?.text, range = textField.selectedTextRange {
            // Update the text field with the text from the button pressed
            textField.replaceRange(range, withText: title)
        }
    }
这将使用
UITEPUT
协议根据需要更新文本字段。处理删除稍微复杂一点,但仍然不算太糟糕:

    @IBAction func deleteText(button:UIButton) {
        if let textField = activeTextField, range = textField.selectedTextRange {
            if range.empty {
                // If the selection is empty, delete the character behind the cursor
                let start = textField.positionFromPosition(range.start, inDirection: .Left, offset: 1)
                let deleteRange = textField.textRangeFromPosition(start, toPosition: range.end)
                textField.replaceRange(deleteRange, withText: "")
            }
            else {
                // If the selection isn't empty, delete the chars in the selection
                textField.replaceRange(range, withText: "")
            }
        }
    }

在InterfaceBuilder中创建自定义类文件并将其设置为xib的类。然后,您可以按ctrl键从UI元素拖动到类文件(助理编辑器)以创建IBOutlets。在代码中使用这个outlets来更新UI元素。我已经能够为customView中的按钮创建iOutlets/iActions。这是必要的,但不足以让customView中的按钮将textInput/Keyboard功能传递给TextInputs视图。您的视图不需要实现/符合正确的协议吗?(放什么?)。您可能还必须告诉他们,当他们被点击时,要成为第一响应者。我会尝试子类化UIControl与UIViewhav。看看这个:。非常感谢这个答案,David。如果我想在几个地方重复使用键盘,您会推荐什么作为最好的方法?您可以子类
UIViewController
,也可以在
UITextField
子类或单独的控制器类中实例化此代码。