封装自己的控件库:iPhone静态库的应用

封装自己的控件库:iPhone静态库的应用,第1张

概述由于iPhone控件的极度匮乏和自定义组件在重用上的限制,在过去的项目中我们积累了大量的“纯代码”组件——因为IB本身的限制,我们无法把这些组件封装为IB组件库(本来我们想通过分发xib文件的方式重用这些组件,但最终发现这根本不可能,苹果的Plug-in编程不支持iPhone)。 最终我们想到了静态库。虽然这仍然还是一种比较原始的复用方式,但起码我们可以隐藏组件的源代码。 下面, 我们使用iPho

由于iPhone控件的极度匮乏和自定义组件在重用上的限制,在过去的项目中我们积累了大量的“纯代码”组件——因为IB本身的限制,我们无法把这些组件封装为IB组件库(本来我们想通过分发xib文件的方式重用这些组件,但最终发现这根本不可能,苹果的Plug-in编程不支持iPhone)。

最终我们想到了静态库。虽然这仍然还是一种比较原始的复用方式,但起码我们可以隐藏组件的源代码。

下面, 我们使用iPhone静态库把自定义组件Checkbutton 进行进一步的封装。(组件的实现参考前一篇博文《自定义控件复选框和单选框的实现》)

一、实现静态库

新建工程, 选择 library 下的 Cocoa touch Static library 。给工程命名,例如:yhylibrary。                 

复制Checkbutton组件的4个源文件:Checkbutton.h、Checkbutton.m、RadioGroup.h、RadioGroup.m到Classes目录下,同时把Checkbutton的4个资源文件:check.png、uncheck.png、radio.png、unradio.png,复制到工程文件夹。

按下 +b编译,在Products目录下即产生一个 .a文件。

二、 新建资源束

静态库中并不能包含资源文件,虽然我们已经把4个资源文件(.png文件)拷贝到静态库工程中,但实际上这些.png是不会添加到target的,也就是说编译结果中并不包含这些资源,因此如果此时调用静态库,所有的资源(字符串、图片)都是缺失的。

我们可以把资源建立成单独的束(Bundle)。

新建工程“ Mac OS X  -> Framework & library -> Bundle ”,命名为:yhylibraryBundle。

然后把上面4个.png文件拷进Resouces中去。编译,生成yhylibraryBundle.bundle文件。

返回静态库工程,新建一个类:Utils 。

编辑Utils.h:

#define MYBUNDLE_name @ "yhylibraryBundle.bundle"

#define MYBUNDLE_PATH [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: MYBUNDLE_name]

#define MYBUNDLE [NSBundle bundleWithPath: MYBUNDLE_PATH]

Nsstring * getMyBundlePath( Nsstring * filename);

编辑Utils.m:

#import "Utils.h"

Nsstring* getMyBundlePath( Nsstring * filename)

{

NSBundle * libBundle = MYBUNDLE ;

if ( libBundle && filename ){

Nsstring * s=[[libBundle resourcePath ] stringByAppendingPathComponent : filename];

NSLog ( @"%@" ,s);

return s;

}

return nil ;

}

函数getMyBundlePath可以取得束yhylibraryBundle中具体资源的绝对文件路径,如:

/Users/kmyhy/library/Application Support/iPhone Simulator/4.2/Applications/8213652F-A47E-456A-A7BB-4CD40892B66D/yhylibTest.app/yhylibraryBundle.bundle/Contents/Resources/radio.png

同时,修改Checkbutton.m中的代码,导入Utils.h头文件,把其中获取图片的代码由imagenamed修改为imageWithContentsOffile,如:

[ icon setimage :[ UIImage imageWithContentsOffile : getMyBundlePath ( checkname )]];

即通过绝对路径读取图片资源。

除了这种方法,我们还可以有一个简单办法,就是把4个资源文件直接拷贝到你调用静态库的应用工程中(不需要修改静态库代码)。

三、静态库调用

1、添加静态库

新建Window-based Application工程,给工程命名,如yhylibraryTest。

右键点 Frameworks->Add->Existing files.. ,把静态库工程的yhylibrary.xcodeproj文件 添加到当前工程(不要选择 copy items

选中添加进来的yhylibrary.xcodeproj文件,勾选“include to target”选项,如下图,打上最后一个小勾:

2、添加Direct DependencIEs(即引用工程)

类似于Visual Studio中的引用工程,目的是便于在本工程中直接编辑所引用的静态库工程,以便对静态库进行修改。

在“ Targets ”目录下选择“ FirstlibraryTest ”,点击“info”按钮,调出目标的属性窗口,切换到“General”栏,点击“ Direct DependencIEs ”下方的“ + ”按钮,将工程静态库libyhylibrary添加到Direct DependencIEs中,结果如下图:

3、添加头文件搜索路径

打开工程的info窗口,在Build栏中找到header Search Paths,添加字符串“../yhylibrary”。

4、 引用资源束

target的copy Bundle Resources上右键,选择“Add->Existing file…”,把前面生成的yhylibraryBundle.bundle束添加到工程。

5、调用静态库中的类

编辑 application:( UIApplication *)application dIDFinishLaunchingWithOptions: 方法中的代码:

// 单选按钮组

RadioGroup * rg =[[ RadioGroup alloc ] init ];

// 1 个单选按钮

Checkbutton * cb=[[ Checkbutton alloc ] initWithFrame : CGRectMake ( 20 , 60 , 260 , 32 )];

// 把单选按钮加入按钮组

[ rg add :cb];

cb. label . text = @"★" ;

cb. value =[[ NSNumber alloc ] initWithInt : 1 ];

// 把按钮设置为单选按钮样式

cb. style = CheckbuttonStyleRadio ;

// 加入视图

[ self . window addSubvIEw :cb];

[cb release ]; //add 后,会自动持有,可以释放

// 2 个单选按钮

cb=[[ Checkbutton alloc ] initWithFrame : CGRectMake ( 20 , 100 , 32 )];

[ rg add :cb];

cb. label . text = @"★★" ;

cb. value =[[ NSNumber alloc ] initWithInt : 2 ];

cb. style = CheckbuttonStyleRadio ;

[ self . window addSubvIEw :cb];

[cb release ];

// 3 个单选按钮

cb=[[ Checkbutton alloc ] initWithFrame : CGRectMake ( 20 , 140 , 32 )];

[ rg add :cb];

cb. label . text = @"★★★" ;

cb. value =[[ NSNumber alloc ] initWithInt : 3 ];

cb. style = CheckbuttonStyleRadio ;

[ self . window addSubvIEw :cb];

[cb release ];

运行结果如下:

6、分发静态库

将生成的.a文件和.bundle文件打包分发给其他人。

总结

以上是内存溢出为你收集整理的封装自己的控件库:iPhone静态库的应用全部内容,希望文章能够帮你解决封装自己的控件库:iPhone静态库的应用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/web/1067543.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存