如何在当前收藏夹视图中显示xib

时间:2020-02-02 22:57:00

标签: ios swift uicollectionview admob ads

这是我第一次使用Google AdMob原生广告,我相信我遵循了实施说明。.剩下的实际上是在集合视图中显示广告,这就是我要坚持的地方。我不知道如何在用户上传的帖子之间正确显示广告。基本上,我需要将xib添加到集合视图的帮助。任务:滚动帖子时应填充广告。

我正在使用

收藏夹视图 锡伯 Google AdMob本机高级

我也没有收到任何错误或崩溃,并且控制台打印出来,所以我显然做错了。。收到本地广告:

控制台还-print(“广告不会令人失望”)和print(“不是我想要的”)

在这里输入我的代码

import UIKit
import Firebase


class FollowingFeedViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UISearchBarDelegate, FeedCellDelegate, PeopleToFollowDelegate,  GADUnifiedNativeAdLoaderDelegate {



    // MARK: - Google ADMob

       /// The ad unit ID from the AdMob UI.
        let adUnitID = "ca-app-pub-3940256099942544/3986624511"


        /// The number of native ads to load (between 1 and 5 for this example).
        let numAdsToLoad = 5

        /// The native ads.
        var nativeAds = [GADUnifiedNativeAd]()

        /// The ad loader that loads the native ads.
        var adLoader: GADAdLoader!

        func adLoaderDidFinishLoading(_ adLoader: GADAdLoader) {

             addNativeAds() 
     }

       func adLoader(_ adLoader: GADAdLoader, didReceive nativeAd: GADUnifiedNativeAd) {
        print("Received native ad: \(nativeAd)")

        // Add the native ad to the list of native ads.
        nativeAds.append(nativeAd)
    }

     func adLoader(_ adLoader: GADAdLoader, didFailToReceiveAdWithError error: GADRequestError) {
        print("\(adLoader) failed with error: \(error.localizedDescription)")

    }


    /// Add native ads to the  list.
     func addNativeAds() {
       if nativeAds.count <= 0 {
       print("Ads not dispalying ")
        return
       }

       let adInterval = (posts.count / nativeAds.count) + 1
       var index = 0
       for nativeAd in nativeAds {
         if index < collectionObject.count {
           collectionObject.insert(nativeAd, at: index)
           index += adInterval
         } else {
            print("Not what I want")

           break
         }
       }
     }

 // MARK: - Properties

    var posts = [Post]()
    var collectionObject = [AnyObject]()
    var viewSinglePost = false
    var post: Post?
    var currentKey: String?
    var userProfileController: ProfileViewController?
    var header: FeedReusableView?
    @IBOutlet weak var collectionView: UICollectionView!

 // MARK: - UICollectionViewDataSource

     func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
        if posts.count > 4 {
            if indexPath.item == posts.count - 1 {
                fetchPosts()

            }
        }
    }




    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }

     func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

            return posts.count


    }

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "PostsCell", for: indexPath) as? FollowingCell {

            cell.delegate = self
            cell.post = posts[indexPath.item] as Post


            handleUsernameLabelTapped(forCell: cell)
            handleMentionTapped(forCell: cell)
            handleHashtagTapped(forCell: cell)

            return cell

     } else {

    let nativeAd = collectionObject[indexPath.row] as! GADUnifiedNativeAd

            nativeAd.rootViewController = self

            let nativeAdCell = collectionView.dequeueReusableCell(withReuseIdentifier: "UnifiedNativeAdCell", for: indexPath)

            // Get the ad view from the Cell. The view hierarchy for this cell is defined in

                 let adView : GADUnifiedNativeAdView = nativeAdCell.contentView.subviews
                   .first as! GADUnifiedNativeAdView

            // Associate the ad view with the ad object.
            // This is required to make the ad clickable.

            adView.nativeAd = nativeAd

            adView.mediaView?.mediaContent = nativeAd.mediaContent

            // Populate the ad view with the ad assets.
            (adView.headlineView as! UILabel).text = nativeAd.headline
            (adView.advertiserView as! UILabel).text = nativeAd.advertiser
            (adView.bodyView as! UILabel).text = nativeAd.body
            adView.bodyView?.isHidden = nativeAd.body == nil
            (adView.iconView as? UIImageView)?.image = nativeAd.icon?.image
            adView.iconView?.isHidden = nativeAd.icon == nil

            // In order for the SDK to process touch events properly, user interaction
            // should be disabled.
            adView.callToActionView?.isUserInteractionEnabled = false


        return nativeAdCell


        }


    }

 // MARK: - ViewDidLoad

    override func viewDidLoad() {
        super.viewDidLoad()

//        // Google Admob
        let options = GADMultipleAdsAdLoaderOptions()
        options.numberOfAds = numAdsToLoad

  // Prepare the ad loader and start loading ads.
     adLoader = GADAdLoader(adUnitID: adUnitID,
      rootViewController: self,
      adTypes: [.unifiedNative],
      options: [options])


 collectionView.dataSource = self
 collectionView.delegate = self

 adLoader.delegate = self
 adLoader.load(GADRequest())

self.collectionView.register(UINib(nibName: "NativeAdCell", bundle: nil), forCellWithReuseIdentifier: "UnifiedNativeAdCell")

        addNativeAds()

}

  @objc func handleRefresh() {
        posts.removeAll(keepingCapacity: false)
        self.currentKey = nil
        fetchPosts()
        collectionView?.reloadData()
        header?.profilesCollectionView.reloadData()


    }



}

获取帖子


func fetchPosts() {
        guard let currentUid = Auth.auth().currentUser?.uid else { return }

        if currentKey == nil {
            USER_FEED_REF.child(currentUid).queryLimited(toLast: 5).observeSingleEvent(of: .value, with: { (snapshot) in
                self.collectionView?.refreshControl?.endRefreshing()

                guard let first = snapshot.children.allObjects.first as? DataSnapshot else { return }
                guard let allObjects = snapshot.children.allObjects as? [DataSnapshot] else { return }

                allObjects.forEach({ (snapshot) in
                    let postId = snapshot.key
                    self.fetchPost(withPostId: postId)
                })
                self.currentKey = first.key
            })
        } else {

            USER_FEED_REF.child(currentUid).queryOrderedByKey().queryEnding(atValue: self.currentKey).queryLimited(toLast: 6).observeSingleEvent(of: .value, with: { (snapshot) in

                guard let first = snapshot.children.allObjects.first as? DataSnapshot else { return }
                guard let allObjects = snapshot.children.allObjects as? [DataSnapshot] else { return }

                allObjects.forEach({ (snapshot) in
                    let postId = snapshot.key
                    if postId != self.currentKey {
                        self.fetchPost(withPostId: postId)
                    }
                })
                self.currentKey = first.key
            })
        }
    }

 func fetchPost(withPostId postId: String) {
        Database.fetchPost(with: postId) { (post) in
            self.posts.append(post)

            self.posts.sort(by: { (post1, post2) -> Bool in
            return post1.creationDate > post2.creationDate
            })
            self.collectionView?.reloadData()
        }
    }

}



3 个答案:

答案 0 :(得分:1)

您的FollowingFeedViewController不是UICollectionViewController的子类,对吗?因此,您应该设置collectionView实例的 delegate dataSource 属性。

大概是这样的:

override func viewDidLoad() {
  super.viewDidLoad()
  collectionView.delegate = self
  collectionView.dataSource = self
}

答案 1 :(得分:0)

看起来至少您的某些代码丢失了。我看不到fetchPosts方法。

我注意到handleRefresh在reloadData之前调用fetchPosts。 fetchPosts是同步还是异步加载数据?如果它异步加载数据,则在数据准备就绪之前将调用reloadData。

与广告类似。广告准备好后,我看不到对集合视图的任何reloadData(或等效方法)调用。如果您发布完整代码,则更容易诊断问题。

答案 2 :(得分:0)

我认为这会起作用,从您的代码中可以看到,您有两个数据源

var posts = [Post]()
var collectionObject = [AnyObject]()

,您要为其创建所有单元格,但是要显示的唯一数据源是基于代码的posts

func numberOfSections(in collectionView: UICollectionView) -> Int {
    return 1
}

 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return posts.count
}

可以通过将代码更改为类似

的方法来解决
func numberOfSections(in collectionView: UICollectionView) -> Int {
    return 2
}

 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        if (section == 0) {
            return posts.count
        } else {
            return collectionObject.count
        }
}

 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    if (indexPath.section == 0) {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "PostsCell", for: indexPath) as FollowingCell 

            cell.delegate = self
            cell.post = posts[indexPath.item] as Post


            handleUsernameLabelTapped(forCell: cell)
            handleMentionTapped(forCell: cell)
            handleHashtagTapped(forCell: cell)

            return cell

    } else {
        let nativeAd = collectionObject[indexPath.row] as! GADUnifiedNativeAd

        nativeAd.rootViewController = self

        let nativeAdCell = collectionView.dequeueReusableCell(withReuseIdentifier: "UnifiedNativeAdCell", for: indexPath)

        // Get the ad view from the Cell. The view hierarchy for this cell is defined in

             let adView : GADUnifiedNativeAdView = nativeAdCell.contentView.subviews
               .first as! GADUnifiedNativeAdView

        // Associate the ad view with the ad object.
        // This is required to make the ad clickable.

        adView.nativeAd = nativeAd

        adView.mediaView?.mediaContent = nativeAd.mediaContent

        // Populate the ad view with the ad assets.
        (adView.headlineView as! UILabel).text = nativeAd.headline
        (adView.advertiserView as! UILabel).text = nativeAd.advertiser
        (adView.bodyView as! UILabel).text = nativeAd.body
        adView.bodyView?.isHidden = nativeAd.body == nil
        (adView.iconView as? UIImageView)?.image = nativeAd.icon?.image
        adView.iconView?.isHidden = nativeAd.icon == nil

        // In order for the SDK to process touch events properly, user interaction
        // should be disabled.
        adView.callToActionView?.isUserInteractionEnabled = false


    return nativeAdCell


    }

}

此代码首先添加帖子,然后开始添加您的添加内容。 检查一下,让我知道它是否有效。如果这显示了单元格,则可以将两个数据源混合在一起,并使用条件填充集合视图单元格,例如,如果您创建新对象,并用当前对象postscollectionObject

if indexPath.item % 4 == 0 {
   show adds
} else {
   show posts
}

希望这会有所帮助