2015-05-01 2 views
0

В моем приложении есть несколько экземпляров UITableView, которые содержат экземпляры подкласса UITableViewCell под названием BeerTableViewCell. В моем подклассе я добавил несколько экземпляров UILabel и несколько экземпляров UIButton. Код для BeerTableViewCell следующим образом:Понимание логики для UIButtons в подклассе UITableViewCell

import UIKit 
import CoreData 




class BeerTableViewCell: UITableViewCell { 




////////////////////////////////////////////////////////////// 
//  MARK: - Properties 
////////////////////////////////////////////////////////////// 

    var beerNameLabel = UILabel() 
    var breweryNameLabel = UILabel() 
    var beerCategoryReferenceImageView = UIImageView() 
    var likeButton = UIButton() 
    var tryButton = UIButton() 
    var dislikeButton = UIButton() 
    var deleteButton = UIButton() 
    var categoryButtonsArray = [UIButton]() 


////////////////////////////////////////////////////////////// 
//  MARK: - View Lifecycle 
////////////////////////////////////////////////////////////// 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     // Initialization code 
     self.autoresizingMask = .FlexibleHeight 
     self.clipsToBounds = true 
    } 




    override func layoutSubviews() { 
     super.layoutSubviews() 
     beerNameLabel.frame = CGRectMake(10, 8, self.bounds.size.width - 40, 26) 
     beerNameLabel.font = UIFont(name: "Avenir Next", size: 18) 
     contentView.addSubview(beerNameLabel) 

     breweryNameLabel.frame = CGRectMake(10, 32, self.bounds.size.width - 40, 20) 
     breweryNameLabel.font = UIFont(name: "Avenir Next", size: 14) 
     breweryNameLabel.alpha = 0.5 
     contentView.addSubview(breweryNameLabel) 

     beerCategoryReferenceImageView.frame = CGRectMake(self.bounds.size.width-35, 20, 20, 20) 
     beerCategoryReferenceImageView.image = UIImage() 
     contentView.addSubview(beerCategoryReferenceImageView) 

     likeButton.frame = CGRectMake(20, 70, 30, 30) 
     contentView.addSubview(likeButton) 

     tryButton.frame = CGRectMake(90, 70, 30, 30) 
     contentView.addSubview(tryButton) 

     dislikeButton.frame = CGRectMake(160, 70, 30, 30) 
     contentView.addSubview(dislikeButton) 

     deleteButton.frame = CGRectMake(230, 70, 30, 30) 
     contentView.addSubview(deleteButton) 

     let likeNormalImage = UIImage(named: "like-button") 
     let likeSelectedImage = UIImage(named: "like-button") 
     likeButton.setImage(likeNormalImage, forState: .Normal) 
     likeButton.setImage(likeSelectedImage, forState: .Selected) 

     let tryNormalImage = UIImage(named: "try-button") 
     let trySelectedImage = UIImage(named: "try-button") 
     tryButton.setImage(tryNormalImage, forState: .Normal) 
     tryButton.setImage(trySelectedImage, forState: .Selected) 

     let dislikeNormalImage = UIImage(named: "dislike-button") 
     let dislikeSelectedImage = UIImage(named: "dislike-button") 
     dislikeButton.setImage(dislikeNormalImage, forState: .Normal) 
     dislikeButton.setImage(dislikeSelectedImage, forState: .Selected) 

     let deleteNormalImage = UIImage(named: "delete-button") 
     let deleteSelectedImage = UIImage(named: "delete-button") 
     deleteButton.setImage(deleteNormalImage, forState: .Normal) 
     deleteButton.setImage(deleteSelectedImage, forState: .Selected)1 

     likeButton.addTarget(self, action: "handleButtonPress", forControlEvents: .TouchUpInside) 
     tryButton.addTarget(self, action: "handleButtonPress", forControlEvents: .TouchUpInside) 
     dislikeButton.addTarget(self, action: "handleButtonPress", forControlEvents: .TouchUpInside) 
     deleteButton.addTarget(self, action: "handleButtonPress", forControlEvents: .TouchUpInside) 

     categoryButtonsArray.append(likeButton) 
     categoryButtonsArray.append(tryButton) 
     categoryButtonsArray.append(dislikeButton) 
} 




////////////////////////////////////////////////////////////// 
//  MARK: - States 
////////////////////////////////////////////////////////////// 

    override func setSelected(selected: Bool, animated: Bool) { 
     super.setSelected(selected, animated: animated) 
     // Configure the view for the selected state 
} 



////////////////////////////////////////////////////////////// 
//  MARK: - Helpers 
////////////////////////////////////////////////////////////// 

    func handleButtonPress() { 
     println("Button Pressed") 
    } 


} 

Я с трудом найти способ выполнить действие при нажатии на кнопки в любом из моих UITableView экземпляров. Я смог успешно добавить действие к кнопкам, которые распечатывают, что была нажата кнопка (println("Button Tapped"):

У меня возникли проблемы с выяснением того, как реализовать метод делегата для обработки нажатия кнопок. обнаружили, что реализованы действия UIButton через Interface Builder. Должен ли я использовать Interface Builder для создания кнопок и активирования действий над ними? Как вы можете видеть, в настоящее время я создаю свои кнопки в коде, но найденные мной учебные пособия в основном делают это this путь.

немного руководство было бы весьма признателен!

Решенный:

Для того, чтобы контроллер представления, что соответствует протоколу делегата разрешить назначение self делегировать ячейки, я просто должен был реализовать метод делегата в контроллере представления. Если бы я не добавил метод делегата, Xcode не разрешил назначение.

+0

Используйте метод UIControl addTarget: действие: forControlEvents: для перехвата нажатий кнопок. – rocky

+0

@rocky, я уже добавил этот метод к экземплярам 'UIButton' в конце' layoutSubviews() '. –

ответ

2

У вас есть несколько вариантов. Вы можете позвонить addTarget:action:forControlEvents: в cellForRowAtIndexPath:, а не в свой класс ячеек (передавая себя как цель), или вы можете использовать протокол делегатов (в этом случае вы должны указать себя как делегат ячейки в cellForRowAtIndexPath). Создайте протокол делегатов в классе ячеек, добавьте свойство делегирования и вызовите метод делегата из метода действия кнопки. Вы должны реализовать метод делегата в контроллерах табличного представления, чтобы соответствующим образом реагировать на нажатие кнопки.

+0

Вариант делегата - это то, к чему я склонялся. Это определенно облегчило мне жизнь. Теперь, в протоколе, мне просто нужно захватить indexPath ячейки, которая получает нажатие кнопки, чтобы я мог действовать на объект, который представляет ячейка? –

+0

@bnkohrn Да, вам нужно это сделать. Обычно я использую метод indexPathForRowAtPoint :, чтобы получить индексную ячейку ячейки. – rdelmar

+0

Я создал протокол, а также свойство delegate в подклассе 'UITableViewCell'. Затем я добавил делегата в объявление класса в верхней части моего контроллера представления, чтобы я соответствовал протоколу. Однако, когда я пытаюсь установить делегат подкласса 'UITableViewCell' в' cellForRowAtIndexPath: 'контроллера представления для« я », я получаю сообщение об ошибке« Невозможно присвоить значение типа «CategoryTableViewController» значению типа "BeerTableViewCellDelegate?». Мне что-то не хватает, но я не могу понять, что. –

Смежные вопросы