在 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__ 我正在做的是为单元格中的每个按钮添加一个函数侦听器,以便在侦听器函数中,您知道单击了哪个按钮。就我而言,我的功能不是 inTableView
。这只是一个正常的功能。
@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 处展开单元格的主要内容,如果未能解决你的问题,请参考以下文章