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

Ios 我如何调用其他类按钮-Swift,ios,swift,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)

我有一个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()

            }

        }

    }
}


您的tableviewcell中已经有一个action
favoriteAction
。问题的简单解决方案是将可能的图像数组在出列时传递到tableviewcell,然后将替换图像的代码放入
favoriteAction
iAction


如果您无法从我上面的描述中了解到该做什么,我可以发布一些代码,但请先尝试了解它。我认为这是一个很好的学习练习。

您的tableviewcell中已经有一个action
favoriteAction
。问题的简单解决方案是将可能的图像数组在出列时传递到tableviewcell,然后将替换图像的代码放入
favoriteAction
iAction


如果您无法从我上面的描述中了解到该做什么,我可以发布一些代码,但请先尝试了解它。我认为这是一个很好的学习练习。

因此我访问HomeViewController中
数组的方法是使用带有两个协议的委派模式

protocol hasFavBtn {

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

}

protocol FavBtnDelegate {

  var isFavorited: [Int] { get set }

}
为使其正常工作,
NewCell
类应符合
hasFavBtn
协议,HomeViewController应符合
FavBtnDelegate
协议。像这样:

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

  • cellforrowatinexpath
    中,在返回
    NewCell
    常量之前,定义
    NewCell
    类实例的
    delegate
    delegateTableView
    属性

  • isFavorited
    变量按照
    FavBtnDelegate
    协议中的说明进行设置

  • 纽赛尔·斯威夫特 正如其他人所说,在这里,
    UITableViewCell
    子类中,您应该为收藏夹按钮定义
    @IBAction
    。您可以通过委托属性引用tableView和
    isFavorited
    数组,因为在
    cellForRowAtIndexPath
    中,
    delegateTableView
    属性的值设置为HomeViewController的tableView,而
    delegate
    属性设置为HomeViewController实例(使用
    self
    关键字)

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

    swift的协议和委托模式非常强大,在很多方面都非常有用。您可以在此处阅读更多关于它们的信息:

    另外,请注意,我将图像放在Assets.xcsets文件中,因此使用imageLiteral初始值设定项来获取它们


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

    因此,我最喜欢访问HomeViewController中的
    数组的方法是使用带有两个协议的委派模式

    protocol hasFavBtn {
    
      var delegate: FavBtnDelegate! { get set }
      var delegateTableView: UITableView! { get set }
    
    }
    
    protocol FavBtnDelegate {
    
      var isFavorited: [Int] { get set }
    
    }
    
    为使其正常工作,
    NewCell
    类应符合
    hasFavBtn
    协议,HomeViewController应符合
    FavBtnDelegate
    协议。如下所示:

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

  • cellforrowatinexpath
    中,在返回
    NewCell
    常量之前,定义
    NewCell
    类实例的
    delegate
    delegateTableView
    属性

  • isFavorited
    变量按照
    FavBtnDelegate
    协议中的说明进行设置

  • 纽赛尔·斯威夫特 正如其他人所说,在这里,
    UITableViewCell
    子类中,您应该为收藏夹按钮定义
    @IBAction
    。您可以通过委托属性引用tableView和
    isFavorited
    数组,因为在
    cellforrowatinexpath
    中,
    delegateTableView
    属性设置为HomeViewController的tableView,而
    委托
    属性设置为HomeViewController实例(使用
    self
    关键字)

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

    swift的协议和委托模式非常强大,在很多方面都非常有用。您可以在此处阅读更多关于它们的信息:

    另外,请注意,我将图像放在Assets.xcsets文件中,因此我使用imageLiteral初始值设定项来获取
    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
      }
    }
    
    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)
          }
        }
      }