1

この質問は、このスレッドに関連している:私のtableViewControllerでhow-to-set-the-height-of-a-cell-depending-on-a-uilabel-with-a-typewriter-effectOperationQueueを正しく使用するには?

、私の細胞はsetTextWithTypeAnimationで管理タイプライターの効果でUILabelが含まれています。

func configureCell(tableView: UITableView, cell: ParagraphTableViewCell, atIndexPath indexPath: IndexPath) { 

    let paragraph = paragraphArray[indexPath.row] as! Paragraph 
    cell.paragraph = paragraph 

     self.queue = OperationQueue() 

     let operation1 = BlockOperation(block: { 

      cell.dialogueLabel.setTextWithTypeAnimation(typedText: paragraph.dialogueLabel.text!, queue:self.queue, callBackAfterCharacterInsertion: { 

       self.tableView.beginUpdates() 
       self.tableView.endUpdates() 
      }) 

     }) 


    operation1.completionBlock = { 

    cell.buttonsStackViewHeightConstraint.constant = CGFloat(HEIGHT_CONSTRAINT) 

    UIView.animate(withDuration: 0.3, animations: { 
     cell.contentView.layoutIfNeeded() 
    }, completion: nil) 

    } 

    queue.addOperation(operation1) 

    } 

私のタイプライターは、UILabelの拡張子の内側にある:

extension UILabel { 

func setTextWithTypeAnimation(typedText: String, queue: OperationQueue, characterInterval: TimeInterval = 0.05, callBackAfterCharacterInsertion:(()->())?) { 

    text = "" 

    for (_, character) in typedText.characters.enumerated() { 

     if queue.isSuspended { 

      OperationQueue.main.isSuspended = true 
      OperationQueue.main.cancelAllOperations() 
      break; 
     } 

     OperationQueue.main.addOperation { 

      self.text = self.text! + String(character) 
      callBackAfterCharacterInsertion?() 

     } 

     Thread.sleep(forTimeInterval: characterInterval) 
    } 
} 
} 

まず、私は(how-to-set-the-height-of-a-cell-depending-on-a-uilabel-with-a-typewriter-effectを参照)は、細胞内のアニメーションを管理するためにDispatchQueueを使用しますが、ユーザーがビューを閉じたときに、私はスレッドを停止するために必要なコントローラ。私は(DispatchQueueが停止することはできません)

​​

問題がcompletionBlockが呼び出されたときに、アプリがクラッシュした私は、レイアウトの制約を更新しようとすると、あるOperationQueueを使用している理由です。

This application is modifying the autolayout engine from a background thread after the engine was accessed from the main thread. 

このクラッシュを回避するにはどうすればよいですか?

+0

'mainQueue'よりも、別のqueeにUIのものをしないでください。 (セル、ラベル、アニメーション、クラス名はすべてUIで始まります)。 – shallowThought

+0

@shallowThoughtはい私はそれについて読んでいますが、私のケースではメインスレッド上で自分のUIをどうやってやることができますか? – cmii

答えて

2

お客様UImainQueueに電話する必要があります。

例:

operation1.completionBlock = { 
    DispatchQueue.main.async { 
     cell.buttonsStackViewHeightConstraint.constant = CGFloat(HEIGHT_CONSTRAINT) 

     UIView.animate(withDuration: 0.3, animations: { 
      cell.contentView.layoutIfNeeded() 
     }, completion: nil) 
    } 
} 
+0

パーフェクト、ありがとう! – cmii

関連する問題