`
ilikeido
  • 浏览: 27429 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

BeeFramework 系列二 UISignal篇上

阅读更多
BeeFramework中用的最多的就是UISignal了,这是一种通过Bee框架体系实现的可替代Delegate的信号传递方式。通过它可以简化使用Delegate时的各种烦索。
继续第一篇的例子,我们把ViewController继承自BeeUIBoard。
#import <UIKit/UIKit.h>
#import <BeeFramework/Bee.h>

@interface ViewController : BeeUIBoard

@end

重新运行看看是否UISignal能路由到ViewController上

未看到路由到ViewController上,实际上UISignla已经路过ViewController了。查看BeeUIButton文件,发现各种事件最后都是通过sendUISignla来转发。
- (void)didTouchUpInside
{
	if ( NO == [self testEvent:UIControlEventTouchUpInside] )
	{
		[self sendUISignal:BeeUIButton.TOUCH_UP_INSIDE];
	}
}

跟踪UIView+BeeUISignal,可以看出在sendUISignal时,新建了一个BeeUISignal,并把自身(UIView)设置为Signal的target。
- (BeeUISignal *)sendUISignal:(NSString *)name withObject:(NSObject *)object from:(id)source
{
	BeeUISignal * signal = [[[BeeUISignal alloc] init] autorelease];
	if ( signal )
	{
		NSString * selName = self.tagString.lowercaseString;
		selName = [selName stringByReplacingOccurrencesOfString:@"-" withString:@"_"];
//		selName = [selName stringByReplacingOccurrencesOfString:@":" withString:@"_"];
		
		signal.preSelector = selName;	// v0.3.0 new feature, signal binding
		signal.source = source ? source : self;
		signal.target = self;
		signal.name = name;		
		signal.object = object;
		[signal send];
	}
	return signal;
}

跟踪BeeUISignal,发现其路由的核心在routes方法上,通过判断target是否实现规则的方法名,来决定最终调用的目标的View或ViewController,以此例为例,方法名可为handleUISignal_BeeUIButton_TOUCH_UP_INSIDE:或handleUISignal_BeeUIButton,如未找到该方法,则为继续判断是否响应以BeeUIButton父类命名的规则方法handleUIButton:,如此循环直至顶层类NSObject的规则方法handleNSObject:,最后实在未找到,则调用BeeUIButton的handleUISignal:方法。该方法在UIView+BeeUISignal中的实现:
- (void)handleUISignal:(BeeUISignal *)signal
{
	if ( self.superview )
	{
		[signal forward:self.superview];
	}
	else
	{
		signal.reach = YES;

	#if defined(__BEE_DEVELOPMENT__) && __BEE_DEVELOPMENT__
		CC( @"[%@] > %@", signal.name, signal.callPath );
	#endif	// #if defined(__BEE_DEVELOPMENT__) && __BEE_DEVELOPMENT__
	}
}

即把当前View的上一层再进行signal路由。

这里会发现signal未传到上一层的View进行路由。这里需要加下补丁,参考https://github.com/ilikeido/BeeFramework/commit/59dc2e4c29ea1a890dafe47bf526ecf57b402c95
为Bee_UIBoard添加代码
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        if ( nil == __allBoards )
		{
			__allBoards = [[NSMutableArray nonRetainingArray] retain];
		}
        
		[__allBoards insertObject:self atIndex:0];
		
		_lastSleep = [NSDate timeIntervalSinceReferenceDate];
		_lastWeekup = [NSDate timeIntervalSinceReferenceDate];
		
		_zoomed = NO;
		_zoomRect = CGRectZero;
        
		_firstEnter = YES;
		_presenting = NO;
		_viewBuilt = NO;
		_dataLoaded = NO;
		_state = BeeUIBoard.STATE_DEACTIVATED;
		
		_createDate = [[NSDate date] retain];
		
		_modalAnimationType = BeeUIBoard.ANIMATION_TYPE_ALPHA;
		
		_allowedPortrait = YES;
		_allowedLandscape = NO;
        
#if defined(__BEE_DEVELOPMENT__) && __BEE_DEVELOPMENT__
		_createSeq = __createSeed++;
		_signalSeq = 0;
		_signals = [[NSMutableArray alloc] init];
        
		_callstack = [[NSMutableArray alloc] init];
		[_callstack addObjectsFromArray:[BeeRuntime callstack:16]];
#endif	// #if defined(__BEE_DEVELOPMENT__) && __BEE_DEVELOPMENT__
		
		[self load];
	}
	return self;
}


修改UIView+BeeExtension.m 的ViewController方法
- (UIViewController *)viewController
{
	if ( nil == self.superview )
		return nil;
	
	id nextResponder = [self nextResponder];
	if ( [nextResponder isKindOfClass:[UIViewController class]] )
	{
		return (UIViewController *)nextResponder;
	}
	else
	{
		return nil;
	}
}


好了,了解了signal的路由原理,现在在ViewController中添加
-(void)handleUISignal_BeeUIButton:(BeeUISignal *)signal{
    if ([signal is:BeeUIButton.TOUCH_UP_INSIDE]) {
        CC(@"111");
    }
    
}

OK,重新运行。

现在有响应了,:-)。为了测试下signal是否是自底向上传递的。再来做个例子,打开ViewController.h添加个MyView
//
//  ViewController.h
//  BeeFrameWorkTest
//
//  Created by he songhang on 13-6-3.
//  Copyright (c) 2013年 he songhang. All rights reserved.
//

#import <UIKit/UIKit.h>
#import <BeeFramework/Bee.h>

@interface MyView : UIView

@end

@interface ViewController : BeeUIBoard

@end

修改ViewController.m
//
//  ViewController.m
//  BeeFrameWorkTest
//
//  Created by he songhang on 13-6-3.
//  Copyright (c) 2013年 he songhang. All rights reserved.
//

#import "ViewController.h"

@implementation MyView

-(void)handleUISignal_BeeUIButton:(BeeUISignal *)signal{
    if ([signal is:BeeUIButton.TOUCH_UP_INSIDE]) {
        CC(@"MyView response");
    }
}

@end

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(void)handleUISignal_BeeUIButton:(BeeUISignal *)signal{
    if ([signal is:BeeUIButton.TOUCH_UP_INSIDE]) {
        CC(@"ViewController response");
    }
}

@end

打开ViewController.xib,添加一个MyView,并把Button继承自BeeUIButton放到MyView里

重新运行,
可以看到点击Button,handleUISignal_BeeUIButton响应的是MyView,因为路由的路径是BeeUIButton->MyView.如果想让信号继续传递呢?对了添加[super handleUISignal:signal];
@implementation MyView

-(void)handleUISignal_BeeUIButton:(BeeUISignal *)signal{
    if ([signal is:BeeUIButton.TOUCH_UP_INSIDE]) {
        CC(@"MyView response");
    }
    [super handleUISignal:signal];
}

@end

现在的信号路由路径为
BeeUIButton->MyView->UIViewController

本文代码下载:https://github.com/ilikeido/BeeFrameworkTest/tree/master/lesson2
  • 大小: 200.7 KB
  • 大小: 22.6 KB
  • 大小: 618.5 KB
分享到:
评论

相关推荐

    BeeFramework开源框架

    1. **下载与导入**:从GitHub上获取BeeFramework的源码,解压并将其导入到Xcode项目中。 2. **配置依赖**:根据项目需求,添加所需的BeeFramework模块。 3. **初始化框架**:在应用程序启动时,进行必要的初始化设置...

    BeeFramework

    BeeFramework 在实现 MVC 上有其独特之处: 1. **Model**:模型层负责处理数据和业务逻辑,BeeFramework 提供了数据模型的抽象和管理,使得数据操作更加规范和高效。 2. **View**:视图层负责展示用户界面,...

    beeframework

    beeframework的文档,是郭大大的成熟座屏

    BeeFramework_Android, 极简化的Android App开发框架和App内调试工具.zip

    **BeeFramework_Android** 是一个专为简化Android应用程序开发设计的开源框架,它强调了高效、简洁的编码方式,并内置了强大的App内调试工具,旨在帮助开发者快速构建功能丰富的移动应用。通过这个框架,开发者可以...

    iOS:在Storyboard上使用BeeFramework使用网格表视图

    在这个场景中,我们探讨的是如何在Storyboard上使用BeeFramework实现一个网格表视图。BeeFramework是一个开源的iOS开发框架,它提供了许多便利的功能,包括数据绑定、网络请求、缓存管理和视图管理等,能够帮助...

    基于MVC的IOS快速开发框架 BeeFramework.zip

    BeeFramework 从根本上解决了iOS开发者长期困扰的各种问题,诸如:分层架构如何设计,层与层之间消息传递与处理,网络操作及缓存,异步及多线程,以及适配产品多变的UI布局需求。 标签:快速开发

    电子商务移动客户端ECMobile.zip

    ECMobile 是 Geek Zoo Studio 团队推出的一款基于ECShop构建的移动商城客户 端,能够帮助企业和个人快速构建手机移动商城,并减少二次开发带来的成本。 ECMobile 是基于自主知识产权框架 BeeFramework 进行研发的跨...

    安卓BEEframwork 框架

    **安卓BEE Framework框架详解** BEE Framework是一个专为安卓...开发者在使用`BeeFramework_Android-master`这样的项目源码时,可以深入研究每个部分,了解其工作原理,从而更好地利用这个框架来构建自己的应用程序。

    基于MVVM的IOS开发框架EasyIOS.zip

    Scene 一个视图相当于UIViewController,提供了快速集成网络请求和下拉刷新上拉加载的方法。 SceneTableView 一个TableView,配合scene提供了集成下拉刷新上拉加载的方法 SceneCollectionView 一个...

    2013年度中国优秀开源项目列表

    13. BeeFramework:BeeFramework是iOS平台的快速开发框架,特点包括易学易用、组件丰富,提供In-App调试和模版化技术。 14. beego:beego是一个类似tornado的Go应用框架,采用RESTful方式实现,是一个超轻量级的...

    O2OMobile_Universal:O2Omobile 是 Geek Zoo Studio 推出的一款原生开源O2O系统

    您可以在完全遵守本协议基础之上,将本软件应用于非商业用途(包括个人用途:不具备法人资格的自然人,以个人名义从事电子商务活动;非盈利性用途:从事非盈利活动的商业机构及非盈利性组织,将本软件用且仅用于...

    O2OMobile_IOS:O2Omobile 是 Geek Zoo Studio 推出的一款原生开源O2O系统

    您可以在完全遵守本协议基础之上,将本软件应用于非商业用途(包括个人用途:不具备法人资格的自然人,以个人名义从事电子商务活动;非盈利性用途:从事非盈利活动的商业机构及非盈利性组织,将本软件用且仅用于...

    ECMobile手机商城系统

    ECMobile手机商城系统源码PHP版,该源码系统ECMobile是基于ECShop...相关源码下载:android版源码:http:///view/4495.htmlIOS版源码:http:///view/4497.htmlBeeFramework: https://github.com/gavinkwoe/BeeFramework

    Android App开发框架和App内调试工具

    这个是极简化的Android App开发框架和App内调试工具,源码BeeFramework_Android,BeeFramework Android版主要为Android初级开发人员提供一个基于MVC开发模式的APP DEMO,并提供一套APP内调试工具,包括 查看网络数据...

    移动端混合开发框架分析.docx编程资料

    #### 二、移动前端主流框架分析 ##### 2.1 Web和Native混合 **WindVane+Hybrid+Native** **简介:** - WindVane是一种将Web技术与原生技术相结合的方式,旨在实现高效的混合应用程序开发。 **框架实现:** - ...

    支持表格控件效果

    该实现了怎样支持表格控件效果,该功能采用了BeeFramework实现的,并且可以根据数据源显示成GridView格式的列表效果,也就是说呈现表格样式效果,而且每一行都可以有多列内容,不需要我们计算每列的位置,宽度,只要...

Global site tag (gtag.js) - Google Analytics