2017-08-31 8 views
0

私のアプリでは、テーブルビューとカスタムセルがあり、ラベル、ボタン、およびprogressBarがあるので、ボタンを押すとprogressBarが進捗状況を表示しますが、スクロールするとそこにあることがわかります他のセルが選択され、進捗状況が表示されます。また、スクロールアップすると、選択したセルの進行状況が停止します。あなたは助けることができる、任意のフィードバックが私のTableViewControllerだこと)タップされたセルだけをボタンで選択する方法は?

を感謝:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
{ 
    return titles.count 
} 

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
{ 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! ViewControllerTableViewCell 
     cell.pesnya.text = titles[indexPath.row] 
     cell.pevets.text = artists[indexPath.row] 
     cell.url = urls[indexPath.row] 
    return (cell) 
} 

@IBAction func buttonPressed(_ sender: AnyObject) { 
    (sender as! UIButton).isSelected = !(sender as! UIButton).isSelected 
    if (sender as! UIButton).isSelected { 
     if let indexPath = tableView.indexPath(for: sender.superview!?.superview as! UITableViewCell) { 
      DownloadManager.shared.download(url: urls[indexPath.row], title: titles[indexPath.row]) 
     } 
    } else { 
     //   (sender as! UIButton).setTitle("Удалить", for: UIControlState.normal) 
     if let indexPath = tableView.indexPath(for: sender.superview!?.superview as! UITableViewCell) { 
      let name = "\(titles[indexPath.row]).mp3" 
      let name2 = name.replacingOccurrences(of: " ", with: "") 
      let filePathURL = URL(string:"string") 
      do { 
       try FileManager.default.removeItem(at: filePathURL!) 
      } catch { 
       print("Could not delete file: \(error)") 
      } 
     } 
    } 

} 
+0

あなたがデータソースにあなたのボタンの状態を保存する必要があります。 – Jaydeep

答えて

0

あなたがスクロールすると、テーブルビューセルが再利用されるためです。ビューをセルのprepareForReuseの初期状態に設定します。このように:

class ACell: UITableViewCell { 
    override func prepareForReuse() { 
     view.hidden = true 
    } 
} 
+0

あなたの答えはほとんど助けになりましたが、ここでisSelected = falseのようなボタンを設定すると、選択したボタンも私にとって間違って選択されなくなります。どう思いますか? – alikhan

+0

@Oklahoma 'tableView(_ tableView:UITableView、cellForRowAt indexPath:IndexPath) - > UITableViewCell' – Lumialxk

+0

を使用する適切な方法は、データを内部的に管理することです。ボタンのプロパティではなく、データモデルに格納する必要があります。 – Legoless

0

これを試してください: -

override func tableView(_ tableView: UITableView, numberOfRowsInSection 
section: Int) -> Int 
{ 
return titles.count 
} 

override func tableView(_ tableView: UITableView, cellForRowAt 
indexPath: IndexPath) -> UITableViewCell 
{ 
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: 
indexPath) as! ViewControllerTableViewCell 
cell.pesnya.text = titles[indexPath.row] 
cell.pevets.text = artists[indexPath.row] 
cell.url = urls[indexPath.row] 
// Create IBOutlet for button 
cell.btnPressed.tag = indexPath.row 
cell.btnPressed.addTarget(self, action: #selector(self.buttonPressed(sender:)), for: .touchUpInside) 

if cell.btnPressed.isSelected { 
    DownloadManager.shared.download(url: urls[indexPath.row], title: titles[indexPath.row]) 
}else { 
    let name = "\(titles[indexPath.row]).mp3" 
    let name2 = name.replacingOccurrences(of: " ", with: "") 
    let filePathURL = URL(string:"string") 
    do { 
     try FileManager.default.removeItem(at: filePathURL!) 
    } catch { 
     print("Could not delete file: \(error)") 
    } 

} 

return (cell) 
} 

@IBAction func buttonPressed(_ sender: UIButton) { 
let indexPath = IndexPath(row: sender.tag, section: 0) 
if let cell = tableView.cellForRow(at: indexPath) as? 
    ViewControllerTableViewCell { 
    cell.btnPressed.isSelected = !cell.btnPressed.isSelected 
    tableview.reloadData() 
    } 

} 
関連する問題