Swiftで設定画面を作っています。
設定画面をtableViewController(A)で作成し、そのうちのcell(1)を新たなtableViewController(B)にshowでつなげました。
tableViewController(B)に対してcocoafileを作成し、コードを書きました。
すると、配列の長さを返却するコードにエラーが発生しました。
ご指摘していただける幸いです。
よろしくお願い致します。
発生している問題・エラーメッセージ
Value of type 'Int' has no member 'count'
該当のソースコード
swift
1return section.count
試したこと
初めはtableViewController(A)のcocoafileに書いていましたが、tableViewController(A)のcellを表示する** override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int**にエラーが発生したため、fileを分割したところそちらのエラーが消えて新たにcountにエラーが発生しました。
サンプルのコードをコピペしても改善されないためコードに誤りはないと思います。
補足情報(FW/ツールのバージョンなど)
xcode11.1を使用しています。
入力したコードをこちらに貼っておきます。
import UIKit
class CategoryTableViewController: UITableViewController {
override func viewDidLoad() { super.viewDidLoad() // 保存しているToDoの読み込み処理 let userDefaults = UserDefaults.standard if let storedTodoList = userDefaults.object(forKey: "section") as? Data { do { if let unarchiveTodoList = try NSKeyedUnarchiver.unarchivedObject(ofClasses: [NSArray.self, Cathouse.self], from: storedTodoList) as? [Cathouse] { section.append(contentsOf: unarchiveTodoList) } } catch { // エラー処理なし } } } var section = [Cathouse]() @IBAction func addCategory(_ sender: Any) { let alertController = UIAlertController(title: "カテゴリー追加", message: "カテゴリーを追加してください", preferredStyle: UIAlertController.Style.alert) alertController.addTextField(configurationHandler: nil) let okAction = UIAlertAction(title: "OK", style: UIAlertAction.Style.default) {(action: UIAlertAction) in if let textField = alertController.textFields?.first { let catHouse = Cathouse() catHouse.catTitle = textField.text! self.section.insert(catHouse, at: 0) self.tableView.insertRows(at: [IndexPath(row: 0, section: 0)], with: UITableView.RowAnimation.right) // ToDoの保存処理 let userDefaults = UserDefaults.standard // Data型にシリアライズする do { let data = try NSKeyedArchiver.archivedData(withRootObject: self.section, requiringSecureCoding: true) userDefaults.set(data, forKey: "todoList") userDefaults.synchronize() } catch { // エラー処理なし } } } alertController.addAction(okAction) let cancelButton = UIAlertAction(title: "CANCEL", style: UIAlertAction.Style.cancel, handler: nil) alertController.addAction(cancelButton) present(alertController, animated: true, completion: nil) } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // Todoの配列の長さを返却する ###return section.count } // テーブルの行ごとのセルを返却する override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // Storyboardで指定したtodoCell識別子を利用して再利用可能なセルを取得する let cell = tableView.dequeueReusableCell(withIdentifier: "catecell", for: indexPath) // 行番号に合ったToDoの情報を取得 let catHouse = section[indexPath.row] // セルのラベルにToDoのタイトルをセット cell.textLabel?.text = catHouse.catTitle } // セルをタップしたときの処理 override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let catHouse = section[indexPath.row] if catHouse.catDone { // 完了済みの場合は未完了に変更 catHouse.catDone = false } else { // 未完の場合は完了済みに変更 catHouse.catDone = true } // セルの状態を変更 tableView.reloadRows(at: [indexPath], with: UITableView.RowAnimation.fade) // データ保存。Data型にシリアライズする do { let data: Data = try NSKeyedArchiver.archivedData(withRootObject: section as Array, requiringSecureCoding: true) // UserDefaultsに保存 let userDefaults = UserDefaults.standard userDefaults.set(data, forKey: "section") userDefaults.synchronize() } catch { } } // セルを削除したときの処理 override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { // 削除処理かどうか if editingStyle == UITableViewCell.EditingStyle.delete { // ToDoリストから削除 section.remove(at: indexPath.row) // セルを削除 tableView.deleteRows(at: [indexPath], with: UITableView.RowAnimation.fade) // データ保存。Data型にシリアライズする do { let data: Data = try NSKeyedArchiver.archivedData(withRootObject: section, requiringSecureCoding: true) // UserDefaultsに保存 let userDefaults = UserDefaults.standard userDefaults.set(data, forKey: "catList") userDefaults.synchronize() } catch { // エラー処理なし } } } } // 独自クラスをシリアライズする際には、NSObjectを継承し // NSSecureCodingプロトコルに準拠する必要がある class Cathouse: NSObject, NSSecureCoding { static var supportsSecureCoding: Bool { return true } // ToDoのタイトル var catTitle: String? // ToDoを完了したかどうかを表すフラグ var catDone: Bool = false // コンストラクタ override init() { } // NSCodingプロトコルに宣言されているデシリアライズ処理。デコード処理とも呼ばれる required init?(coder aDecoder: NSCoder) { catTitle = aDecoder.decodeObject(forKey: "catTitle") as? String catDone = aDecoder.decodeBool(forKey: "catDone") } // NSCodingプロトコルに宣言されているシリアライズ処理。エンコード処理とも呼ばれる func encode(with aCoder: NSCoder) { aCoder.encode(catTitle, forKey: "catTitle") aCoder.encode(catDone, forKey: "catDone") } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/09 16:12