【问题标题】:Buttons access to dictionary data in correct order按钮以正确的顺序访问字典数据
【发布时间】:2018-03-13 20:44:10
【问题描述】:

我有一组按钮和一个字典,其中keys 是按钮的名称,valuesurl,这些按钮是用来打开的。

所有这些都按正确的顺序排序,并显示正确的按钮名称。

我正在努力将正确的 url 传递给 openLink() 函数。

这是我的代码:

@IBOutlet var links: [UIButton]!

let keysAndValues = ["Twitter" : "https://twitter.com/",
                       "Facebook" : "https://facebook.com/",
                       "YouTube" : "https://youtube.com/"]

func setButtonName() {

    let sortedDict = keysAndValues.sorted(by: <)
    let sortedButtons = links.sorted { $0.frame.origin.y < $1.frame.origin.y }

    for (index, button) in sortedButtons.enumerated() {
        button.setTitle(sortedDict[index].key, for: UIControlState.normal)
    }
}

@IBAction func buttonTapped(_ sender: Any) {

    let sortedDict = keysAndValues.sorted(by: <)
    let sortedButtons = links.sorted { $0.frame.origin.y < $1.frame.origin.y }

    for (index, _) in sortedButtons.enumerated() {
        openLink(sortedDict[index].value)
    }
}
func openLink(_ link: String) {
    if let url = URL(string: "\(link)") {
        UIApplication.shared.open(url, options: [:])
    }
}

如何将正确的value 传递给openLink(_ link: String)?目前,链接以随机顺序运行。

PS:每个按钮都连接到@IBOutlet@IBAction

【问题讨论】:

  • 字典数据没有任何特定的顺序。如果您需要订购,请使用数组。
  • @rmaddy 为什么keys 显示为button 标题时正确排序?
  • 为什么你的 buttonTapped 方法循环遍历所有按钮并为所有按钮调用 openLink 而不仅仅是处理被点击的按钮?
  • 我正在尝试为每个按钮使用一种方法

标签: arrays swift sorting dictionary url


【解决方案1】:

您的问题是,对于每个按钮点击,您都会为每个按钮调用 openLink。显然,您只想调用openLink 来获取与点击按钮关联的一个 URL。

重写你的buttonTapped方法如下:

@IBAction func buttonTapped(_ sender: UIButton) {
    let title = sender.title(for: .normal)

    if let url = keysAndValues[title] {
        openLink(url)
    }
}

这会获取点击按钮的标题并将其用作检索相应 URL 的键。

【讨论】:

  • 这行得通,但它很脆弱,因为它使用用户可见的信息(按钮标题)来查找 URL。如果您决定以任何方式更改按钮名称(在名称中添加动词、本地化为不同的语言等),它将中断。相反,我建议创建一个将按钮映射到 URLS 的字典,并使用发件人查找要打开的 URL。
【解决方案2】:

由于我在评论中提到的原因,rmaddy 的解决方案有效,但很脆弱。我建议不要这样做,而是创建一个由按钮键入的字典。

定义一个实例变量来保存由按钮键入的 URL 字典:

var buttonURLsDict = [UIButton: String]()

然后修改你的 setButtonName 方法:

func setButtonName() {

    let sortedDict = keysAndValues.sorted(by: <)
    let sortedButtons = links.sorted { 
      $0.frame.origin.y < $1.frame.origin.y 
    }

    for (index, button) in sortedButtons.enumerated() {
        let title = sortedDict[index].key
        button.setTitle(title, for: UIControlState.normal)
        buttonURLsDict[button] = sortedDict[index].value
    }
}

还有你的 IBAction 方法:

@IBAction func buttonTapped(_ sender: UIButton) {
    guard let url = buttonURLsDict[sender] else { return }
    openLink(url)
    }
}

【讨论】:

  • 非常感谢邓肯。我实际上在我的应用程序的按钮中使用了clear color 文本(在 imageView 上),因此显示不会成为问题,但我猜您的方法总体上具有更好的逻辑!使代码适应UITableView 设计会很复杂吗?
  • 在表视图的情况下,您通常有一个数据模型,它排列在一个数组中(对于单个截面表视图)或一个数组数组(对于截面表视图)。在这种情况下您通常使用该数组结构来保存与每个单元格关联的 URL 等内容。因此,它比您现在处理的情况更简单。
猜你喜欢
  • 1970-01-01
  • 2016-06-16
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 2019-07-19
相关资源
最近更新 更多