Swift-文本字段中的字符不可见

Swift-文本字段中的字符不可见,swift,uitextfield,ios11,Swift,Uitextfield,Ios11,在我的应用程序中,我有几个定制的游戏来练习拼写和语法。在iOS 11发布之前,整个过程都很顺利 我的应用程序工作原理概述: 游戏从我们的服务器接收一个随机单词和图片,并自动创建一个文本字段堆栈(在水平堆栈视图中) 文本字段的数量与收到的单词的字母数量相似(例如,单词“throw”将创建五个相邻的文本字段) 视图链接到一个自定义键盘,该键盘将一直显示,直到所有问题都得到正确回答 如果用户的输入与预期答案不相似,文本字段将自行重置 自iOS 11以来的问题 只有前两个问题没有在各自的文本字段中显

在我的应用程序中,我有几个定制的游戏来练习拼写和语法。在iOS 11发布之前,整个过程都很顺利

我的应用程序工作原理概述:

  • 游戏从我们的服务器接收一个随机单词和图片,并自动创建一个文本字段堆栈(在水平堆栈视图中)
  • 文本字段的数量与收到的单词的字母数量相似(例如,单词“throw”将创建五个相邻的文本字段)
  • 视图链接到一个自定义键盘,该键盘将一直显示,直到所有问题都得到正确回答
  • 如果用户的输入与预期答案不相似,文本字段将自行重置
自iOS 11以来的问题

只有前两个问题没有在各自的文本字段中显示用户的输入(第一个字母似乎总是有效的)。控制台还确认字母的输入和比较确实有效,但文本字段始终保持为空。游戏甚至可以完美重置,如果单词回答正确,则进入下一个问题奇怪的是问题3、4和5没有这个问题。

在下面的示例中,您可以看到发生了什么。第一个问题(“plant”)仅显示第一个字母。第二个问题(“鼓掌”)也有同样的作用。第三个问题(“咬”)没有这个问题。我的自定义光标工作正常,自动跳转到下一个框

Swift代码(仅限功能)


这可能不是编程问题,而是接口问题。请尝试以下操作:

  • 确保您正在编译应用程序以进行调试

  • 在下面的左图中重新创建场景,您在其中键入了一些字母,它们被隐藏:

  • 在调试导航器中单击此按钮:

  • 选择查看UI层次结构
  • 在Xcode中解构UI时,单击包含隐藏字符的文本字段
  • 您现在应该检查以下几项:

    • 在右侧面板的对象检查器中,检查以确保文本字段的
      Title
      属性是您键入的字符(如果不是,则文本字段不会捕获键盘输入)
    • 此外,在对象检查器中,确保“视图<代码>可见性属性”设置为“不隐藏”
    • 在“大小检查器”(也在右侧面板中)中,检查以确保文本字段足够大以显示字符

  • 我以前也遇到过类似的问题,这些步骤使我能够确定问题的原因。我希望这能有所帮助。

    是否与
    覆盖函数onFocus
    缺少
    super.onFocus()
    有关?我已经尝试过了,但仍然不起作用。不过,它在iOS 10中工作。它也适用于问题3及以上!您可以尝试对这些内容进行注释吗?:
    sender.subviews[CURSOR\u INDEX].ishiden=true
    nextField?.subviews[CURSOR\u INDEX].ishiden=false
    。看看发生了什么还是同一个问题,当我问下一个问题时,这也会使我的光标失效。很抱歉回答得有点晚。我已经将手机代码添加到我的帖子中。我有不同的等级和等级,所以上面是专门针对这种类型的游戏(带有文本字段)的。角色输入工作正常,没有设置为隐藏。所有的角色都非常适合。谢谢您提供的详细答案,但不幸的是,这并没有解决我的问题。@DennisvanMazijk您也可以尝试单击“显示剪辑内容”按钮,然后拖动鼠标查看文本字段后面的内容。是什么原因导致只有前两个问题出现此问题?在我的代码或视图中,没有对问题3、4和5做任何不同的处理。我真的很想让这个bug消失:-(@DennisvanMazijk,我不知道。我认为很重要的一点是,要找出损坏的文本字段的不同之处,然后找出如何修复它们。
    let TEXT_FIELD_TAG = 1000
    let CURSOR_INDEX = 0
    
    var game: GameDictionary? {
        didSet {
    
            self.m_Client.GetMediaImage(game?.Image) { (image) in
                self.imageView.image = image
            }
    
            self.selectedIndex = 0
            self.answerChars = (game?.Content?.map { String($0).lowercased() })!
            self.views = (0..<self.answerChars.count).map { _ in UITextField() }
    
            var index: NSInteger = TEXT_FIELD_TAG
    
            for textField in self.views {
                textField.backgroundColor = .white
                textField.textColor = Constants.MAIN_THEME_COLOR
                textField.font = UIFont(name: Constants.GAME_FONT_TYPE_1, size: scaledFontSize(fontSize: 36))
                textField.textAlignment = .center
                textField.delegate = self
                textField.layer.cornerRadius = 10
                textField.autocapitalizationType = .none
                textField.tag = index
                textField.isUserInteractionEnabled = true
    
                // Create the cursor object and animate the blinking
                let cursor = UIView(frame: CGRect(x: scaledViewSize(viewSize: 10), y: scaledViewSize(viewSize: 10), width: 2, height: scaledViewSize(viewSize: 30)))
                cursor.backgroundColor = Constants.MAIN_THEME_COLOR
                cursor.isHidden = true
    
                UIView.animate(withDuration: 1, delay: 0, options: .repeat, animations: {() -> Void in
                    cursor.alpha = 0
                }, completion: {(_ animated: Bool) -> Void in
                    cursor.alpha = 1
                    }
                )
    
                textField.addSubview(cursor)
                self.container.addArrangedSubview(textField)
    
                index+=1
            }
        }
    }
    
    // MARK: Question handlers
    override func prepareForReuse() {
        super.prepareForReuse()
    
        inputArray.removeAll()
        answerChars.removeAll()
    
        self.selectedIndex = 0
    
        for view in self.views {
            view.removeFromSuperview()
        }
    
        self.views.removeAll()
    }
    
    override func onFocus() {
        self.resetCursorTextField()
    
        keyboardLauncher.onKeyPressed = { character in
            self.views[self.selectedIndex].text = character
            self.textChanged(sender: self.views[self.selectedIndex])
        }
    
        keyboardLauncher.showKeyboard()
        keyboardLauncher.enableKeyboard()
    }
    
    func resetCursorTextField() {
        for (index, textfield) in self.views.enumerated() {
            textfield.subviews[CURSOR_INDEX].isHidden = (index == 0) ? false : true
        }
    }
    
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        guard let text = textField.text else { return true }
        let newLength = text.count + string.count - range.length
        return newLength <= 1
    }
    
    func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
        return false
    }
    
    func resetInputViews() {
        inputArray.removeAll()
    
        self.selectedIndex = 0
        self.resetCursorTextField()
    
        for tag in TEXT_FIELD_TAG...(TEXT_FIELD_TAG + (self.answerChars.count) - 1) {
            let textField = self.container.viewWithTag(tag) as! UITextField!
            textField?.text = ""
    
            if (tag == TEXT_FIELD_TAG) {
                textField?.becomeFirstResponder()
            }
        }
    }
    
    func textChanged(sender: UITextField) {
        if (sender.text?.count)! > 0 {
            inputArray.append((sender.text?.lowercased())!)
    
            if self.answerChars[self.selectedIndex] != inputArray.last! {
                self.delegate?.updateAnswer(inputArray.joined(), false)
                self.resetInputViews()
    
            } else {
                self.selectedIndex+=1
    
                let nextField = sender.superview?.viewWithTag(sender.tag + 1) as! UITextField!
                nextField?.becomeFirstResponder()
    
                sender.subviews[CURSOR_INDEX].isHidden = true
                nextField?.subviews[CURSOR_INDEX].isHidden = false
    
                if self.answerChars.count == inputArray.count {
                    playCorrectAnswer()
                    isCompleted = true
    
                    keyboardLauncher.disableKeyboard()
    
                    self.textField?.isEnabled = false
                    self.delegate?.updateAnswer(inputArray.joined(), true)
                    self.delegate?.nextQuestion(self)
                }
            }
        }
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        if indexPath.item == self.m_Collection?.count {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: gameScoreOverviewCell, for: indexPath) as! GameScoreOverviewCell
            cell.closeViewButton.addTarget(self, action: #selector(closeView(sender:)), for: .touchUpInside)
            cell.rulesButton.addTarget(self, action: #selector(handleAlertScoreOverview(sender:)), for: .touchUpInside)
    
            return cell
        }
    
        let game = self.m_Collection![indexPath.item]
    
        if game.StarryGrade == StarryGrade.Grade4 && game.Level == Level.Level1 {
    
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: fourthGradeCellLevel1, for: indexPath) as! GameCellFourthGradeLevel1
            cell.cancelButton.addTarget(self, action: #selector(closeViewWithAlert(sender:)), for: .touchUpInside)
            cell.questionLabel.text = "Question \(indexPath.item + 1) of \(self.m_Collection!.count)"
            cell.game = game
            cell.delegate = self
    
            keyBoardIsVisible = true
    
            return cell  
        } 
    }