๐Ÿ”ฅ ์—ญํ• 

  1. ๋ถ๋งˆํฌ ๋ทฐ - UICollectionView
  2. ๋งˆ์ดํŽ˜์ด์ง€ - UICollectionView
  3. UICollectionVIew HeaderView FooterView Custom Protocol

๐Ÿ”ฅ Trouble Shooting

  1. Cell์˜ ์ •ํ™•ํ•œ IndexPath ๊ฐ’์„ ๋„˜๊ฒจ ์ฃผ๋Š” ์ด์Šˆ
let cell = BookmarkDetailCollectionViewCell.dequeueReusableCell(to: collectionView, indexPath: indexPath)
cell.bookmarkCellIndexPath = indexPath
return cell

self.bookmarkList.remove(at: indexPath.item)
collectionView.deleteItems(at: [indexPath])

๊ธฐ์กด ์ฝ”๋“œ๋Š” ViewController์—์„œ cell์˜ indexPath ๊ฐ’์„ ๋„˜๊ฒจ ์ฃผ์—ˆ๋Š”๋ฐ, ํ•ด๋‹น cell์„ ํด๋กœ์ €๋กœ ๋„˜๊ฒจ ์ฃผ์—ˆ์„ ๊ฒฝ์šฐ ์œ ๋™์ ์œผ๋กœ ๋ณ€ํ•˜๋Š” indexPath ๊ฐ’์ด ์•„๋‹Œ, ๊ณ ์ •์ ์ธ IndexPath ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์—, bookmarkList์˜ ๋ฐ์ดํ„ฐ์™€ colelctionView์˜ item์˜ ๊ฐ’๋“ค์ด ๋‹ฌ๋ผ์„œ ์•ฑ์ด ๊ฐ•์ œ ์ข…๋ฃŒ ๋˜๋Š” ์ด์Šˆ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

func getIndexPath() -> IndexPath? {
	guard let superView = self.superview as? UICollectionView else { return nil }
	  return superView.indexPath(for: self)
 }

ํ•ด๋‹น cell์—์„œ์˜ ์ƒ์œ„๋ทฐ์ธ superView์— ์ ‘๊ทผํ•ด ํ•ด๋‹น cell์˜ ์ •ํ™•ํ•œ IndexPath ๋ฐ์ดํ„ฐ๋ฅผ ํด๋กœ์ €๋กœ ์ „๋‹ฌํ•ด ์ •ํ™•ํ•œ indexPath์— ์ ‘๊ทผํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  1. ์ง€์—ญ๋ณ€์ˆ˜์˜ ๋ฐ์ดํ„ฐ๋กœ collectionView์˜ item์„ ์‚ญ์ œํ•˜๊ณ  reload ํ–ˆ์„ ๋•Œ ๊ฐ•์ œ ์ข…๋ฃŒ ๋˜๋Š” ์ด์Šˆ
cell.bookmarkButtonClosure = { indexPath in
                Task {
                    do {
                        try await BookmarkService.shared.postBookmark(BookmarkRequest(articleId: self.bookmarkList[indexPath.item].articleID,
                                                                                      bookmarkStatus: !self.bookmarkList[indexPath.item].bookmarked))
                        self.bookmarkList.remove(at: indexPath.item)
                        collectionView.deleteItems(at: [indexPath])
                        LHToast.show(message: "๋ถ๋งˆํฌ๊ฐ€ ํ•ด์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค")
                    } catch {
                        guard let error = error as? NetworkError else { return }
                        self.handleError(error)
                    }
                }
            }

์˜ต์…”๋„ ๋ฐ”์ธ๋”ฉ์„ ์œ„ํ•ด ํด๋กœ์ € ์•ˆ์—์„œ guard let์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ฐ”์ธ๋”ฉํ•˜์—ฌ ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์˜€์œผ๋‚˜, ์ง€์—ญ ๋ณ€์ˆ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ณผ์ •์—์„œ reload ํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ฐ•์ œ ์ข…๋ฃŒ๊ฐ€ ๋˜์—ˆ๋‹ค.

์ถ”ํ›„์— ์ง€์—ญ ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹Œ, ์ „์—ญ ๋ณ€์ˆ˜๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ ๋ถ๋งˆํฌ ๋ฐ์ดํ„ฐ์™€ collectionView item์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.