2017-11-16 14 views
0

로드 할 때 다른 VC에서 데이터 (문자열)가 전달되는 collectionView가 있습니다. 이제이 데이터 (String)를 UICollectionReusabelView에 전달하려고합니다.Collectionview에서 UIcollectionResuableview로 데이터 전달

class PhotoDetailVC: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, PDHeaderViewDelegate { 



// Following variables are the ones to which the data is passed to. 
var image : String! 
var user: User! 
var post: Posts! 


@IBOutlet weak var collectionView: UICollectionView! 


override func viewDidLoad() { 
    super.viewDidLoad() 

    print(post.imageURL) 

    collectionView.delegate = self 
    collectionView.dataSource = self 

    setupCells() 
    increaseView() 
} 


func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { 
    let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "mainImage", for: indexPath) as! PDHeader 

    // I am setting the ReusableView properties through this section. Instead I just want to pass them to the header and then do stuff over there. 

    header.post = self.post 
    header.lol = post.postauthor 
    header.label.text = post.caption 
    header.label.sizeToFit() 
    header.delegate = self 
    let ref = URL(string: post.imageURL) 
    Nuke.loadImage(with: ref!, into: header.mainPic) 
    imageInHeaderForAuthor(author: post.postauthor, view: header.profilePic) 

    return header 
} 

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize { 

    let size = CGSize(width: collectionView.frame.width, height: collectionView.frame.height - 15) 
    return size 
} 


func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 

    let width = (collectionView.bounds.size.width/3) - 1 
    let size = CGSize(width: width, height: width) 
    return size 

} 

func collectionView(_ collectionView: UICollectionView, 
        layout collectionViewLayout: UICollectionViewLayout, 
        minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { 
    return 1.0 
} 

func collectionView(_ collectionView: UICollectionView, layout 
    collectionViewLayout: UICollectionViewLayout, 
        minimumLineSpacingForSectionAt section: Int) -> CGFloat { 
    return 1.0 
} 


func imageInHeaderForAuthor(author: String, view: UIImageView){ 
    FBDataservice.ds.REF_USERS.child(author).observeSingleEvent(of: .value, with: { (snapshot) in 
     if let allData = snapshot.value as? Dictionary<String, Any> { 
      if let cred = allData["credentials"] as? Dictionary<String, Any> { 
       let postuser = User(userid: author, userData: cred) 
       if postuser.userPic != nil { 
        let req = URL(string: postuser.userPic) 
        Nuke.loadImage(with: req!, into: view) 
       } 
      } 
     } 
    }) 
} 

} 

ReusableView : 나는 문제가있는 코드를 댓글을 달았

class PDHeader: UICollectionReusableView, FloatyDelegate { 

@IBOutlet weak var label: UILabel! 
@IBOutlet weak var mainPic: UIImageView! 
@IBOutlet weak var profilePic: UIImageView! 

var image : String! 
var post: Posts! 
var lol: String! 
var floaty = Floaty() 
var isOwner : Bool! 
var delegate: PDHeaderViewDelegate! 



override func awakeFromNib() { 
    super.awakeFromNib() 

    //This returns nil every time. 
    print(post.postauthor) 

    layoutFAB() 
    profilePic.makeCircle() 
    label.addDropShadow(opacity: 3, radius: 8) 

} 




func setDelegate(delegate: PDHeaderViewDelegate) { 
    self.delegate = delegate 
} 

func layoutFAB() { 
    floaty.openAnimationType = .pop 
    floaty.buttonImage = UIImage(named: "options") 
    floaty.addItem("Report", icon: UIImage(named: "trash")) { item in 
     self.delegate.fabReportClicked() 
    } 
    if isOwner{ 
     floaty.addItem("Edit Profile", icon: UIImage(named: "edit")) { item in 
      self.delegate.fabEditClicked() 
     } 
     floaty.addItem("Delete", icon: UIImage(named: "trash")) { item in 
      self.delegate.fabDeleteButton() 
     } 
    } 

    floaty.fabDelegate = self 
    floaty.buttonColor = UIColor.white 
    floaty.hasShadow = true 
    floaty.size = 45 
    addSubview(floaty) 
} 

} 

나는 다음 단계

CollectionViewVC을 수행하고있다. TL; DR - 컬렉션에서 데이터를 헤더로 전달하지 못하여 결과를 viewForSupplementaryElementOfKind에서 설정해야합니다.

여기 실제 문제는 무엇입니까? 데이터가 전달되기 전에 헤더가로드되고 있습니까? 그렇지 않다면 어떻게 해결할 수 있습니까? 나는 당신이이 옵션을 시도 할 수 있습니다 이해 한 경우

+0

1) 포스트 데이터로 awakeFromNib에서 전무를 항상 곁에 있습니다. 2) 모호함 ** header.post = self.post header.post = post.postauthor **. 변수에 두 번 설정하면 .. post.postauthour가 032가 될 수 있습니다. –

+0

내 질문을 편집했습니다. 코드 붙여 넣기 중 실수였습니까? –

+0

실제 문제는 언급하지 않았습니까? 이미지가로드되지 않습니까? –

답변

1

: 다음

class PDHeader: UICollectionReusableView, FloatyDelegate { 

    @IBOutlet weak var label: UILabel! 
    @IBOutlet weak var mainPic: UIImageView! 
    @IBOutlet weak var profilePic: UIImageView! 

    var image : String! 
    var lol: String! 
    var floaty = Floaty() 
    var isOwner : Bool! 
    var delegate: PDHeaderViewDelegate! 

    var post: Posts!{ 
     didSet { 
      lol = post.postauthor 
      label.text = post.caption 
      // etc ... 
     } 

: 변수가 아직 설정되지 않는

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { 
    let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "mainImage", for: indexPath) as! PDHeader 

    header.post = self.post 
    header.delegate = self 

    return header 
} 
+0

안녕하세요. 도움에 감사드립니다. 이 해결책은 꽤 잘 작동하지만,'did set' 스코프에서'lol'에 접근하자마자 nil을 반환합니다. –

+1

안녕하세요, 포스트 didSet 밖에서 lol 값을 사용해야 할 경우, 예를 들어 함수에서 같은 것을 할 수 있고 LOL didSet에서 호출 할 수 있습니다. 당신은 당신이 그것을 부르는 순간에 정해진 가치가 없기 때문에 아무 것도받지 못합니다. 그러나 ViewController에서 헤더 변수를 다시 사용하려면 헤더 게시물을 설정 한 후에 모든 값을 검색 할 수 있습니다. –

+0

환상적! 그게 내 직업이야! –