• MonoTouch绑定原生ObjC静态库的实现


    MonoTouch是利用C#语言进行iOS开发的跨平台解决方案,包括支持iPhone/iPad的开发,目前也支持了最新的iOS 6的版本。

    官方地址:http://xamarin.com/

    github Sample:https://github.com/xamarin/monotouch-samples

    app应用:http://xamarin.com/apps/all

    MonoTouch可以利用C# 语言进行iOS开发,意味着作为.Net程序员,也可以很容易地进行iOS开发。当然,能够理解objective-c语法对你的iOS学习也是很有帮助的。

    本篇文章,主要教你如何利用MonoTouch来绑定原生的Obj-C静态库,并且直接调用静态库里面的方法完成实现。

    首先利用xcode创建一个原生的静态库:

    Project中加入MBProgressHUD的两个文件(MBProgressHUD是个等待加载特效框架,github:https://github.com/jdg/MBProgressHUD

    然后编译下,默认地,在/Library/Developer/Xcode/DerivedData可以找到BindingLibraryl的应用,libBindingLibrary.a

    接着打开MonoDevelop,新建一个BindingLibrary解决方案,添加一个BindingLibrarySDK项目:

    选择“MonoTouch Binding Project",这个项目专门用来绑定a native library的。

    然后,将libBindingLibrary.a添加到该项目中去,并且,你会发现在项目中它会自动产生一个叫做libBindingLibrary.linkwith.cs的文件:

    using System;
    using MonoTouch.ObjCRuntime;
     
    [assembly: LinkWith ("libBindingLibrary.a", LinkTarget.Simulator, ForceLoad = true)]

    这样就实现了libBindingLibrary.a静态库的导入,此实现类似于DllImport引用非C#(例如C++)动态库的导入。

    你可以发现项目中自动产生两个文件,ApiDefinition.cs以及StructsAndEnums.cs文件,ApiDefintion.cs主要作为原生类定义的相关映射。

    具体文档可以查看:Binding Objective-C Types

    这里编写代码:

    复制代码
    [BaseType (typeof (UIView))]
    interface MBProgressHUD
    {
    [Static, Export("showHUDAddedTo:animated:")]
    MBProgressHUD ShowHUDAddedTo (UIView view, bool animated);
     
    [Export("show:")]
    void Show (bool animated);
     
    [Export("hide:")]
    void Hide (bool animated);
     
    [Export("hide:afterDelay:")]
    void Hide (bool animated, double delay);
     
    [Export ("labelText", ArgumentSemantic.Copy)]
    String LabelText { getset; } 
    复制代码

    其中对应的原生接口有:

     

    + (MBProgressHUD *)showHUDAddedTo:(UIView *)view animated:(BOOL)animated;
    - (void)show:(BOOL)animated;
    - (void)hide:(BOOL)animated;
    - (void)hide:(BOOL)animated afterDelay:(NSTimeInterval)delay;
    @property (copy) NSString *labelText;

    其中BaseType为它的继承类型为UIView,对应于原生的MBProgressHUD类的基类为UIView;

    Export为导入的方法名称,Static说明它作为一个静态的方式;

    ArgumentSematic是它的参数类型为Copy;

     

    然后就可以直接编译BindingLibrarySDK了,生成一个BindingLibrarySDK.dll

     

    现在,新建一个新的iOS项目:

    这里,我选择一个单窗口的iphone应用程序。

    把刚刚的BindingLibrarySDK.dll引用进来:

    接着,我在xib文件设计一个按钮控件,生成点击事件的代码:

    在点击事件代码中,实现:

     

     

    复制代码
    partial void showWindow (MonoTouch.Foundation.NSObject sender)
    {
        BindingLibrarySDK.MBProgressHUD hud =     BindingLibrarySDK.MBProgressHUD.ShowHUDAddedTo(this.View, true);
    hud.Show(true);
    hud.LabelText = ;
    hud.Hide(true1);  // hide hud after 1s 
    }
    复制代码

    最后,运行程序,查看效果:

    点击按钮,显示加载效果框,等1秒之后,效果框消失。

     

    这样就通过MonoTouch实现了绑定原生Obj-C静态库,调用了相关的原生方法。

    本文例子:https://github.com/sunleepy/monotouch_binding

     


    作者:Leepy
     
    邮箱:sunleepy(AT)gmail.com
     
        
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    POI2014 洛谷P3574 FarmCraft 题解
    JZOJ 3468 OSU!题解
    sublime配置C++编译环境
    本地配置gitee
    数论基础
    HDU
    HDU-3033 I love sneakers! 题解
    HDU-4341 Gold miner 题解
    HDU
    MyBatis框架及原理分析
  • 原文地址:https://www.cnblogs.com/greywolf/p/2815613.html
Copyright © 2020-2023  润新知