テーブルビューセルに辞書型データを表示させるコードで、キー配列やデータ取得の問題が
テーブルビューのセルに辞書型の配列を表示させるコードで、辞書のキー配列やデータを取得するところがわかりません。ご教示いただけますか。ご回答に感謝します。
エラーは、次のとおりです。
①Ambiguous reference to member 'subscript'(109行目)
②Value of type '[[String : Bool]]' has no member 'updateValue'(123、148行目)
③Value of type '[[String : Bool]]' has no member 'keys'」(152行目)
ネットで探して試しましたが、解決できるものは見つかりませんでした。
import UIKit
class ViewController : UIViewController, UITableViewDelegate, UITableViewDataSource {
////
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 + 200
//セクションの項目
var sectionTitle = ["H28,01,23","H27,12,31","H28,01,12","H28,02,21","H28,11,10"]
// チェックリストの項目とチェック状態
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 = [checkListItem1, checkListItem2, checkListItem3, checkListItem4, checkListItem5]
var tableData: [[String: Bool]] = []
let tableView = UITableView()
override func viewDidLoad() {
super.viewDidLoad()
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 {
// Dictonary のキーの配列を取得
// string.characters.count
var keys = [String](tableData.keys) //<ーエラー①
// キーで並び替え
keys.sort()
// キーの文字列を取得
let cellText = keys[indexPath.row]
// セルの作成とテキストの設定
let cell = UITableViewCell(style: .default, reuseIdentifier: "cell")
cell.textLabel?.text = cellText
///
let sectionData = tableData[(indexPath as NSIndexPath).section]//<ーエラー②
let cellData = sectionData[(indexPath as NSIndexPath).row]
// チェック状態が true なら、初めからチェック状態にする
if self.tableData[cellText]! {
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.updateValue(false, forKey: cellText!)//<ーエラー③
cell.imageView?.image = UIImage(named: "unchecked")
} else {
self.tableData.updateValue(true, forKey: cellText!)//<ーエラー③
cell.imageView?.image = UIImage(named: "checked")
}
// 選択状態を解除
cell.isSelected = false
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let sectionData = tableData[section]
return self.tableData.count
}
}
前回の質問
テーブルビューを作成中の「Cannot use instance member…」エラー