ios swift - 键盘问题(掩盖文本字段等)和其他一些小部件

时间:2015-03-25 20:39:54

标签: ios iphone swift

我是一个机器人,最近开始学习迅捷。

我已经阅读了关于swift结构的教程,但现在让我头疼的是UI小部件

  1. 键盘覆盖文本字段。我怎样才能做到这一点,如果文本字段被覆盖,视图会被推高,但是当文本字段可见时,视图就不会做任何事情。我发现here的示例会将视图向上或向下推到键盘正上方,但推动视图不是我想要的。

  2. 如何在文本字段右侧显示错误图标?以及如何在键盘正上方添加额外的导航行以允许用户前进/前进和完成 enter image description here

  3. 我在对象库中找到了一个日期选择器,但它占用了大量空间。我想要的就像下面的截图。当用户点击某些内容时它会向上推动视图,然后在完成时消失。还有关于如何在键盘顶部放置额外导航栏的相同问题 enter image description here

  4. 我不知道它是否与Date Picker相同。我还想在触发事件时在底部显示一个列表。

  5. 请有人请帮帮我吗?或者直接找我正确的文章。在使用swift进行编码时,我发现自己在UI上真的很难:(

1 个答案:

答案 0 :(得分:1)

快速修复: 您可以使用this,它是ViewController的子类,不会让键盘隐藏UITextField。 (关于链接的更多细节)

困难的方法:自己实现一个方法,当键盘显示时响应,获取其高度和文本域位置,然后移动viewController的视图。还有另一种方法可以在键盘解除时响应以恢复viewController的视图。

修改 对于textFields,它更好地放置文本字段的图像,或者可能在textField上(但是当有文本后面时它很难看)。该栏是附件视图,您可以在任何textField中使用,即使您使用的是DatePicker或PickerView。

对于Datepicker,here有一种简单的方法。

对于附件视图:

Swift代码

//TODO:First tag all textFields in your view, starting by 1.

//In your viewController
var textFields:[UITextField]? = nil //Class attribute
var activeTextField:UITextField? = nil //Class attribute

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    textFields = [UITextField]()
    searchTextFields(self.view)
    setAccessoryView()
}

//MARK: Helper functions
//Search for all textFields in your view (and subviews), if tag is greater than 0, connect delegate and append to ‘textFields’ array.
func searchTextFields(_view: UIView) {
    for subView in _view.subviews {
        if subView.isKindOfClass(UITextField) {
            let textField = subView as UITextField
            if textField.tag > 0 {
                textField.delegate = self
                textFields?.append(subView as UITextField)
            }
        } else if subView.isKindOfClass(UIView) {
            searchTextFields(subView as UIView)
        }
    }
}

func setAccessoryView() {
    if textFields != nil {
        //Create buttons
        let space = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil)
        let ok = UIBarButtonItem(title: "OK", style: UIBarButtonItemStyle.Done, target: self, action: "okButtonAction")
        //TODO: Place your own images
        let next = UIBarButtonItem(image: UIImage(named: "setaDireita"), style: UIBarButtonItemStyle.Plain, target: self, action: "nextButton")
        let previous = UIBarButtonItem(image: UIImage(named: "setaEsquerda"), style: UIBarButtonItemStyle.Plain, target: self, action: "previousButton")

        //Order buttons
        let itensToolbar = NSMutableArray(array: [previous, next, space, ok])

        //Create toolbar
        let toolbar: UIToolbar = UIToolbar(frame: CGRectMake(0, 0, self.view.frame.width, 0))
        toolbar.barStyle = UIBarStyle.Default
        toolbar.items = itensToolbar
        toolbar.sizeToFit()

        //Set toolbar
        for textField in textFields! {
            textField.inputAccessoryView = toolbar
        }
    }
}

//MARK: Actions AccessoryView
func okButtonAction() {
    //You can do whatever you want
    self.activeTextField?.resignFirstResponder()
}

func nextButton() {
    if activeTextField?.tag != textFields?.last?.tag {
        textFields?[activeTextField!.tag].becomeFirstResponder()
    }
}

func previousButton() {
    if activeTextField?.tag != textFields?.first?.tag {
        textFields?[activeTextField!.tag - 2].becomeFirstResponder()
    }
}

//MARK: UITextFieldDelegate
func textFieldDidBeginEditing(textField: UITextField) {
    self.activeTextField = textField
    let toolbar = textField.inputAccessoryView as UIToolbar
    if textField.tag == textFields?.first?.tag {
        (toolbar.items?[0] as UIBarButtonItem).enabled = false
        (toolbar.items?[1] as UIBarButtonItem).enabled = true
    } else if textField.tag == textFields?.last?.tag {
        (toolbar.items?[0] as UIBarButtonItem).enabled = true
        (toolbar.items?[1] as UIBarButtonItem).enabled = false
    } else {
        (toolbar.items?[0] as UIBarButtonItem).enabled = true
        (toolbar.items?[1] as UIBarButtonItem).enabled = true
    }
}

希望帮助你。