テーブルビューセルをコードから生成するには
Swift 3では、テーブルビューのセルはコードで作れるのでしょうか。もし可能であれば、テーブルビューの新しいセクションとして作った日付の配列(下記コード該当部分1)に対応するセルをコードで生成するには、どのように書くのかご教示いただけますか。付与するセルは次のとおりです。
var checkListItem: [String : Bool] = [
"アイテム1" : false,
"アイテム2" : false,
"アイテム3" : false,
"アイテム4" : false,
"アイテム5" : false
]
「swift セルをコードで作る」とネットで検索すると、以前のバージョンのコードはありましたがSwift 3では変換してもエラーが出て動きません。本を見てもストリーボードを使うのが前提になっています。
import UIKit
class ViewController : UIViewController, UITableViewDelegate, UITableViewDataSource {
//文字列の日付をDate型に変換するクラス
class DateUtils {
class func dateFromString(string: String, format: String) -> NSDate {
let formatter: DateFormatter = DateFormatter()
formatter.dateFormat = format
return formatter.date(from: string)! as NSDate
}
class func stringFromDate(date: NSDate, format: String) -> String {
let formatter: DateFormatter = DateFormatter()
formatter.dateFormat = format
return formatter.string(from: date as Date)
}
}
//テーブルビューのsectionに表示する日付の配列
var sectionTitle = ["2016-01-23","2015-12-31","2015-01-12","2016-02-21","2016-12-20"]
//今日と日付の配列の最後の日差分の日付を配列にするメソッド
func getDaysArrayToToday(start:String,max:Int) -> [String] {
//テーブルビューのsectionに表示する日付の配列の最後の日
let dateArraymax = sectionTitle.max()
// 日付の配列の最後の日をDate型に変換
let dateArraymaxdate = DateUtils.dateFromString(string: dateArraymax!, format: "yyyy/MM/dd")
//今日と日付の配列の最後の日差
let now = NSDate()
let dateDifference = Int(now.timeIntervalSince(dateArraymaxdate as Date)/60/60/24)
var result:[String] = []
let formatter = DateFormatter()
formatter.locale = NSLocale(localeIdentifier: "ja_JP") as Locale
formatter.dateFormat = "yyyy-MM-dd"
// 今日
let todayStr = formatter.string(from: Date())
let startDate = formatter.date(from: start)!
var components = DateComponents()
let calendar = Calendar(identifier: Calendar.Identifier.gregorian)
for i in 0 ..< max {
components.setValue(i,for: Calendar.Component.day)
let wk = calendar.date(byAdding: components, to: startDate)!
let wkStr = formatter.string(from: wk)
print(max)
if wkStr > todayStr {
break
} else {
result.append(wkStr)
}
let sectionTitle2 = getDaysArrayToToday(start: dateArraymax!,max: dateDifference)
//今日と日付の配列の最後の日差分の日付配列を元の日付配列に加える
sectionTitle.append(contentsOf: sectionTitle2)//該当部分1
}
return result
}
//今日と日付の配列の最後の日差分の日付配列をテーブルビューのsectionに表示する
func numberOfSections(in tableView: UITableView) -> Int // Default is 1 if not implemented
{
return sectionTitle.count
}
////
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? // fixed font style. use custom view (UILabel) if you want something different
{
return sectionTitle[section]
}
let statusBarHeight = UIApplication.shared.statusBarFrame.height
//セクションの項目
// チェックリストの項目とチェック状態
var checkListItem1: [String : Bool] = [
"アイテム1" : true,
"アイテム2" : false,
"アイテム3" : true,
"アイテム4" : true,
"アイテム5" : false
]
var checkListItem2: [String : Bool] = [
"アイテム2-1" : false,
"アイテム2-2" : true,
"アイテム2-3" : true,
"アイテム2-4" : true,
"アイテム2-5" : false
]
var checkListItem3: [String : Bool] = [
"アイテム3-1" : true,
"アイテム3-2" : true,
"アイテム3-3" : true,
"アイテム3-4" : true,
"アイテム3-5" : false
]
var checkListItem4: [String : Bool] = [
"アイテム4-1" : true,
"アイテム4-2" : false,
"アイテム4-3" : true,
"アイテム4-4" : false,
"アイテム4-5" : false
]
var checkListItem5: [String : Bool] = [
"アイテム5-1" : true,
"アイテム5-2" : false,
"アイテム5-3" : true,
"アイテム5-4" : true,
"アイテム5-5" : true
]
//
var tableData: [[String: Bool]] = []
let tableView = UITableView()
//
override func viewDidLoad() {
super.viewDidLoad()
// sectionを日付降順にソートする
sectionTitle = sectionTitle.sorted { $0 > $1 }
tableData = [checkListItem1, checkListItem2, checkListItem3, checkListItem4, checkListItem5]
// UITableView の作成
tableView.frame = CGRect(
x: 0,
y: statusBarHeight,
width: self.view.frame.width,
height: self.view.frame.height - statusBarHeight
)
tableView.delegate = self
tableView.dataSource = self
self.view.addSubview(tableView)
}
// セルの作成
//
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// tableDataの中から抽出
let sectionData = tableData[indexPath.section]
// キーで並び替え
let keys = sectionData.keys.sorted()
// キーの文字列を取得
let cellText = keys[indexPath.row]
// セルの作成とテキストの設定
let cell = UITableViewCell(style: .default, reuseIdentifier: "cell")
cell.textLabel?.text = cellText
///
let cellIscheckd = sectionData[cellText]
// チェック状態が true なら、初めからチェック状態にする
if cellIscheckd == true {
cell.imageView?.image = UIImage(named: "checked")
} else {
cell.imageView?.image = UIImage(named: "unchecked")
}
return cell
}
// セルがタップされた時の処理
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if let cell = tableView.cellForRow(at: indexPath) {
// タップしたセルのテキストを取得
let cellText = cell.textLabel?.text ?? ""
// 画像を切り替えと Dictonary の値を変更
if cell.imageView?.image == UIImage(named: "checked") {
self.tableData[indexPath.section][cellText] = false
cell.imageView?.image = UIImage(named: "unchecked")
} else {
self.tableData[indexPath.section][cellText] = true
cell.imageView?.image = UIImage(named: "checked")
}
// 選択状態を解除
cell.isSelected = false
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let sectionData = tableData[section]
return sectionData.count
}
}