在 selectedIndex 处展开单元格

Posted

技术标签:

【中文标题】在 selectedIndex 处展开单元格【英文标题】:Expand Cell at selectedIndex 【发布时间】:2017-06-30 11:19:43 【问题描述】:

以下更新代码

我正在处理限制为 100 个字符的评论单元格,如果它们包含更多字符,则会显示“显示更多按钮”。

如果按下,确切的单元格应该重新加载自身,并将行数更改为 0,并完全显示单元格,无论有多大。

我实现的是重新加载单元格,而不是重新加载选定的单元格,而且有点随意。

以下是我的放大过程代码

注意:更新我的函数的代码

问题:我必须按两次按钮才能得到结果,最小化和最大化单元格

   @IBAction func readMore(_ sender: UIButton) 


    self.state = !self.state

    print("state" , state)
    self.tapMore.setTitle(self.state ? self.decreaseState: self.expandState, for: .normal)
    self.commentLabel.numberOfLines = (self.state ? self.expandedLines: self.numberOfLines)
    print(self.commentLabel.numberOfLines)
    let myIndexPath = IndexPath(row: sender.tag, section: 0)

    UIView.animate(withDuration: 0.3, animations: 
        self.parentViewControllerCommentCell?.tableView.reloadRows(at: [myIndexPath], with: UITableViewRowAnimation(rawValue: Int(UITableViewAutomaticDimension))!)
    )

索引来自

extension CommentTableViewCell 

var indexPath: IndexPath? 
    return (superview as? UITableView)?.indexPath(for: self)
   

注意

打印语句打印出所选单元格(例如 [0, 1] 或 [0,0] 但它不会改变。

而我对代码进行硬编码并进行更改 让 myIndexPath = IndexPath(row: indexPath!.row, section: 0)

到 让 myIndexPath = IndexPath(row: 0, section: 0)

该功能有效,但任意重新加载某些单元格并任意放大和缩小单元格。

在带有 row: indexPath!.row 的变量版本中,行状态也不会改变,而在硬编码的情况下,行在 3 和 0 之间变化。

感谢您的帮助:)

加法

我的评论单元格

class CommentTableViewCell: UITableViewCell 

@IBOutlet weak var likeCountButton: UIButton!
@IBOutlet weak var profileImageView: UIImageView!
@IBOutlet weak var commentLabel: KILabel!
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var timeLabel: UILabel!
@IBOutlet weak var likeImageView: UIImageView!


@IBOutlet weak var tapMore: UIButton!

@IBOutlet weak var tapMoreButton: UIButton!


var delegate: CommentTableViewCellDelegate?
var postId : String!

【问题讨论】:

您使用的是哪个版本的 Swift?您的按钮在 tableview 单元格中? swift 4 并且按钮在 CommentTableViewCell 中 @方明宁的回答是正确的。 @SaqibOmer,您能帮我解决以下问题吗?我必须按两次按钮才能放大,两次才能最小化,为什么上面的代码会这样? 已发布答案伙伴。如果可行,请接受:) 【参考方案1】:

这是一种更好的方法,可以让您获得正确的索引路径。首先,在您的 cellForRow 方法中,将当前索引行作为标记添加到您的显示更多按钮,然后将单击操作添加到您的按钮处理函数。

在您的自定义UITableViewCell 类中添加UIButton 的出口

class CustomCell: UITableViewCell 
     @IBOutlet var moreButton: UIButton! // Connect your button from storyboard


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell") as! CustomCell
    cell.moreButton.tag = indexPath.row
    /* Just add action normally from storyboard. No need to add target. cell.moreButton.addTarget(self, action:#selector(buttonUp(sender:)), for: .touchUpInside) */

    return cell

然后在你的handler函数中,通过读取这个标签就可以得到正确的索引路径

func tapForMore(sender: UIButton) 
    let myIndexPath = IndexPath(row: sender.tag, section: 0)
    print("myindex", myIndexPath)
    //... other code here

【讨论】:

所以函数必须在 TableView 而不是单元格中? @Zash__ 我正在做的是为单元格中的每个按钮添加一个函数侦听器,以便在侦听器函数中,您知道单击了哪个按钮。就我而言,我的功能不是 in TableView。这只是一个正常的功能。 @Zash__ 看看我的代码,您将目标添加到单元格的按钮,而不是单元格本身 @SaqibOmer 您不能直接连接按钮。该按钮位于表格视图单元格中,它连接到自定义 UITableViewCell 类,而不是作为 IBOutlet @Fangming Ning:是的,正确,按钮必须连接到单元而不是 vc,因为创建的每个单元都有可用的按钮【参考方案2】:

您获取类变量并跟踪点击次数。根据这些变量,您可以增加或减少单元格的大小并重新加载它。

在 YOURViewController 中将变量声明为:

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate 

       @IBOutlet weak var CommentsTableView: UITableView!
       var defaultSizeOfCell = 60.0
       var newSize = 80.0
       var selectedIndex = -1

       var isExpanded = false
       var expandCounter = 0
       override func viewDidLoad()  ...

将单元格中的按钮连接到此操作:

@IBAction func moreButtonAction(_ sender: UIButton) 

    if !isExpanded 
        if expandCounter == 0 
            expandCounter = expandCounter + 1
         else if expandCounter == 1 
            expandCounter = 0
            isExpanded = true
            selectedIndex = sender.tag
            let myIndexPath = IndexPath(row: sender.tag, section: 0)

            UIView.animate(withDuration: 0.3, animations: 
                self.CommentsTableView.reloadRows(at: [myIndexPath], with: UITableViewRowAnimation(rawValue: Int(UITableViewAutomaticDimension))!)
            )
            print("Increase")
        
     else if isExpanded 
        if expandCounter == 0 
            expandCounter = expandCounter + 1
         else if expandCounter == 1 
            expandCounter = 0
            isExpanded = false
            selectedIndex = -1
            let myIndexPath = IndexPath(row: sender.tag, section: 0)

            UIView.animate(withDuration: 0.3, animations: 
                self.CommentsTableView.reloadRows(at: [myIndexPath], with: UITableViewRowAnimation(rawValue: Int(UITableViewAutomaticDimension))!)
            )
            print("Decrease")
        
    



在tableview数据源函数中为按钮添加标签:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "testCell", for: indexPath) as! TestTableViewCell
    cell.moreButton.tag = indexPath.row
    return cell

最后为单元格的高度添加这个委托方法:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
    if selectedIndex == indexPath.row 
        return CGFloat(newSize)
     else 

        return CGFloat(defaultSizeOfCell)

    


更不用说,按钮应该在单元格中并连接到 YOURCustomTableViewCell 类:

class TestTableViewCell: UITableViewCell 

      @IBOutlet weak var moreButton: UIButton!

我已根据您的要求对其进行了测试。

【讨论】:

嘿,我还有一个问题,我必须按两次按钮才能更改其状态

以上是关于在 selectedIndex 处展开单元格的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式关闭展开的表格视图单元格?

Swift 3 - 已展开第一个单元格的可展开表格视图单元格

使用显示/减少按钮展开/折叠表格视图单元格

快速展开/折叠单元格按钮单击

为每个列单元格展开列单元格

展开和折叠表格视图中的单元格