2016-12-07 109 views
1

我有3个按钮代表城市,我已经通过Attribute Inspectortags分配给他们,如下所示,CityA as 0, CityB as 1, CityC as 2如何保存多个按钮选择?

我有标签

var cityTag: [Int] = [] 
在IBAction为方法

然后

@IBAction func cityButtonPressed(_ sender: AnyObject) { 
    guard let button = sender as? UIButton else { return } 
    cityTag = [sender.tag!] 
} 

我在类型的核心数据具有属性citySelectedTransformable

当我保存数据空数组,它只记得在控制台上选择和输出的最后一个城市是

Record Saved Successfully 
citySelected = "(\n 2\n)"; 

但它应该是这样的下面,因为我选择的所有城市

Record Saved Successfully 
citySelected = "(\n 0\n 1\n 2\n)"; 

我缺少什么?

+0

我认为你错..干杯打消了我接受的答案! :) –

+0

对不起,我这样做是因为你的答案是在做工作,但是当我选择和取消选择城市时,它仍然记得我取消选择的城市。所以我想保持开放的问题 – leaner122

+0

已经更新了我的答案:) –

回答

2

它像你每次都要重新初始化数组。相反追加或删除新元素是这样的:

if(cityTag.contains(sender.tag!)) { 
    if let index = cityTag.index(of: sender.tag!) { 
     cityTag.remove(at: index) 
    } 
} else { 
    cityTag.append(sender.tag!) 
} 
+1

欣赏它,完美的作品。 – leaner122

+1

乐于助人。干杯! :) –

1

你应该追加到数组

cityTag += [sender.tag!] 
2

你不应该使用 cityTag = [sender.tag!] 必须使用 cityTag.append(sender.tag!)

0

尝试使用设置,而不是数组,如:

var cityTag: Set = [] 

@IBAction func cityButtonPressed(_ sender: AnyObject) { 
    guard let button = sender as? UIButton else { return } 
    if cityTag.contains(sender.tag) == false { 
     cityTag.insert(sender.tag) 
    }else{ 
    cityTag.remove(sender.tag) 
    } 

    } 
+0

这完成了什么? – leaner122

+0

您可以唯一保存您的标记,并在您再次点击该按钮后将其删除,保存所有选定城市的状态。你所做的就是每次点击一次就为它分配一个元素,这就是为什么你只有最后一个元素 –

+0

这是一个完美的解决方案,但我得到一个错误:“无法将[Any]类型的值转换为Set”因为我的Xcode正在崩溃。 – leaner122

1

在你cityButtonPressed方法,你是按钮的标签值分配给array。这覆盖了最后一个数组赋值。这意味着你第一次说cityTag = 1,但只要你按第二个按钮你的cityTag = 2。为避免这种情况,您必须将所有标签附加到cityTag阵列中以收集所有标签。

要追加他们使用这行代码:

cityTag.append(sender.tag!) 

我希望这为您提供有关问题的清晰的思路。

+1

这很清楚,但它应该像cityTag.append(sender.tag!)。谢谢 – leaner122

+1

感谢指出它。我会更新我的答案。 –

0

我想你还需要检查:

if cityTag.contains(sender.tag!) { 
    //You can remove the unselected city tag from cityTag array 
    print(“already exists“) 
} 
else{ 
    //Here you add selected city tag to cityTag array 
    cityTag.append(sender.tag!) 
}