質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.59%

tableViewControllerの返却処理のcountにエラー

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 561

score 8

Swiftで設定画面を作っています。
設定画面をtableViewController(A)で作成し、そのうちのcell(1)を新たなtableViewController(B)にshowでつなげました。
tableViewController(B)に対してcocoafileを作成し、コードを書きました。
すると、配列の長さを返却するコードにエラーが発生しました。
ご指摘していただける幸いです。
よろしくお願い致します。

発生している問題・エラーメッセージ

Value of type 'Int' has no member 'count'

該当のソースコード

return 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")
}

}
    

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

おそらくですがメンバ変数の section と func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int の引数の section で名前が被っており、引数の section: Int が呼ばれているのが原因だと思います。
下記のようにselfをつければ解決すると思います。

return self.section.count

コード部分はMarkdown記法 チートシートのようにバッククオートで囲った方がみやすいので回答がつきやすいと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/10 01:12

    ご回答ありがとうございます!
    sectionを改善したところ、エラーは改善され実行することができました。
    また、コードの書き方についてもURL添付でご指導していただきありがとうございます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る