Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ios swift-键盘(掩盖文本字段等)和其他一些小部件的问题_Ios_Iphone_Swift - Fatal编程技术网

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

ios swift-键盘(掩盖文本字段等)和其他一些小部件的问题,ios,iphone,swift,Ios,Iphone,Swift,我是一个安卓人,最近开始学习swift 我已经阅读了有关swift结构的教程,但现在真正让我头疼的是UI小部件 键盘覆盖了文本字段。如果textfield被覆盖,但当textfield可见时什么也不做,如何使视图向上推。我发现的示例将视图向上或向下推到键盘正上方,但向下推视图并不是我想要的 我怎么能在文本字段的右边有这样的错误图标?以及如何在键盘上方添加一行额外的导航,以允许用户向后/向前并完成操作 我在对象库中找到了一个日期选择器,但它占用了很多空间。我想要的是下面的截图。当用户单击某个对象

我是一个安卓人,最近开始学习swift

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

  • 键盘覆盖了文本字段。如果textfield被覆盖,但当textfield可见时什么也不做,如何使视图向上推。我发现的示例将视图向上或向下推到键盘正上方,但向下推视图并不是我想要的

  • 我怎么能在文本字段的右边有这样的错误图标?以及如何在键盘上方添加一行额外的导航,以允许用户向后/向前并完成操作

  • 我在对象库中找到了一个日期选择器,但它占用了很多空间。我想要的是下面的截图。当用户单击某个对象时,它会向上推视图,然后在完成后消失。还有同样的问题,关于如何在键盘顶部增加导航条

  • 我不知道它是否会和约会挑肥拣瘦的人一样。我还希望在触发事件时在底部显示一个列表

  • 谁能帮帮我吗?或者告诉我正确的文章。在使用swift编码时,我发现自己在UI上遇到了很大困难:(

    快速修复: 您可以使用,它是ViewController的一个子类,不会让UITextFields被键盘隐藏。(有关链接的更多详细信息)

    困难的方法:自己实现一种方法,显示键盘时响应,获取其高度和文本字段位置,然后移动viewController的视图。另一种方法是关闭键盘时响应,以恢复viewController的视图

    编辑: 对于textFields,最好将图像放在textfield的右边,或者放在textfield上(但当后面有文本时会很难看)。该栏是一个附件视图,您可以在任何textfield中使用,即使您使用DatePicker或PickerView

    对于Datepicker,有一个简单的方法

    对于附件视图:

    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
        }
    }
    

    希望对您有所帮助。

    这与我在问题中发现的完全相同。即使有足够的空间,viewcontroller也会向下移动整个视图,这很容易。在ResponsiveTextFieldViewController上,如果self.keyboardFrame.intersects(self.activeTextField!.frame){self.arrangeViewOffsetFromKeyboard()},则将第71行替换为
    ,如果self.keyboardFrame.intersects(self.activeTextField!.frame){self.arrangeViewOffsetFromKeyboard()}或者{returnViewToInitialFrame()},则第135行替换为该
    。如果textField不在主视图中,该类将无法帮助您。如果您希望我有自己的此类实现,可以解决此问题。噢,谢谢!我从下面的评论中找到了该教程中的解决方案。您知道textField和键盘上方导航中的错误消息吗?太棒了!让我试试明天就可以了。我一直在搜索下拉式或旋转式(如android)小部件。找不到任何小部件,所以我最终使用了tableview来显示选项列表。它看起来很难看,但既然我知道它叫
    PickerView
    ,我知道谷歌该怎么做了。谢谢!