2015-08-12 4 views
4

Я пытаюсь сделать подобную кнопку в каждой из моих ячеек таблицы. Когда он будет нажат, кнопка изменится на «в отличие от». Я смог сделать это, создав IBOutlet в моем подклассе и IBAction Method в моем классе tableviewcontroller, используя sender.setTitle («в отличие», forState: UIControlState.Normal). Но когда я нажимаю на нее, метод превращает кучу других кнопок tableviewcell в «непохожий», по сути, дублируя поведение одной ячейки. Способ, которым он это делает, заключается в том, что он меняет каждую другую ячейку, поэтому, если я нажму кнопку «как» из двух последовательных ячеек, все ячейки в представлении таблицы превратятся в «непохожие». Вот мой код tableViewController:Реализация подобной кнопки в tableviewCell в swift

class TableViewController: UIViewController,UITableViewDataSource,UITableViewDelegate { 

    @IBOutlet weak var tableView: UITableView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view. 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return 30 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     var cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as TableViewCell 
     cell.tag = indexPath.row 
     cell.like.tag = indexPath.row 
     cell.like.addTarget(self, action: "handleLikes:", forControlEvents: .TouchUpInside) 
     return cell 
    } 

    @IBAction func handleLikes(sender: AnyObject){ 
     println(sender.tag) // This works, every cell returns a different number and in order. 
     sender.setTitle("Pressed", forState: UIControlState.Normal) 
    } 

И вот мой код класса TableViewCell:

class TableViewCell: UITableViewCell { 

    @IBOutlet weak var like: UIButton! 

    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 
    } 

} 

Кроме того, этот не имеет никакого отношения, но если кто-то читает это может сказать мне, как я мог бы улучшить мой стиль и/или ясность кода, я был бы признателен за это.

ответ

9

UITableViewCell s могут использоваться повторно. Это означает, что вы должны установить заголовок для «непохожий» или «как» для каждой ячейки. Самый простой способ, так как я полагаю, вы будете читать в данных в любом случае, было бы создать массив строк в вашем ViewController

Добавьте это в ViewController: var likes: [String]!

в ViewDidLoad: likes = [String](count: 20, repeatedValue: "like") Обратите внимание, что длина должна основываться на количестве UITableViewCells, которое будет отображаться.

Ваш cellForRowAtIndexPath:

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! { 
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as TableViewCell 
    cell.like.tag = indexPath.row 
    cell.like.addTarget(self, action: "handleLikes:", forControlEvents: .TouchUpInside) 
    cell.like.setTitle(likes[indexPath.row], forState: UIControlState.Normal) 
    return cell 
} 

handleLikes функция:

func handleLikes(sender: AnyObject){ 
    println(sender.tag) // This works, every cell returns a different number and in order. 
    if likes[sender.tag] == "like" { 
     likes[sender.tag] = "unlike" 
    } 
    else { 
     likes[sender.tag] = "like" 
    } 
    sender.setTitle(likes[sender.tag], forState: UIControlState.Normal) 
} 
+0

Спасибо, что работали. Я бы поднял голову, но у меня нет репутации. –

+0

@HidekazuShidara проблем нет. Рад, что смог помочь! – Caleb

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