前提・実現したいこと
前提
Storyboardは使用しておらず、コードだけで実装しています。
実現したいこと
Swiftで伸縮可能セルをUISwitchで切り替えるシステムがつくりたいです。
以下のコードで下の写真のようになります。
![]
NotificationsのUISwitchをオフにしたらそのセルの下にセルを追加し、そのセルにUIPickerViewを設置したいです。そして、UISwitchをオンに戻せば追加されたセルが消えるようにしたいです。
どのように記述したら良いのかわかりません。この機会に学ばせていただきたいと考えております。
該当のソースコード(UserInfoHeaderは文字数の都合上省略しております)
以下コードは下記リンクを参考にして作らせていただきました。
How to Add A Settings Page To Your App
↓ViewController.swift
swift
1import UIKit 2 3private let reuseIdentifier = "SettingsCell" 4 5class ViewController: UIViewController { 6 7 // MARK: - Properties 8 9 var tableView: UITableView! 10 var userInfoHeader: UserInfoHeader! 11 12 // MARK: - Init 13 14 override func viewDidLoad() { 15 super.viewDidLoad() 16 configureUI() 17 } 18 19 // MARK: - Helper Functions 20 21 func configureTableView() { 22 tableView = UITableView() 23 tableView.delegate = self 24 tableView.dataSource = self 25 tableView.rowHeight = 60 26 27 tableView.register(SettingsCell.self, forCellReuseIdentifier: reuseIdentifier) 28 view.addSubview(tableView) 29 tableView.frame = view.frame 30 31 let frame = CGRect(x: 0, y: 88, width: view.frame.width, height: 100) 32 userInfoHeader = UserInfoHeader(frame: frame) 33 tableView.tableHeaderView = userInfoHeader 34 tableView.tableFooterView = UIView() 35 } 36 37 func configureUI() { 38 configureTableView() 39 40 navigationController?.navigationBar.prefersLargeTitles = true 41 navigationController?.navigationBar.isTranslucent = false 42 navigationController?.navigationBar.barStyle = .black 43 navigationController?.navigationBar.barTintColor = UIColor(red: 55/255, green: 120/255, blue: 250/255, alpha: 1) 44 navigationItem.title = "Settings" 45 } 46 47} 48 49extension ViewController: UITableViewDelegate, UITableViewDataSource { 50 51 func numberOfSections(in tableView: UITableView) -> Int { 52 return SettingsSection.allCases.count 53 } 54 55 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 56 57 guard let section = SettingsSection(rawValue: section) else { return 0 } 58 59 switch section { 60 case .Social: return SocialOptions.allCases.count 61 case .Communications: return CommunicationOptions.allCases.count 62 } 63 } 64 65 func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 66 let view = UIView() 67 view.backgroundColor = UIColor(red: 55/255, green: 120/255, blue: 250/255, alpha: 1) 68 69 print("Section is (section)") 70 71 let title = UILabel() 72 title.font = UIFont.boldSystemFont(ofSize: 16) 73 title.textColor = .white 74 title.text = SettingsSection(rawValue: section)?.description 75 view.addSubview(title) 76 title.translatesAutoresizingMaskIntoConstraints = false 77 title.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true 78 title.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 16).isActive = true 79 80 return view 81 } 82 83 func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { 84 return 40 85 } 86 87 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 88 let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier, for: indexPath) as! SettingsCell 89 guard let section = SettingsSection(rawValue: indexPath.section) else { return UITableViewCell() } 90 91 switch section { 92 case .Social: 93 let social = SocialOptions(rawValue: indexPath.row) 94 cell.sectionType = social 95 case .Communications: 96 let communications = CommunicationOptions(rawValue: indexPath.row) 97 cell.sectionType = communications 98 } 99 100 return cell 101 } 102 103 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 104 guard let section = SettingsSection(rawValue: indexPath.section) else { return } 105 106 switch section { 107 case .Social: 108 print(SocialOptions(rawValue: indexPath.row)?.description) 109 case .Communications: 110 print(CommunicationOptions(rawValue: indexPath.row)?.description) 111 } 112 } 113} 114 115 116
↓SettingSection.swift
swift
1protocol SectionType: CustomStringConvertible { 2 var containsSwitch: Bool { get } 3} 4 5enum SettingsSection: Int, CaseIterable, CustomStringConvertible { 6 case Social 7 case Communications 8 9 var description: String { 10 switch self { 11 case .Social: return "Social" 12 case .Communications: return "Communications" 13 } 14 } 15} 16 17enum SocialOptions: Int, CaseIterable, SectionType { 18 case editProfile 19 case logout 20 21 var containsSwitch: Bool { return false } 22 23 var description: String { 24 switch self { 25 case .editProfile: return "Edit Profile" 26 case .logout: return "Log Out" 27 } 28 } 29} 30 31enum CommunicationOptions: Int, CaseIterable, SectionType { 32 case notifications 33 case email 34 case reportCrashes 35 36 var containsSwitch: Bool { 37 switch self { 38 case .notifications: return true 39 case .email: return true 40 case .reportCrashes: return true 41 } 42 } 43 44 var description: String { 45 switch self { 46 case .notifications: return "Notifications" 47 case .email: return "Email" 48 case .reportCrashes: return "Report Crashes" 49 } 50 } 51} 52
↓SettingsCell.swift
import UIKit class SettingsCell: UITableViewCell { // MARK: - Properties var sectionType: SectionType? { didSet { guard let sectionType = sectionType else { return } textLabel?.text = sectionType.description switchControl.isHidden = !sectionType.containsSwitch } } lazy var switchControl: UISwitch = { let switchControl = UISwitch() switchControl.isOn = true switchControl.onTintColor = UIColor(red: 55/255, green: 120/255, blue: 250/255, alpha: 1) switchControl.translatesAutoresizingMaskIntoConstraints = false switchControl.addTarget(self, action: #selector(handleSwitchAction), for: .valueChanged) return switchControl }() // MARK: - Init override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) addSubview(switchControl) switchControl.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true switchControl.rightAnchor.constraint(equalTo: rightAnchor, constant: -12).isActive = true } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } // MARK: - Selectors @objc func handleSwitchAction(sender: UISwitch) { if sender.isOn { print("Turned on") } else { print("Turned off") } } }
試したこと
以下サイトを応用できないかと思って、試してみました。
YouTube TableView -Expand/Collapse Section : Swift3
補足情報(FW/ツールのバージョンなど)
Xcode Version 11.3.1
自分なりにとことん粘ってみましたができませんでした。どなたかお力を貸してください。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/23 05:12 編集
2020/02/23 05:35
2020/02/23 06:01 編集
2020/02/23 06:26
2020/02/23 07:01