我有这个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
}
答案 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
协议。像所以:
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
}
}
这里要注意的重要事项是:
在cellForRowAtIndexPath
中,delegate
类实例的delegateTableView
和NewCell
属性是在返回newCell
常量之前定义的。< / p>
isFavorited
变量的设置如FavBtnDelegate
协议中所述。
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
数组,因为在cellForRowAtIndexPath
中delegateTableView
属性的值设置为HomeViewController的tableView和delegate
属性设置为HomeViewController实例(使用self
关键字)。
因此favoriteBtnPressed
函数找到按下的按钮的中心(CGPoint
),然后将其转换为delegateTableView
的坐标系,从而将其转换为HomeViewController中的tableView。使用tableView坐标系中按钮的转换中心,代码使用if let绑定来安全地打开转换中心的indexPath
。然后使用展开的indexPath
和delegate
属性,您可以检查给定isFavorited
的HomeViewController的indexPath
数组值是否等于1并相应地调整图像。
swift的协议和委托模式非常强大,对许多事情都很有用。您可以在此处详细了解它们:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html
另外,请注意我将我的图像放在Assets.xcassets文件中,因此我使用了imageLiteral初始化程序来获取它们。
希望这有帮助!如果您有任何疑问,请随时提出!