首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >目标c不加载xamarin形式的ios

目标c不加载xamarin形式的ios
EN

Stack Overflow用户
提问于 2020-04-02 21:03:10
回答 1查看 244关注 0票数 0

我正在构建我的第一个目标c库绑定。我正在跟踪微软的文档。我已经成功地从IronSource.framework中创建了一个fat二进制文件,并使用objective生成了apidefinition和structs,并将我的二进制文件添加到其中。

完成之后,我将绑定库添加到我的xamarin.ios项目中。当我试图从公开的API创建一个类的新实例时,我会得到一个错误。

无法找到类型或命名空间名称'IronSource‘(您是缺少使用指令还是程序集引用?)股票顾问的备份版本(版本1.6\版本代码37\StockAdviserCode\Stock\Stock\Stock.iOS\AdControlViewRenderer.cs 'AdControlViewRenderer.BannerWrapper‘)没有实现继承的抽象成员'ISBannerDelegate.DidClickBanner()’Stock.iOS D:股票顾问的备份版本\版本1.6\版本代码37\StockAdviserCode\Stock\Stock\Stock.iOS\AdControlViewRenderer.cs

我认为我的目标c库和xamarin.ios项目没有正确链接。

我的绑定项目名是IronSource,我的xamarin窗体ios项目名是Stock.iOS。

代码语言:javascript
复制
//APIDefinition
    using System;
    using Foundation;
    using ObjCRuntime;
    using UIKit;

namespace IronSource
{

    // @interface ISBannerView : UIView
    [BaseType(typeof(UIView))]
    interface ISBannerView
    {
    }

    // @protocol ISBannerDelegate <NSObject>
    [BaseType(typeof(NSObject))]
    [Model]
    interface ISBannerDelegate
    {
        // @required -(void)bannerDidLoad:(ISBannerView *)bannerView;
        [Abstract]
        [Export("bannerDidLoad:")]
        void BannerDidLoad(ISBannerView bannerView);

        // @required -(void)bannerDidFailToLoadWithError:(NSError *)error;
        [Abstract]
        [Export("bannerDidFailToLoadWithError:")]
        void BannerDidFailToLoadWithError(NSError error);

        // @required -(void)didClickBanner;
        [Abstract]
        [Export("didClickBanner")]
        void DidClickBanner();

        // @required -(void)bannerWillPresentScreen;
        [Abstract]
        [Export("bannerWillPresentScreen")]
        void BannerWillPresentScreen();

        // @required -(void)bannerDidDismissScreen;
        [Abstract]
        [Export("bannerDidDismissScreen")]
        void BannerDidDismissScreen();

        // @required -(void)bannerWillLeaveApplication;
        [Abstract]
        [Export("bannerWillLeaveApplication")]
        void BannerWillLeaveApplication();
    }
}

//我的xamarin.ios

代码语言:javascript
复制
using System;
using CoreGraphics;
using Foundation;
using Stock.iOS;
using Stock.Services;
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
using IronSource;

[assembly: ExportRenderer(typeof(AdControlView), typeof(AdControlViewRenderer))]
namespace Stock.iOS
{

public class AdControlViewRenderer : ViewRenderer
{
    public AdControlViewRenderer()
    { }
    protected AdControlView AdViewControl => (AdControlView)Element;
    protected override void OnElementChanged(ElementChangedEventArgs<View> e)
    {
        base.OnElementChanged(e);
        if (e.OldElement != null || Element == null)
            return;

        IronSource ironSource = new IronSource();

        SetNativeControl();
    }

    private void SetNativeControl()
    {
        try
        {
            BannerWrapper bannerWrapper = new BannerWrapper(ViewController);

            IronSource.SetBannerDelegate(bannerWrapper);

            var bannerSize = new ISBannerSize("BANNER");
            IronSource.LoadBannerWithViewController(ViewController, bannerSize);
            var adview = bannerWrapper.BannerView();
            SetNativeControl(adview);
        }
        catch (Exception ex)
        {

        }
    }
}

public class BannerWrapper : ISBannerDelegate
{
    readonly UIViewController parent;
    ISBannerView bannerView = null;

    public bool DestroyBanner()
    {
        if (bannerView != null)
        {
            IronSource.DestroyBanner(bannerView);
            bannerView = null;
            return true;
        }
        return false;
    }

    public BannerWrapper(UIViewController viewController)
    {
        this.parent = viewController;
    }
    public override void BannerDidClick()
    {
    }

    public override void BannerDidDismissScreen()
    {
    }

    public override void BannerDidFailToLoadWithError(NSError error)
    {
    }

    public ISBannerView BannerView()
    {
        ISBannerView bannerView = new ISBannerView();
        nfloat y = this.parent.View.Frame.Size.Height - (bannerView.Frame.Size.Height / 2);
        if (UIDevice.CurrentDevice.CheckSystemVersion(11, 0))
        {
            y -= this.parent.View.SafeAreaInsets.Bottom;
        }
        bannerView.Center = new CGPoint(this.parent.View.Frame.Size.Width / 2, y);

        return bannerView;
    }

    public override void BannerDidLoad(ISBannerView bnView)
    {
        InvokeOnMainThread(() =>
        {

            bannerView = bnView;

            nfloat y = this.parent.View.Frame.Size.Height - (bannerView.Frame.Size.Height / 2);
            if (UIDevice.CurrentDevice.CheckSystemVersion(11, 0))
            {
                y -= this.parent.View.SafeAreaInsets.Bottom;
            }
            bannerView.Center = new CGPoint(this.parent.View.Frame.Size.Width / 2, y);

            this.parent.View.AddSubview(bannerView);

            bannerView.AccessibilityLabel = "bannerContainer";

        });

    }

    public override void BannerWillLeaveApplication()
    {
    }

    public override void BannerWillPresentScreen()
    {
    }
}
}

欢迎任何帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-10 15:50:12

因此,我能够通过向Xamarin.ios添加胖二进制文件使其工作,并将构建类型从“不复制”更改为“始终复制”,然后使用-cxx -gcc_flags "-L${ProjectDir} -lIronSource -force_load ${ProjectDir}/IronSource.a将链接器添加到胖二进制文件中。

我用 GitHub回购作为指导。

总的来说,为了设置IronSoruce,我必须在引用中添加dll,将本机框架添加到本机引用,将fat二进制添加到projectdir,并将链接器添加到fat二进制。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61001074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档