我可以告诉我如何在here的objective-c中执行此操作,但是如何将其转换为swift?
我有一个带有自定义TableViewCells的UITableView,它有一个名为“expandButton”的UIButton。我试图找出如何在单击该单元格的expandButton时更改该特定单元格的高度。
此外,再次单击时,它应更改回原始大小。 我不熟悉ObjectiveC所以请在Swift中帮助我。提前一堆谢谢!
这是我到目前为止所做的:
//Declaration of variables as suggested
var shouldCellBeExpanded:Bool = false
var indexOfExpendedCell:NSInteger = -1
现在在ViewController中。注意:TableViewCell是我的自定义单元格的名称。
//Inside the ViewController
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
if let cell:TableViewCell = TableViewCell() {
cell.stopWatch = stopWatchBlocks[indexPath.row]
cell.expandButton.tag = indexPath.row
//Adding action to the expand button
cell.expandButton.addTarget(self, action: "expandButtonAction1:", forControlEvents: UIControlEvents.TouchUpInside)
return cell
}
}
现在,按钮操作方法:
func expandButtonAction1(button:UIButton) {
button.selected = !button.selected
if button.selected {
indexOfExpendedCell = button.tag
shouldCellBeExpanded = true
self.TableView.beginUpdates()
self.TableView.reloadRowsAtIndexPaths([NSIndexPath(forItem: indexOfExpendedCell, inSection: 0)], withRowAnimation: .Automatic)
self.TableView.endUpdates()
button.setTitle("x", forState: UIControlState.Selected)
}
else if !button.selected {
indexOfExpendedCell = button.tag
shouldCellBeExpanded = false
self.TableView.beginUpdates()
self.TableView.reloadRowsAtIndexPaths([NSIndexPath(forItem: indexOfExpendedCell, inSection: 0)], withRowAnimation: .Automatic)
self.TableView.endUpdates()
button.setTitle("+", forState: UIControlState.Normal)
}
}
最后是HeightForRowAtIndexPath
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
if shouldCellBeExpanded && indexPath.row == indexOfExpendedCell {
return 166.0
}
else { return 91.0 }
}
我想我错过了一些东西,因为单击一次后单元格会扩展,但它不会“缩小”回到91!
我在这里做错了什么?
答案 0 :(得分:9)
尽量不要将所选标记用作切换单元格状态,例如此类。选择一个单元格后,再次点击它将不会取消选择。相反,您可以使用shouldCellBeExpanded标志:
func expandButtonAction1(button:UIButton) {
shouldCellBeExpanded = !shouldCellBeExpanded
indexOfExpendedCell = button.tag
if shouldCellBeExpanded {
self.TableView.beginUpdates()
self.TableView.endUpdates()
button.setTitle("x", forState: UIControlState.Normal)
}
else {
self.TableView.beginUpdates()
self.TableView.endUpdates()
button.setTitle("+", forState: UIControlState.Normal)
}
}
另外,根据我的经验,reloadRowsAtIndexPath方法是不必要的。除非你需要自定义动画,否则单独使用beginUpdates()和endUpdates()应该可以解决问题。
答案 1 :(得分:0)
斯威夫特 5.2
@objc func btn_hideunhidedes(sender:UIButton){ 让 index = sender.tag 让单元格:TVC_JoiningDetails = self.tv_JoiningDetails.cellForRow(at: IndexPath(row: index, section: 0)) as! TVC_加入详情
shouldCellBeExpanded = !shouldCellBeExpanded
indexOfExpendedCell = index
if shouldCellBeExpanded {
self.tv_JoiningDetails.beginUpdates()
self.tv_JoiningDetails.endUpdates()
cell.btn_View.setTitle("X", for: .normal)
}
else {
self.tv_JoiningDetails.beginUpdates()
self.tv_JoiningDetails.endUpdates()
cell.btn_View.setTitle("+", for: .normal)
}
}
扩展 VC_JoiningProgram : UITableViewDelegate,UITableViewDataSource{ func tableView(_ tableView: UITableView, numberOfRowsInSection 部分: Int) -> Int { 返回 2 }
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "TVC_JoiningDetails") as! TVC_JoiningDetails
cell.btn_View.tag = indexPath.row
cell.btn_View.addTarget(self, action: #selector(btn_hideunhidedes), for: .touchUpInside)
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if shouldCellBeExpanded && indexPath.row == indexOfExpendedCell {
return 324
}
else {
return 264
}
}
}