繁体   English   中英

Google Mobile Native Express广告iOS-[AnyObject]问题

[英]Google Mobile Native Express ads iOS - Issues with [AnyObject]

我正在尝试在我的iOS项目中快速实施Native Express Ads。

首先我上课

class Events {
  var _eventName: String!
  var _realDate: Date!

    var realDate: Date {
        if _realDate == nil {
            _realDate = nil
        }
        return _realDate
    }

    var eventName: String {
        if _eventName == nil {
            _eventName = ""
        }
        return _eventName
    }

//...
}

哪个类正在从Internet获取JSON,并且它填充了tableview。 我也有一些功能,例如搜索事件名称,还有一个按日期过滤事件的按钮。 所有这些都可以在下面的代码中正常工作

var eventData = [Events]()
var filteredEvents = [Events]()

eventData.sort() { $0.realDate < $1.realDate }

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        filteredEvents = eventData.filter { events in
            return events.eventName.lowercased().contains(searchText.lowercased())
        }

因此,虽然我从这里这里都遵循本地快递广告的示例

首先我改变了

var eventData = [Events]()
var filteredEvents = [Events]()

var eventData = [AnyObject]()
var filteredEvents = [AnyObject]()

因此,可以按照我在下面的函数addNativeExpressAds()所示将广告追加到数组中! 我对函数sort()filter有问题。

对于sort()它说Value of type 'AnyObject' has no member 'realDate'

对于filter它说Value of type 'AnyObject' has no member 'eventName'

更新1.在对Google进行了一些研究之后,我发现这可能是sort()函数的解决方案

eventData.sort() { (($0 as! Events).realDate ) < ($1 as! Events).realDate }

尽管eventData数组还包括GADNativeExpressAdView因为在我上面链接的示例中,此代码块下载了快速的原生广告并将其附加到AnyObject Array eventData请参见下文

func addNativeExpressAds() {
    var index = adInterval
    // Ensure subview layout has been performed before accessing subview sizes.
    nearMeTable.layoutIfNeeded()
    while index < eventData.count {
        let adSize = GADAdSizeFromCGSize(
            CGSize(width: nearMeTable.contentSize.width, height: adViewHeight))
        guard let adView = GADNativeExpressAdView(adSize: adSize) else {
            print("GADNativeExpressAdView failed to initialize at index \(index)")
            return
        }
        adView.adUnitID = adUnitID
        adView.rootViewController = self
        adView.delegate = self


        eventData.insert(adView, at: index) //here it inserts the ads
        adsToLoad.append(adView)
        loadStateForAds[adView] = false

        index += adInterval
    }
}

这样我得到了错误

Could not cast value of type 'GADNativeExpressAdView' (0x10046ebd8) to 'Events_Near_Me.Events' (0x10046fb90).

因此,我无法对任何对象的数组进行排序,从而导致数组中的GADNativeExpressAdView广告出现。

对这个有任何想法吗?

首先,在您的sort功能中,您必须强制转换! 转换为Event类型,但您的数组不仅仅包含Event对象。 因此,您强制执行强制转换,代码将失败。

eventData.sort { (first, second) in  
    if let first = first as? Event,
        let second = second as? Event {
        return first.realDate < second.realDate
    }
    if let fist = first as? GADNativeExpressAdView,
        let second = second as? GADNativeExpressAdView {
        return \\ compare?
    }

    return false
}

这是一个示例代码,我尚未对其进行测试以查看其是否按预期工作,但它应该为您提供如何进行操作的思路。

PS:我认为将数据与视图混合并不是一种好习惯。 您应该保持阵列中的视图干净,并且只包含数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM