2016-12-01 4 views
1

콜렉션 뷰를 사용하여 데이터 배열을 가져 오는 앱이 있습니다.콜렉션 뷰 셀에서 버튼처럼 구현하기

스토리 보드를 통해 컬렉션보기 셀에 버튼을 추가했습니다. 사용자가 버튼을 클릭하면 선택한 상태가 변경됩니다. 어느 것이 잘 작동하는지.

그런 다음 NSUserDefaults를 사용하여 키 "isSelected"에 대한 UIButton의 부울 값을 저장하고 검색하려고했습니다.

이것은 bool 값을 변경하고 NSUserDefault를 사용하여 저장하는 방법입니다.

@IBAction func likeBtn(_ sender: UIButton) { 

if sender.isSelected == false { 


      sender.isSelected = true 

      let defaults = UserDefaults.standard 

      defaults.set(true, forKey: "isSelected") 


     } 

     else { 


      sender.isSelected = false 

      let defaults = UserDefaults.standard 

      defaults.set(false, forKey: "isSelected") 


     } 
} 

그리고 내가있는 UIButton에 대한 부울 값을 가져 오는 시도 내 cellForItemAt의 indexPath에서 ..

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
     let cell = newsfeedColView.dequeueReusableCell(withReuseIdentifier: "NewsFeed", for: indexPath) as! NewsFeedCollectionViewCell 

     cell.likeBtn.addTarget(self, action: #selector(NewsFeedViewController.likeBtn(_:)), for: UIControlEvents.touchUpInside) 


     var defaults = UserDefaults.standard 

     var state = defaults.bool(forKey: "isSelected") 

     cell.likeBtn.isSelected = state 

return cell 

} 

모든 것이 내가 응용 프로그램을 사용하고 있습니다까지 잘 작동하지만 난 다시 응용 프로그램 오픈을 종료 할 때, 저장된 bool 값은 이전에 앱을 사용하여 선택한 셀에서가 아니라 각 셀의 UIButton에 할당됩니다.

NSUserDefault를 사용하여 저장하는 동안 인덱스 경로를 지정해야한다고 생각합니다. 그러나 내가 어떻게 신속하게 Xcode에 익숙한 지 알 수 없습니다. 앞으로 나아갈 방법에 대한 도움.

Screen Shot of the viewcontroller

어떤 도움이되었습니다 ...이 오랜 여기를 빨아 ..이 상황을 해결하는 방법을 알아낼 질수 ... 제발

..

+0

1) 사용자 정의를 수행 할 필요가 없습니다. 'likeBtn.isSelected'를 사용하여 여전히'cellForItemAt' 내의 버튼을 참조 할 수 있습니다. 2) userdefaults에'index.row'를 저장해야합니다. 3) 버튼은 viewController의 뷰와 관련이 있습니다. * 모든 * 세포. – Honey

+0

나는 유감 스럽다 그러나 나는 당신이 함축하고있는 것을 얻는 것을 didnt한다 ?? –

+0

어느 부분입니까? 1,2,3? – Honey

답변

0

당신은 그냥 모두를위한 하나 개의 값을 사용하는 것처럼 'selected'가 true 일 때 tableView의 행은 현재 일어나고있는 모든 것에 대해 사실입니다. 각 행에 대해 'selected'상태를 저장하려면 데이터베이스가 실제로 필요합니다. 그러나이 프로토 타입 일 경우 UserDefaults를 빠른 DB로 사용할 수 있습니다. 이렇게하려면 'isSelected'행마다 다른 키를 사용해야하고 버튼 태그를 키로 사용해야합니다.

@IBAction func likeBtn(_ sender: UIButton) 
{ 
    if sender.isSelected == false { 
    sender.isSelected = true 

    let defaults = UserDefaults.standard 
    defaults.set(true, forKey: "isSelected\(sender.tag)") 
    } 
    else { 
    sender.isSelected = false 
    let defaults = UserDefaults.standard 
    defaults.set(false, forKey: "isSelected\(sender.tag)") 
    } 
} 

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = newsfeedColView.dequeueReusableCell(withReuseIdentifier: "NewsFeed", for: indexPath) as! NewsFeedCollectionViewCell 

    cell.likeBtn.addTarget(self, action: #selector(NewsFeedViewController.likeBtn(_:)), for: UIControlEvents.touchUpInside) 

    let tag = indexPath.row 
    cell.likeBtn.tag = tag 
    var defaults = UserDefaults.standard 
    var state = defaults.bool(forKey: "isSelected\(tag)") 

    cell.likeBtn.isSelected = state 

    return cell 
} 
+0

이 솔루션을 사용해 보았지만 셀이 사라지거나 앱을 다시 실행하면 버튼의 선택된 상태가 기본 상태, 즉 false로 재설정됩니다. 내가 잘못하고있는 것을 알아 낸다. 이러한 문제를 해결하기위한 올바른 접근 방법인가 아니면 다른 접근법을 사용해야합니다. –

+0

이것을 달성 할 수 있습니다. ?? 이 문제를 해결하는 방법이 아니라면 .. –

관련 문제