#質問したいこと
いつもお世話になっております。今回もまたメモ帳アプリを作っていたら
Thread 1: EXC_BAD_ACCESS (code=2, address=0x16cf07fe0)
というエラーが出てきました。調べてみたのですが、どこをどう直せばいいのかわからず、聞いてみた次第です。
#コード
swift
//ホーム画面 import UIKit class ViewController: UIViewController,UITableViewDataSource,UITableViewDelegate { @IBOutlet weak var memoTableView: UITableView! var image: UIImage! var saveArray: Array = [NSData]() var memoArray = [String]() let ud = UserDefaults.standard func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { tableView.reloadData() return memoArray.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "memoCell", for: indexPath) as! TableViewCell cell.cellLabel.text = memoArray[indexPath.row] tableView.reloadData() return cell } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { self.performSegue(withIdentifier: "toDetail", sender: nil) //押したら押した状態を解除 tableView.deselectRow(at: indexPath, animated: true) } override func viewDidLoad() { super.viewDidLoad() memoTableView.delegate = self memoTableView.dataSource = self memoTableView.reloadData() } override func viewWillAppear(_ animated: Bool) { loadMemo() } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { //destinationのクラッシュ防ぐ if segue.identifier == "toDetail"{ //detailViewControllerを取得 //as! DetailViewControllerでダウンキャストしている let detailViewController = segue.destination as! DetailViewController //遷移前に選ばれているCellが取得できる let selectedIndexPath = memoTableView.indexPathForSelectedRow! detailViewController.selectedMemo = memoArray[selectedIndexPath.row] detailViewController.selectedRow = selectedIndexPath.row } } func loadMemo(){ if ud.array(forKey: "memoArray") != nil{ //取得 またas!でアンラップしているのでnilじゃない時のみ memoArray = ud.array(forKey: "memoArray") as![String] //reloadしてくれる memoTableView.reloadData() } } func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { //アラート表示 // deleteShowAlert() if editingStyle == .delete { //resultArray内のindexPathのrow番目をremove(消去)する memoArray.remove(at: indexPath.row) //再びアプリ内に消去した配列を保存 ud.set(memoArray, forKey: "memoArray") //tableViewを更新 memoTableView.reloadData() } } }
swift
//ホーム画面のtableViewCell import UIKit class TableViewCell: UITableViewCell { @IBOutlet weak var cellImage: UIImageView! @IBOutlet weak var cellLabel: UILabel! let uuid = NSUUID().uuidString override func awakeFromNib() { super.awakeFromNib() let imageData:NSData = UserDefaults.standard.object(forKey: "saveImage") as! NSData cellImage.image = UIImage(data: imageData as Data) // Initialization code } override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) // Configure the view for the selected state } //ここを追加 func fill(image: UIImageView, titleLb: String, date: String, siteName: String){ cellImage.image = imageView?.image } // 追加 override func prepareForReuse() { super.prepareForReuse() cellImage.image = imageView?.image } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "tableViewCell", for: indexPath) as! TableViewCell //画像を初期化 cellImage.image = nil return cell } }
#やってみたこと(追記)
https://teratail.com/questions/146787Swift次のコードでThread 1: EXC_BAD_ACCESS (code=2, address=0x110d75ea8)のエラーがでます。。
をみてみましたが、カスタムクラスが間違っているとうはありませんでした。
#エラー
error
Thread 1: EXC_BAD_ACCESS (code=2, address=0x16cf07fe0)
#追記
ログの部分
エラーの部分
至急よろしくお願いします。
EXC_BAD_ACCESS系って自分の経験的に、xibファイルとコードの連携がうまくできてないときに出るメッセージな感じがしてます。
具体的にどのソースコードの行でEXC_BAD_ACCESSになってるかエラーメッセージからわかりますか?
早速ありがとうございます!
エラーメッセージが(11db)としか書いていなくて、どうすればいいかわからない状態です。
ログのところにフィルターかけてませんか?
フィルターかけてません。
写真追加してみました。
上の画像のときに、ソースコード上でハイライトされてる行ってどこになります?
どこかよくわからないので、追記で画像のせておきました。
ViewControllerのViewdidLoadっぽいのでコードみてみましたが、
override func viewDidLoad() {
super.viewDidLoad()
memoTableView.delegate = self
memoTableView.dataSource = self
memoTableView.reloadData()
}
とかいてあります。
ありがとうございます。
ViewDidLoadのタイミングですね
そうです!

1:ViewControllerのsuper.viewDidLoad()の下に、print("memoTableView:" , memoTableView)と書くと、コンソールに何が出力されますか?
2: numberOfRowsInSectionのtableView.reloadData()をコメントアウトするとどうなりますか?
3: cellForRowAtが、カスタムセルの中にありますが、これでビルドできてますか?
取り敢えず1から一つずつ試してみてください
ソースコードってどっかから拾って自分で修正した感じですか?
1:memoTableView: Optional(<UITableView: 0x1268c9000; frame = (0 88; 414 808); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x28206fcc0>; layer = <CALayer: 0x282e2b860>; contentOffset: {0, 0}; contentSize: {0, 0}; adjustedContentInset: {0, 0, 0, 0}; dataSource: (null)>)が表示されます。
2:違うThread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional valueというエラーが出されます。tableViewCellの26行目
let imageData:NSData = UserDefaults.standard.object(forKey: "saveImage") as! NSData
に問題があると言われています。
3:前までビルドできていました。
ソースコードは色々なサイトの物を組み合わせたりしています。

2のコメントアウトで、エラーが変わったと言うことですか?
そうです。

コード読みました、私にはあなたが何をしたいか理解できないので、お役に立てないと思います。ごめんなさい。
そのエラーは、データがないか、キャストできないってことなので、安全にアンラップしてあげてください。
もう少し基礎的なところに戻って一つ一つ確実にこなしてみるのが良いと思います。
わざわざありがとうございます。

以前の質問に掲載されているtableViewのコードには、辺なところにreloadData()があったりしないので、画像を扱いたいためにカスタムセルでつまっているのかな?
カスタムセルのUILabelに文字列を渡すだけのtableViewをつくってみてなれてみてはどうでしょうか?
https://yuu.1000quu.com/use_a_custom_cell_in_swift
ありがとうございます。
まだ回答がついていません
会員登録して回答してみよう