#質問したいこと
いつもお世話になっております。今回もまたメモ帳アプリを作っていたら
Thread 1: EXC_BAD_ACCESS (code=2, address=0x16cf07fe0)
というエラーが出てきました。調べてみたのですが、どこをどう直せばいいのかわからず、聞いてみた次第です。
#コード
swift
1//ホーム画面 2import UIKit 3 4 5class ViewController: UIViewController,UITableViewDataSource,UITableViewDelegate { 6 7 @IBOutlet weak var memoTableView: UITableView! 8 9 var image: UIImage! 10 var saveArray: Array = [NSData]() 11 var memoArray = [String]() 12 13 let ud = UserDefaults.standard 14 15 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 16 tableView.reloadData() 17 return memoArray.count 18 } 19 20 21 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 22 let cell = tableView.dequeueReusableCell(withIdentifier: "memoCell", for: indexPath) as! TableViewCell 23 cell.cellLabel.text = memoArray[indexPath.row] 24 25 tableView.reloadData() 26 27 return cell 28 } 29 30 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 31 self.performSegue(withIdentifier: "toDetail", sender: nil) 32 //押したら押した状態を解除 33 tableView.deselectRow(at: indexPath, animated: true) 34 } 35 36 37 38 39 override func viewDidLoad() { 40 super.viewDidLoad() 41 42 memoTableView.delegate = self 43 memoTableView.dataSource = self 44 45 memoTableView.reloadData() 46 } 47 48 49 50 51 override func viewWillAppear(_ animated: Bool) { 52 loadMemo() 53 } 54 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 55 //destinationのクラッシュ防ぐ 56 if segue.identifier == "toDetail"{ 57 //detailViewControllerを取得 58 //as! DetailViewControllerでダウンキャストしている 59 let detailViewController = segue.destination as! DetailViewController 60 //遷移前に選ばれているCellが取得できる 61 let selectedIndexPath = memoTableView.indexPathForSelectedRow! 62 detailViewController.selectedMemo = memoArray[selectedIndexPath.row] 63 detailViewController.selectedRow = selectedIndexPath.row 64 } 65 } 66 func loadMemo(){ 67 if ud.array(forKey: "memoArray") != nil{ 68 //取得 またas!でアンラップしているのでnilじゃない時のみ 69 memoArray = ud.array(forKey: "memoArray") as![String] 70 //reloadしてくれる 71 memoTableView.reloadData() 72 } 73 } 74 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { 75 76 //アラート表示 77// deleteShowAlert() 78 79 80 if editingStyle == .delete { 81 82 //resultArray内のindexPathのrow番目をremove(消去)する 83 memoArray.remove(at: indexPath.row) 84 85 //再びアプリ内に消去した配列を保存 86 ud.set(memoArray, forKey: "memoArray") 87 88 89 //tableViewを更新 90 memoTableView.reloadData() 91 } 92 } 93} 94
swift
1//ホーム画面のtableViewCell 2import UIKit 3 4 5 6class TableViewCell: UITableViewCell { 7 8 @IBOutlet weak var cellImage: UIImageView! 9 @IBOutlet weak var cellLabel: UILabel! 10 11 let uuid = NSUUID().uuidString 12 13 override func awakeFromNib() { 14 super.awakeFromNib() 15 16 let imageData:NSData = UserDefaults.standard.object(forKey: "saveImage") as! NSData 17 cellImage.image = UIImage(data: imageData as Data) 18 // Initialization code 19 } 20 21 override func setSelected(_ selected: Bool, animated: Bool) { 22 super.setSelected(selected, animated: animated) 23 24 // Configure the view for the selected state 25 } 26 27 //ここを追加 28 func fill(image: UIImageView, titleLb: String, date: String, siteName: String){ 29 cellImage.image = imageView?.image 30 31 } 32 33 // 追加 34 override func prepareForReuse() { 35 super.prepareForReuse() 36 cellImage.image = imageView?.image 37 38 } 39 40 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 41 let cell = tableView.dequeueReusableCell(withIdentifier: "tableViewCell", for: indexPath) as! TableViewCell 42 //画像を初期化 43 cellImage.image = nil 44 return cell 45 } 46 47 48} 49
#やってみたこと(追記)
https://teratail.com/questions/146787Swift次のコードでThread 1: EXC_BAD_ACCESS (code=2, address=0x110d75ea8)のエラーがでます。。
をみてみましたが、カスタムクラスが間違っているとうはありませんでした。
#エラー
error
1Thread 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
ありがとうございます。
回答2件
あなたの回答
tips
プレビュー