已解决:
菲利普·米尔斯(Phillip Mills)的解决方案已解决了本文中提出的问题,如下所示。
当前,当用户在应用程序中搜索啤酒时,啤酒以UITableViewCell
子类别出现,该类别在UILabel
实例中显示啤酒名称和啤酒名称。该单元格还包含标签下方的四个按钮:likeButton
,tryButton
,dislikeButton
和deleteButton
。
用户搜索API数据库为啤酒搜索时,用户可以通过使用单元格中的一个按钮将啤酒保存到核心数据中的特定类别中。然后,这些保存的啤酒将出现在应用程序其他地方的UITableView
中。我能够从单元格中成功保存并删除啤酒,并且它们确实显示在正确类别的UITableView
实例中。但是,如果返回的啤酒结果为不是保存在核心数据中的,我希望deleteButton
不显示从API的JSON填充的单元格中,因为该应用程序是为用户设置的应用程序要节省啤酒,请更改啤酒类别,或从搜索结果UITableView
实例中删除啤酒。
我有节省,更改啤酒的类别,并删除啤酒在UITableView
实例和搜索结果UITableView
中都正确工作。在结果UITableView
中显示按钮时,我的问题出现了。
当从HE API中返回结果时,我只希望在与返回结果相匹配的核心数据中保存啤酒时显示deleteButton
。我猜我需要在cellForRowAtIndexPath:
中进行此比较,但是我觉得我要进行错误的操作,因为无论啤酒是否保存在核心中,我都可以使deleteButton
可见或隐藏在所有细胞中是否数据。
这是我当前的实现:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
if scopeButtonIndex == 0 {
let beerCell = tableView.dequeueReusableCellWithIdentifier("foundBeerResultCell", forIndexPath: indexPath) as! BeerTableViewCell
let beer = foundBeerResults[indexPath.row]
beerCell.beerNameLabel.text = beer.name
beerCell.breweryNameLabel.text = beer.brewery
beerCell.delegate = self
for savedBeer in savedBeers {
if beer.name == savedBeer.beerName && beer.brewery == savedBeer.beerBrewery {
beerCell.deleteButton.hidden = false
} else if beer.name != savedBeer.beerName && beer.brewery != savedBeer.beerBrewery {
beerCell.deleteButton.hidden = true
}
}
return beerCell
}
}
当前在核心数据中保存啤酒的数组中的savedBeers
。如您所见,我正在将每种从API返回并保存在foundBeerResults
中的啤酒,从而填充了结果UITableView
实例。然后,我正在循环循环savedBeers
,以查看foundBeerResults
中的每种啤酒是否与保存的啤酒相匹配。如果信息匹配,我希望可见deleteButton
,以便用户可以直接从搜索结果中删除保存的啤酒。如果返回的啤酒结果与当前保存的啤酒不匹配,我希望deleteButton
不可见。
我假设我不应该通过cellForRowAtIndexPath:
中的阵列迭代吗?看起来效率低下。但是,我不确定如何解决这个问题。
循环可能或可能不是性能问题。您可以为此进行测量,但现在假设"不是",因为这似乎是您正在使用的相当小的数组。
我认为您的问题是,一旦得到正确的答案,您就不会停止循环。
怎么样:
beerCell.deleteButton.hidden = true
for savedBeer in savedBeers {
if beer.name == savedBeer.beerName && beer.brewery == savedBeer.beerBrewery {
beerCell.deleteButton.hidden = false
break
}
}