iosswiftstoryboardxiboutlet

Unable to set IBOutlet correctly in xib file Swift IOS


I'm new to Swift and I'm trying to implement a Native google ad inside my Flutter project. I followed step by step documentation to create the native ad in swift but now I'm not able to link the outlet with my factory.

I tried to link the view by drag it to the factory class :

enter image description here

But I'm getting this error :

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<NSObject 0x28140cd90> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key advertiserView.'
terminating with uncaught exception of type NSException

It seems that the first outlet is causing crash because it doesn't recognize it.

According the documentation I followed to implement this, there are no IBOutlet in the code but only linked inside the .xib file.

How can I correctly do this ?


Solution

  • Check if you have the GADNativeAd header file in your Runner folder.

    To create the header file, simply right click on the Runner folder => new File... and then choose Header.

    Name it GADNativeAd and copy the code below inside. You will now be able to bind your outlets.

    //
    //  GADNativeAd.h
    //  Google Mobile Ads SDK
    //
    //  Copyright 2017 Google LLC. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import <GoogleMobileAds/GADAdChoicesView.h>
    #import <GoogleMobileAds/GADAdLoaderDelegate.h>
    #import <GoogleMobileAds/GADAdValue.h>
    #import <GoogleMobileAds/GADMediaContent.h>
    #import <GoogleMobileAds/GADMediaView.h>
    #import <GoogleMobileAds/GADMuteThisAdReason.h>
    #import <GoogleMobileAds/GADNativeAdAssetIdentifiers.h>
    #import <GoogleMobileAds/GADNativeAdDelegate.h>
    #import <GoogleMobileAds/GADNativeAdImage.h>
    #import <GoogleMobileAds/GADResponseInfo.h>
    #import <GoogleMobileAds/GADVideoController.h>
    #import <UIKit/UIKit.h>
    
    /// Native ad. To request this ad type, pass kGADAdLoaderAdTypeNative
    /// (see GADAdLoaderAdTypes.h) to the |adTypes| parameter in GADAdLoader's initializer method. If
    /// you request this ad type, your delegate must conform to the GADNativeAdLoaderDelegate
    /// protocol.
    @interface GADNativeAd : NSObject
    
    #pragma mark - Must be displayed if available
    
    /// Headline.
    @property(nonatomic, readonly, copy, nullable) NSString *headline;
    
    #pragma mark - Recommended to display
    
    /// Text that encourages user to take some action with the ad. For example "Install".
    @property(nonatomic, readonly, copy, nullable) NSString *callToAction;
    /// Icon image.
    @property(nonatomic, readonly, strong, nullable) GADNativeAdImage *icon;
    /// Description.
    @property(nonatomic, readonly, copy, nullable) NSString *body;
    /// Array of GADNativeAdImage objects.
    @property(nonatomic, readonly, strong, nullable) NSArray<GADNativeAdImage *> *images;
    /// App store rating (0 to 5).
    @property(nonatomic, readonly, copy, nullable) NSDecimalNumber *starRating;
    /// The app store name. For example, "App Store".
    @property(nonatomic, readonly, copy, nullable) NSString *store;
    /// String representation of the app's price.
    @property(nonatomic, readonly, copy, nullable) NSString *price;
    /// Identifies the advertiser. For example, the advertiser’s name or visible URL.
    @property(nonatomic, readonly, copy, nullable) NSString *advertiser;
    /// Media content. Set the associated media view's mediaContent property to this object to display
    /// this content.
    @property(nonatomic, readonly, nonnull) GADMediaContent *mediaContent;
    
    #pragma mark - Other properties
    
    /// Optional delegate to receive state change notifications.
    @property(nonatomic, weak, nullable) id<GADNativeAdDelegate> delegate;
    
    /// Reference to a root view controller that is used by the ad to present full screen content after
    /// the user interacts with the ad. The root view controller is most commonly the view controller
    /// displaying the ad.
    @property(nonatomic, weak, nullable) UIViewController *rootViewController;
    
    /// Dictionary of assets which aren't processed by the receiver.
    @property(nonatomic, readonly, copy, nullable) NSDictionary<NSString *, id> *extraAssets;
    
    /// Information about the ad response that returned the ad.
    @property(nonatomic, readonly, nonnull) GADResponseInfo *responseInfo;
    
    /// Called when the ad is estimated to have earned money. Available for allowlisted accounts only.
    @property(nonatomic, nullable, copy) GADPaidEventHandler paidEventHandler;
    
    /// Indicates whether custom Mute This Ad is available for the native ad.
    @property(nonatomic, readonly, getter=isCustomMuteThisAdAvailable) BOOL customMuteThisAdAvailable;
    
    /// An array of Mute This Ad reasons used to render customized mute ad survey. Use this array to
    /// implement your own Mute This Ad feature only when customMuteThisAdAvailable is YES.
    @property(nonatomic, readonly, nullable) NSArray<GADMuteThisAdReason *> *muteThisAdReasons;
    
    /// Registers ad view, clickable asset views, and nonclickable asset views with this native ad.
    /// Media view shouldn't be registered as clickable.
    /// @param clickableAssetViews Dictionary of asset views that are clickable, keyed by asset IDs.
    /// @param nonclickableAssetViews Dictionary of asset views that are not clickable, keyed by asset
    ///        IDs.
    - (void)registerAdView:(nonnull UIView *)adView
           clickableAssetViews:
               (nonnull NSDictionary<GADNativeAssetIdentifier, UIView *> *)clickableAssetViews
        nonclickableAssetViews:
            (nonnull NSDictionary<GADNativeAssetIdentifier, UIView *> *)nonclickableAssetViews;
    
    /// Unregisters ad view from this native ad. The corresponding asset views will also be
    /// unregistered.
    - (void)unregisterAdView;
    
    /// Reports the mute event with the mute reason selected by user. Use nil if no reason was selected.
    /// Call this method only if customMuteThisAdAvailable is YES.
    - (void)muteThisAdWithReason:(nullable GADMuteThisAdReason *)reason;
    
    @end
    
    #pragma mark - Protocol and constants
    
    /// The delegate of a GADAdLoader object implements this protocol to receive GADNativeAd ads.
    @protocol GADNativeAdLoaderDelegate <GADAdLoaderDelegate>
    /// Called when a native ad is received.
    - (void)adLoader:(nonnull GADAdLoader *)adLoader didReceiveNativeAd:(nonnull GADNativeAd *)nativeAd;
    @end
    
    #pragma mark - Unified Native Ad View
    
    /// Base class for native ad views. Your native ad view must be a subclass of this class and must
    /// call superclass methods for all overridden methods.
    @interface GADNativeAdView : UIView
    
    /// This property must point to the native ad object rendered by this ad view.
    @property(nonatomic, strong, nullable) GADNativeAd *nativeAd;
    
    /// Weak reference to your ad view's headline asset view.
    @property(nonatomic, weak, nullable) IBOutlet UIView *headlineView;
    /// Weak reference to your ad view's call to action asset view.
    @property(nonatomic, weak, nullable) IBOutlet UIView *callToActionView;
    /// Weak reference to your ad view's icon asset view.
    @property(nonatomic, weak, nullable) IBOutlet UIView *iconView;
    /// Weak reference to your ad view's body asset view.
    @property(nonatomic, weak, nullable) IBOutlet UIView *bodyView;
    /// Weak reference to your ad view's store asset view.
    @property(nonatomic, weak, nullable) IBOutlet UIView *storeView;
    /// Weak reference to your ad view's price asset view.
    @property(nonatomic, weak, nullable) IBOutlet UIView *priceView;
    /// Weak reference to your ad view's image asset view.
    @property(nonatomic, weak, nullable) IBOutlet UIView *imageView;
    /// Weak reference to your ad view's star rating asset view.
    @property(nonatomic, weak, nullable) IBOutlet UIView *starRatingView;
    /// Weak reference to your ad view's advertiser asset view.
    @property(nonatomic, weak, nullable) IBOutlet UIView *advertiserView;
    /// Weak reference to your ad view's media asset view.
    @property(nonatomic, weak, nullable) IBOutlet GADMediaView *mediaView;
    /// Weak reference to your ad view's AdChoices view. Must set adChoicesView before setting
    /// nativeAd, otherwise AdChoices will be rendered according to the preferredAdChoicesPosition
    /// defined in GADNativeAdViewAdOptions.
    @property(nonatomic, weak, nullable) IBOutlet GADAdChoicesView *adChoicesView;
    
    @end