【问题标题】:Detecting dictionary keys in UITextView在 UITextView 中检测字典键
【发布时间】:2016-06-24 19:03:44
【问题描述】:

我是编程新手,正在用 Swift 构建一个简单的 iOS 应用程序,允许用户将项目添加到列表中。我已经开始添加新项目、在列表中查看它们、订购列表、查看详细视图等。每个项目都包含一个名称 [String] 和一个评论 [String]。名称通过 UITextField 输入,注释通过 UITextView 输入。

我编写了一个字典,它将一组键(例如“鸡尾酒”)与一个值(例如“酒吧”)相关联。键和值都是字符串。

我想检测输入到 Comment UITextView 中的任何字典键并从字典中返回值。

好奇有些人会怎么做...

从概念上讲,我认为我需要:

  • 创建一个变量enteredCommentText来存储commentUITextView中输入的内容

  • 编写一个函数,对enteredCommentText 进行迭代以检测字典中的任何键(字符串)

  • 为检测到的每个键返回每个键的值

  • 将这些值保存为一个数组,这样我就可以用它们做我想做的事情了

奖励:我可以在用户输入时检测到,而不是在事件之后检测,即 DidEndEditing 或转到下一个字段或点击保存等?

非常感谢任何关于此的代码建议。我一直在使用 Apple 的一些字典语法:

    var keywordDict: [String: String] = [
        "cocktail": "bar"
        ]

    //Look up a value, print the key
    if let wordValue = keywordDict["cocktail"] {
        print("The keyword is \(wordValue).")
    //Prints: "The keyword is bar."
    }

    let enteredCommentText = "Here is a sample of text. It contains a burger."

    //Detect text
    if enteredCommentText.containsString("burger") {
        print("found burger")
    //Prints: "found burger"
    }

【问题讨论】:

    标签: ios swift loops dictionary


    【解决方案1】:

    你在概念上是对的。这是一个示例实现,展示了如何获取给定字符串的匹配值 - 假设您想要 contains 而不是完全匹配,我从您的示例代码中收集到。

    let dict = ["Hi" : "there"]
    let filteredString = "some text"
    let matchingValues = dict.filter { $0.0.containsString(filteredString) }.map { $0.1 }
    // matchingValues now contains all values of the dictionary where the key matched
    

    如果您不熟悉filter/map 语法,这里有一个循环可以实现同样的效果,实际上速度更快......但速度要慢得多! ;)

    var matchingValues = [String]()
    for (key, value) in dict {
        if key.containsString(filteredString) {
            matchingValues.append(value)
        }
    }
    

    如果您想在每次击键时获取更新,可以使用以下代码:

    class YourViewController {
        func textChanged(sender: UITextField) {
            // Do your stuff here
        }
    
        func viewDidLoad() {
            super.viewDidLoad()
            // other setup code...
    
            myTextField.addTarget(self, action: #selector(YourViewController.textChanged(_:)), forControlEvents: .EditingChanged)
        }
    }
    

    请注意,您还可以通过 InterfaceBuilder 添加操作,方法是从文本字段拖动到您的类,然后选择“编辑更改”作为事件类型。

    【讨论】:

    • 大卫感谢您的回答!我已经添加了您的代码,并且如果字典键与 filtersString 中的文本匹配(完全正确),则能够返回字典值。但是,我想做的是为文本中检测到的每个键返回每个键的值。因此,如果文本包含多个键,我想返回每个键的值,即多个值。我会花一些时间来处理你提供的代码——谢谢你的帮助!! -山姆
    【解决方案2】:

    您好,这是您需要执行的代码,当用户键入包含在dictionary 中的单词时,我们将替换为dict 上的value

    import UIKit
    
    class ViewController: UIViewController,UITextFieldDelegate {
    
        @IBOutlet weak var lbResult: UILabel!
        @IBOutlet weak var tfWrite: UITextField!
    
        let dict = ["cocktail":"bar"]
    
        override func viewDidLoad() {
            super.viewDidLoad()
            self.tfWrite.delegate = self;
            // Do any additional setup after loading the view, typically from a nib.
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    
    
        func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool
        {
            let range2 = Range<String.CharacterView.Index>(start: textField.text!.startIndex.advancedBy(range.location),end: textField.text!.startIndex.advancedBy(range.location + range.length))
            let candidateString = textField.text?.stringByReplacingCharactersInRange(range2, withString: string)
            //let bb = Range<String.CharacterView.Index>(start: range.location,end: range.location + range.length)
    
            var finalText = ""
    
            let components = candidateString?.componentsSeparatedByString(" ")
            for word in components! {
                if(dict[word] != nil)
                {
                    finalText += " " + dict[word]!;
                }else
                {
                    finalText += " " + word;
                }
            }
    
    
            self.lbResult.text = finalText
    
            return true;
        }
    
    
    }
    

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      我在 David 的帮助下写了这篇文章,它按我的预期打印了值!

      var myDict [字符串:字符串] [ “key1”:“value1”, “键 2”:“值 2” ]

      for (key, value) in myDict { if place!.comment.rangeOfString(key) != nil { 打印(值) } }

      【讨论】:

        猜你喜欢
        • 2023-04-04
        • 2013-09-13
        • 2014-07-01
        • 1970-01-01
        • 2011-02-19
        • 1970-01-01
        • 2019-03-29
        • 1970-01-01
        • 2017-06-01
        相关资源
        最近更新 更多