如何调用其他类按钮--Swift

时间:2016-06-11 15:54:24

标签: ios swift

我有这个newCell类:

class newCell: UITableViewCell {

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}

override func setSelected(selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}
@IBOutlet weak var recipeImage: UIImageView!

@IBOutlet weak var recipeTitle: UILabel!

@IBOutlet weak var favoriteButton: UIButton!

@IBAction func favoriteAction(sender: AnyObject) {


}

在HomeViewController中,我使用这个newCell类作为我的表视图的原型单元格。它适用于文本和图像。我的疑问是,如何在HomeViewController中处理这个原型单元的按钮? 例如,我希望按钮根据传递的数组更改其图像。

  override func viewDidLoad() {
    super.viewDidLoad()

   var recipesFeed = PFQuery(className: "Recipe")

    recipesFeed.findObjectsInBackgroundWithBlock { (objects, error) -> Void in

        if let recipes = objects {

        self.recipes.removeAll(keepCapacity: true)
        self.recipeImages.removeAll(keepCapacity: true)
        self.isFavorite.removeAll(keepCapacity: true)


            for recipe in recipes{

                self.recipes.append(recipe["title"] as! String)
                self.recipeImages.append(recipe["image"] as! String)
                self.isFavorite.append(recipe["isFavorite"] as! Int)

                self.tableView.reloadData()

            }

        }

    }

}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let myCell = self.tableView.dequeueReusableCellWithIdentifier("prototypeCell") as! newCell

 images[indexPath.row].getDataInBackgroundWithBlock { (image, error) -> Void in

        if let downloadedImage = UIImage(data: image!){

            myCell.recipeImage.image = downloadedImage

        } else {

            myCell.recipeImage.image = UIImage(named: "background_recipe_image.png")
        }


    }

    myCell.recipeTitle.text = recipes[indexPath.row]
    //begin what I try and doesn't work
    myCell.favoriteAction(sender: AnyObject) {

    if isFavorite[indexPath.row] == 1 { 
      if let image = UIImage(named: "star vector.png") {

        myCell.favoriteButton.setImage(image, forState: .Normal)


    }

    } else {

    if let image = UIImage(named: "star vector blank.png") {

        myCell.favoriteButton.setImage(image, forState: .Normal)

    }
    }
    }
    //end what I try and doesn't work
    return myCell
}

2 个答案:

答案 0 :(得分:1)

您的tableviewcell中已有一个操作favoriteAction。解决问题的简单方法是将可能的图像数组传递到tableviewcell ,当它出列时,然后将代码交换出favoriteAction IBAction中的图像。

如果你无法弄清楚我上面的描述该怎么做,我可以发布一些代码,但首先尝试解决它。我认为这是一个很好的学习练习。

答案 1 :(得分:1)

所以我在HomeViewController中访问isFavorited数组的方法是使用带有两个协议的委托模式。

protocol hasFavBtn {

  var delegate: FavBtnDelegate! { get set }
  var delegateTableView: UITableView! { get set }

}

protocol FavBtnDelegate {

  var isFavorited: [Int] { get set }

}

为了使其工作,NewCell类应符合hasFavBtn协议,HomeViewController应符合FavBtnDelegate协议。像所以:

HomeViewController

class ViewController: UITableViewController, FavBtnDelegate  {

  var isFavorited = [0, 0, 0, 0, 1]

  let newCellStr = "NewCell"

  func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let newCell = tableView.dequeueReusableCellWithIdentifier(newCellStr) as! NewCell

    newCell.delegate = self
    newCell.delegateTableView = tableView

    return newCell
  }
}

这里要注意的重要事项是:

  1. cellForRowAtIndexPath中,delegate类实例的delegateTableViewNewCell属性是在返回newCell常量之前定义的。< / p>

  2. isFavorited变量的设置如FavBtnDelegate协议中所述。

  3. NewCell.swift

    class NewCell: UITableViewCell, hasFavBtn {
    
      var delegate: FavBtnDelegate!
      var delegateTableView: UITableView!
    
      @IBOutlet weak var favoriteBtn: UIButton!
    
      let blankStarImg = UIImage(imageLiteral: "blankStar")
      let fullStarImg = UIImage(imageLiteral: "fullStar")
    
      override func awakeFromNib() {
        super.awakeFromNib()
        let blankStarImg = UIImage(imageLiteral: "blankStar")
        favoriteBtn.setBackgroundImage(blankStarImg, forState: .Normal)
      }
    
      @IBAction func favoriteBtnPressed(sender: AnyObject) {
        let locationInCell = CGPoint(x: (sender.frame.maxX - sender.frame.minX)/2, y: (sender.frame.maxY - sender.frame.minY)/2)
        let locationInDelegateTableView = convertPoint(locationInCell, toView: delegateTableView)
    
        if let indexPath = delegateTableView.indexPathForRowAtPoint(locationInDelegateTableView) {
          if delegate.isFavorited[indexPath.row] == 1 {
            favoriteBtn.setBackgroundImage(fullStarImg, forState: .Normal)
          }
        }
      }
    

    正如其他人所说的那样,在UITableViewCell子类中,你应该为喜欢的Button定义@IBAction。您可以通过delegate属性引用tableView和isFavorited数组,因为在cellForRowAtIndexPathdelegateTableView属性的值设置为HomeViewController的tableView和delegate属性设置为HomeViewController实例(使用self关键字)。

    因此favoriteBtnPressed函数找到按下的按钮的中心(CGPoint),然后将其转换为delegateTableView的坐标系,从而将其转换为HomeViewController中的tableView。使用tableView坐标系中按钮的转换中心,代码使用if let绑定来安全地打开转换中心的indexPath。然后使用展开的indexPathdelegate属性,您可以检查给定isFavorited的HomeViewController的indexPath数组值是否等于1并相应地调整图像。

    swift的协议和委托模式非常强大,对许多事情都很有用。您可以在此处详细了解它们:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html

    另外,请注意我将我的图像放在Assets.xcassets文件中,因此我使用了imageLiteral初始化程序来获取它们。

    希望这有帮助!如果您有任何疑问,请随时提出!