1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Swift】CellのSliderを操作したときに他のCellを変化させる

Posted at

はじめに

特定のUITableViewCell上のUISliderの値を、他のUITableViewCellで使用したいシーンがあったので実装してみました。
また、Storyboardを使用せず、コードのみで実装しています。

環境

Xcode 9.2
Swift 4.0.3

完成図

Qiita.gif

コード

TableViewController.swift
import UIKit

class TableViewController: UITableViewController {

    let SECTIONS = ["section-1", "section-2"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.tableView.register(SliderTableViewCell.self, forCellReuseIdentifier: "cell")
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    override func numberOfSections(in tableView: UITableView) -> Int {
        return SECTIONS.count
    }

    override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return SECTIONS[section]
    }
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1 //固定
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        if indexPath.section == 0 {
            let cell = self.tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! SliderTableViewCell
            cell.slider.addTarget(self, action: #selector(self.slide), for: .valueChanged) // UISliderの値が変更された際にslideメソッドを呼び出す
            return cell
        } else {
            return UITableViewCell()
        }
        
    }
    
    @objc func slide(_ sender: UISlider) {
        let indexPath = NSIndexPath(row: 0, section: 1) as IndexPath // 固定
        let cell = tableView.cellForRow(at: indexPath)
        cell?.textLabel?.text = String(sender.value)
    }
}
SliderTableViewCell.swift
import UIKit

class SliderTableViewCell: UITableViewCell {

    let slider = UISlider()
    
    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
        
        // AutoLayout
        self.contentView.addSubview(self.slider)
        
        self.slider.translatesAutoresizingMaskIntoConstraints = false
        
        self.slider.leadingAnchor.constraint(equalTo: self.contentView.leadingAnchor, constant: 50).isActive = true
        self.slider.trailingAnchor.constraint(equalTo: self.contentView.trailingAnchor, constant: -50).isActive = true
        self.slider.centerYAnchor.constraint(equalTo: self.contentView.centerYAnchor, constant: 0).isActive = true
    }

}

備考

  • SliderTableViewCell.swift側で処理を行うように色々試しましたが、実装できませんでした。
  • textではなくUISliderの値を変化させることもできます。
  • Swiftによる開発は個人の趣味で行なっておりますので、自己流な部分があると思われます。スタンダードな書き方があれば教えてください。
1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?