按钮以正确的顺序访问字典数据

时间:2018-03-13 20:44:10

标签: arrays swift sorting dictionary url

我有一系列按钮和一个字典,其中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

相关联

2 个答案:

答案 0 :(得分:1)

您的问题是,对于每个按钮,您都会为每个按钮拨打openLink。显然,您只需要为与点按按钮关联的一个网址openLink拨打电话。

重写您的buttonTapped方法,如下所示:

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

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

这会获取点按按钮的标题,并将其用作检索相应网址的密钥。

答案 1 :(得分:1)

由于我在评论中提到的原因,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)
    }
}