2017-11-16 1 views
0

ロード時に別のVCからデータ(String)が渡されるコレクションビューがあります。今、このデータ(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にnilをなかれます。 2)あいまいさがあります** header.post = self.post header.post = post.postauthor **。変数に2回設定すると、post.postauthourがnilになることがあります –

+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

ねえ、助けてくれてありがとう。この解決法はかなりうまく動作しますが、 'didSet'スコープの' lol'にアクセスしようとするとすぐにnilが返されます –

+1

こんにちは、関数の中で投稿didSetの外にlol値を使用する必要がある場合は、同じことをしてlol didSetで呼び出すことができます。あなたが呼んでいる瞬間に値が設定されていないので、あなたはゼロになっています。しかし、ViewControllerでヘッダー変数を再利用する場合は、ヘッダーポストを設定した後、すべての値を取得できます。 –

+0

素晴らしい!それが私の仕事です! –

関連する問題