在UITableViewCell中动态显示UIButton

时间:2015-05-04 16:08:51

标签: uitableview uibutton

解决

Phillip Mills'解决方案解决了本文中提出的问题,如下所述。

目前,当用户在应用程序中搜索啤酒时,啤酒会显示在UITableViewCell子类中,该子类在UILabel个实例中显示啤酒的名称和啤酒厂名称。该单元格还在标签下方包含四个按钮:likeButtontryButtondislikeButtondeleteButton

当用户在API数据库中搜索啤酒时,用户可以使用单元格中的一个按钮将啤酒保存到Core Data中的特定类别。然后,这些保存的啤酒会显示在应用中其他位置的UITableView。我能够从单元格中成功保存和删除啤酒,并且它们确实显示在正确类别的UITableView实例中。但是,如果返回的啤酒结果保存在Core Data中,我希望deleteButton不会显示在从API的JSON填充的单元格中,因为该应用已设置用户可以保存啤酒,更改啤酒类别,或从搜索结果UITableView实例中删除啤酒。

我保存,更改了啤酒的类别,并删除了在UITableView类别实例和搜索结果UITableView中正常使用的啤酒。在结果UITableView中显示按钮时出现问题。

当从API返回结果时,如果核心数据中保存的啤酒与返回的结果相匹配,我只希望显示deleteButton。我猜测我需要在cellForRowAtIndexPath:中执行此比较,但我觉得我错了,因为我可以让deleteButton可见或隐藏在所有单元格中,无论啤酒是否保存在Core Data中。

这是我目前的实施:

 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在Core Data中保存的啤酒数组中。如您所见,我将从API返回的每种啤酒保存在foundBeerResults中,其中填充结果UITableView实例。然后我循环浏览savedBeers以查看foundBeerResults中每个返回的啤酒是否与保存的啤酒相匹配。如果信息匹配,我希望deleteButton可见,以便用户可以直接从搜索结果中删除已保存的啤酒。如果返回的啤酒结果与当前保存的啤酒不匹配,我希望deleteButton不可见。

假设我不应该在cellForRowAtIndexPath:中迭代数组,我是不是错了?这似乎效率低下。但是,我不知道如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

循环可能是也可能不是性能问题。你可以衡量,但我们假设"不是"目前,因为它似乎是一个相当小的阵列,你正在使用它。

我认为你的问题是,一旦得到正确答案,你就不会停止循环。

怎么样:

   beerCell.deleteButton.hidden = true
   for savedBeer in savedBeers {
        if beer.name == savedBeer.beerName && beer.brewery == savedBeer.beerBrewery {
            beerCell.deleteButton.hidden = false
            break
        }
    }