tableview 中的多行对用于一行子视图的一项操作作出反应

Posted

技术标签:

【中文标题】tableview 中的多行对用于一行子视图的一项操作作出反应【英文标题】:Multiple rows in tableview reacts to one action intended for the subview of one row 【发布时间】:2016-08-26 09:01:58 【问题描述】:

我面临的问题是两行的子视图正在对仅针对一行的子视图的操作做出反应。

Image1

Image2

我上面贴的图片是只按“醋酸”行中的星形子视图按钮的结果

以下是我的代码:

首先,UIView 的子类使按钮在触摸时填满。

import UIKit

class StarButton: UIView 

var order : Int = 0

override init (frame : CGRect)

    super.init(frame : frame)
    initStar()


required init?(coder aDecoder: NSCoder)
    super.init(coder: aDecoder)
    initStar()


func initStar()

    let filledStarImage = UIImage(named: "filledStar")
    let emptyStarImage = UIImage(named: "emptyStar")

    let button = UIButton(frame: CGRect(x: 2, y: 2, width: 33, height: 33))

    button.userInteractionEnabled = true
    button.addTarget(self, action: #selector(StarButton.fillingStar(_:)), forControlEvents: UIControlEvents.TouchUpInside)

    let comparator = favoritesList.stringForKey("\(order)")

    if (comparator != nil)
        button.selected = true
    

    button.setImage(emptyStarImage, forState: .Normal)
    button.setImage(filledStarImage, forState: .Selected)

    addSubview(button)



func fillingStar(sender: UIButton)
    if (sender.selected) == false
        favoritesList.setObject(ChemQuizCollection.wordListObject.quizList[order], forKey: "\(order)")
        sender.selected = !sender.selected
        favoritesList.synchronize()
     else
        favoritesList.removeObjectForKey("\(order)")
        sender.selected = !sender.selected
        favoritesList.synchronize()
    



override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?)

    for view in subviews
    
        view.touchesBegan(touches, withEvent: event)
    


override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool

    return true




其次,对于UITableViewController

class WordListTableViewController: UITableViewController 

override func viewDidLoad() 
    super.viewDidLoad()

    for i in 0...25
        favoritesList.setObject(nil, forKey: "\(i)")
    
    favoritesList.synchronize()


    //setting the wordList of wordListObject


    ChemQuizCollection.wordListObject.quizList.sortInPlace()

    ChemQuizCollection.formulaImages.sortInPlace()

    tableView.estimatedRowHeight = 30

    // Uncomment the following line to preserve selection between presentations
    // self.clearsSelectionOnViewWillAppear = false

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem()


override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.


// MARK: - Table view data source


override func numberOfSectionsInTableView(tableView: UITableView) -> Int 

    return 1


override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

    return 25



override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

        let cell = self.tableView.dequeueReusableCellWithIdentifier("WordListTableCell", forIndexPath: indexPath) as! WordListTableViewCell

        let row = indexPath.row
        cell.starButtonView.order = row

        cell.formulaLabel.font = UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline)
        cell.formulaLabel.text = ChemQuizCollection.wordListObject.quizList[row]
        cell.formulaImage.image = UIImage(named: ChemQuizCollection.formulaImages[row])

        return cell
    

我刚刚粘贴了大部分代码,这样会更有意义。请告诉我您是否希望对某些部分进行更多解释,或者是否应该对代码进行更多修剪以显示基本部分。

提前感谢大家的帮助。 *** 是一个非常棒的社区。​​p>

【问题讨论】:

【参考方案1】:

这是因为您的单元格在 cellForRowAtIndexPath 中被重复使用。所以,你必须更新你的StarButton 状态。你可以这样做:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

        let cell = self.tableView.dequeueReusableCellWithIdentifier("WordListTableCell", forIndexPath: indexPath) as! WordListTableViewCell


// Here, you check if favoritesList contains the current item
// If yes, you set the button to enabled = true.
// If no, you set the button to enable = false


        return cell
    

【讨论】:

感谢您的回答。我现在遇到的问题是如何访问 StarButton 的子视图,这是实际的 UIButton。由于 StarButton 是 UIView 的一个子类,它有一个 UIButton 子视图(这是我表中的星形图标),我需要能够访问该 UIButton 子视图,但我不知道如何。尝试:对于 cell.starButtonView.subviews subview.selected = true 中的子视图会引发错误,提示 UIView 没有成员“已选择” 另外,我不明白为什么要根据收藏夹列表的当前项目更新按钮的状态。按钮根据用户的触摸填充或清空。只有当用户触摸它时它才会改变状态。收藏夹列表存在,因此当用户触摸按钮时,与该行关联的项目会本地保存到设备。

以上是关于tableview 中的多行对用于一行子视图的一项操作作出反应的主要内容,如果未能解决你的问题,请参考以下文章

tableView 作为半透明视图中的子视图

故事板静态表视图太多行

使用子视图中的数据重新加载 tableview

ios 5子视图在tableview单元格中的两个视图之间翻转

在 TableView 中单击后隐藏行(多行)

在 Tableview 中,我想知道如何在单元格最后位置设置多行 UILabel