UIButton | setTitle甚至在主线程中花费了大量时间

时间:2016-04-22 11:45:02

标签: ios swift uibutton delay

我正在重新打开这个问题,因为我的最后一个被标记为重复,即使实际上并非如此!这是同样的问题,但解决方案不适用于我的代码。我正在使用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)
}

我在不起作用的论坛上找到的不同内容:

  1. 放置我的定位动作 dispatch_async(dispatch_get_main_queue()) {}

  2. 设置所有不同的标题UIControlStates

  3. 使用setAttributedTitle()

  4. 在setTitle之后使用self.btnParticipate.setNeedsLayout()self.btnParticipate.layoutIfNeeded()

  5. 之前禁用该按钮并在setTitle

  6. 之后启用它
  7. self.addSubview(self.btnParticipate)

  8. 更改titleLabel.text

  9. 中的标题
  10. 使用cellActions.btnParticipate

  11. 完成以前在父viewController中说过的所有内容
  12. UIView.performWithoutAnimation { self.btnParticipate.setTitle("Annuler", forState: .Normal) }

  13. 我现在陷入困境,无法找到解决方案。

5 个答案:

答案 0 :(得分:0)

您可以使用

reloadRowsAtIndexPaths(_:withRowAnimation:)

强制重新加载单元格。

当标题发生变化时,意味着您的代码看起来是正确的,而且它的渲染周期也是如此。这将是重新加载单元格的一种方法。

  

供参考:Apple Docs - UITableView reloadRowsAtIndexPaths

修改

当某些事件被触发,请求完成等以更新单元格时,您必须调用此方法。我再看一下你的代码,似乎你在索引路径中的行的单元格中的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

确保您的按钮是“自定义”按钮,而不是“系统”按钮。