2017-01-25 11 views
0

tableView:didSelectRowAtIndexPathが呼び出されたときに実行される各セルには、tableViewというタイマーがあります。私は、カスタムセル(CustomCell)にラベル(cellName)を使用して、タイマーを増加させようとしています。 に#selectorを使用して、getTimer()という別の関数を呼び出して値を増やしています。コードは以下の通りです。SwiftのTableViewセルに.scheduledTimerの変数を返す3

私は

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

    var time = 0 


    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

     let cell: CustomCell = tableView.cellForRow(at: indexPath)! as! 
    CustomCell 

     var timer = Timer() 

     timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.getTimer), userInfo:nil, repeats: true) 

     cell.cellName.text = String(self.getTimer()) 


    } 

    func getTimer() -> String { 

     time += 1 
     return String(time) 
    } 
} 

のみ関連情報を表示するには2つのこと、このコードは省略しました:getTimer()はこれをインクリメントすることができるように、私のtime変数はクラスレベルで定義されて

  1. を毎回.scheduledTimerが更新されます。私は:didSelectRowAtIndexPathに定義したいので、一度に複数のタイマーを走らせることができます。 :didSelectRowAtIndexPathにこれを定義する方法はありますか?getTimer()からインクリメントを返すことで結果が得られるかもしれませんか?

  2. 現在cellNamegetTimerから返された文字列で更新しています。これは静的で、現在、.scheduledTimerがリフレッシュするときにリフレッシュできる方法を考えています。 indexPath.rowgetTimerに渡してgetTimer()関数自体で更新する必要がありますか?

+0

この構文はうまくいかないでしょう。ターゲット/アクションメソッドから値を返すことは不可能です。解決策は、カスタムテーブルビューのセルクラスを作成し、そこにタイマーを配置することです。 – vadian

+0

ええ、あなたはおそらく正しいでしょう - 私はいつも私がこの方法でわらで握っていたことを知っていました。私のカスタムセルクラスの実装は正常に動作するはずです。私は後世のためにそれを働かせたら、ここで答えとして結果を作ります。ありがとう。 – user3526037

+0

質問を編集し、実際のコードを追加してください。 – vadian

答えて

0

問題に対するあなたのロジックは正しくありません。私はあなたの問題を迅速に解決します。

var timeArray = [Int]() 
var timerArray = [Timer]() 

クラススコープに二つの変数timeArraytimerArrayを作成し、あなたのviewDidLoadにこのコードを入れてください。配列を作成するときは、カウント1をテーブルビューのセル数に置き換えます。あなたのdidSelectRowテーブルビューのデリゲートメソッドで

timeArray = Array(repeating: 0, count: 1) 
    let timer = Timer(timeInterval: 1, target: self, selector: #selector(self.timerFired(_:)), userInfo: nil, repeats: true) 
    timerArray = Array(repeating: timer, count: 1) 

タイマーの検証と無効化を扱う

if timerArray[indexPath.row].isValid{ 
     timerArray[indexPath.row].invalidate() 
    } 
    else{ 
     timerArray[indexPath.row] = Timer(timeInterval: 1, target: self, selector: #selector(self.timerFired(_:)), userInfo: indexPath.row, repeats: true) 
     timerArray[indexPath.row].fire() 
    } 

タイマーが起動したときにトリガを取得します。この機能を追加します。

func timerFired(_ timer:Timer){ 
    if let index = timer.userInfo as? Int{ 
     timeArray[index] += 1 
    } 
} 

最後に、あなたの中にテーブルビューのデータソースcellForRow方法は、特定の細胞timerFired機能をリロードすることを忘れないでください、ラベルテキスト

cell.cellName.text = time[indexPath.row] 

を設定します。

+0

エラー 'タイプ'(UnsafeMutablePointer !) - > time_t 'に添え字メンバーがありません。' ... – user3526037

+0

エラーはどの行に表示されますか? – ebby94

関連する問題