我正在重新打开这个问题,因为我的最后一个被标记为重复,即使实际上并非如此!这是同样的问题,但解决方案不适用于我的代码。我正在使用swift 2。
所以我的问题是,正如标题所说:我在tableViewCell中有一个UIButton,当我使用方法«setTitle»时,更新标题需要10到60秒。同时我正在使用«addTarget»,它立即起作用。所以标题也应该更新。我的按钮在我的故事板中设置为“自定义”。
加载视图时,我正在运行以下代码:
/ * viewDidLoad * /
override func viewDidLoad() {
super.viewDidLoad()
boolAlready = false
findParticipation()
}
/ * findParticipation * /
func findParticipation() {
// After server request response :
boolAlready = true
self.tableView.reloadData()
}
/ * cellForRowAtIndexPath * /
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cellActions = tableView.dequeueReusableCellWithIdentifier(informationsCellArray[indexPath.row], forIndexPath: indexPath) as ! eventDetailsAction
if boolAlready {
cellActions.foundParticipation
} else {
cellActions.btnParticipate.setTitle("...", forState: UIControlState.Normal)
cellActions.btnParticipate.addTarget(self, action: « deleteParticion", forControlEvents: .TouchUpInside)
}
/ *在我的自定义单元格中* /
func foundParticipation () {
self.btnParticipate.setTitle("Annuler", forState: UIControlState.Normal)
self.btnParticipate.addTarget(self, action: "deleteParticipation", forControlEvents: .TouchUpInside)
}
我在不起作用的论坛上找到的不同内容:
放置我的定位动作
dispatch_async(dispatch_get_main_queue()) {}
设置所有不同的标题UIControlStates
使用setAttributedTitle()
在setTitle之后使用self.btnParticipate.setNeedsLayout()
和self.btnParticipate.layoutIfNeeded()
之前禁用该按钮并在setTitle
self.addSubview(self.btnParticipate)
更改titleLabel.text
使用cellActions.btnParticipate
UIView.performWithoutAnimation {
self.btnParticipate.setTitle("Annuler", forState: .Normal)
}
我现在陷入困境,无法找到解决方案。
答案 0 :(得分:0)
您可以使用
reloadRowsAtIndexPaths(_:withRowAnimation:)
强制重新加载单元格。
当标题发生变化时,意味着您的代码看起来是正确的,而且它的渲染周期也是如此。这将是重新加载单元格的一种方法。
修改强>
当某些事件被触发,请求完成等以更新单元格时,您必须调用此方法。我再看一下你的代码,似乎你在索引路径中的行的单元格中的if-else没有做它应该做的事情。你不应该在那里打电话给任何"动作表演方法"。它仅用于初始化。
您的问题似乎是您的布尔boolAlready对所有单元格都是相同的。这将导致永远不会执行else块。因此,未设置标题,或者仅在bool设置为false时设置标题。你可能应该在那里打印bool。和/或使用更多信息更新您的帖子。
当你使用几乎相同的名字,如findParticipation和foundParticipation时,它的代码不是很好。你应该重构一下。
答案 1 :(得分:0)
尝试将setTitle
电话打包到performWithoutAnimation
:
UIView.performWithoutAnimation {
self.btnParticipate.setTitle("Annuler", forState: .Normal)
}
答案 2 :(得分:0)
您的问题是当您创建单元格时btnParticipate函数无法正常运行您必须在func tableView(tableView:UITableView,cellForRowAtIndexPath indexPath:NSIndexPath)方法中编写所有这些条件
试试这个
let cellActions = tableView.dequeueReusableCellWithIdentifier(informationsCellArray[indexPath.row], forIndexPath: indexPath) as ! eventDetailsAction
cellActions.removeTarget(nil, action: nil, forControlEvents: .AllEvents)
if boolAlready {
cellActions.btnParticipate.setTitle("Annuler", forState: UIControlState.Normal)
cellActions.btnParticipate.addTarget(self, action: "deleteParticipation", forControlEvents: .TouchUpInside)
} else {
cellActions.btnParticipate.setTitle("...", forState: UIControlState.Normal)
cellActions.btnParticipate.addTarget(self, action: « deleteParticion", forControlEvents: .TouchUpInside)
}
答案 3 :(得分:0)
经过一周的尝试,我决定停止搜索...... 我只是同步调用findParticipation()并且在获得foundParticipation()响应之前我没有实例化我的tableView。
我知道用户体验的情况更糟,但是等待的时间还少。
答案 4 :(得分:0)
您可以尝试参考此答案https://stackoverflow.com/a/29633647/4478037
确保您的按钮是“自定义”按钮,而不是“系统”按钮。