当前位置: 首页 > news >正文

Sagit.Framework For IOS 开发框架入门开发教程2:一行代码实现引导页

前言:

开篇比较简单:Sagit.Framework For IOS 开发框架入门开发教程1:框架下载与环境配置

第二篇教程之前写了一半,感觉不太好写,而且内容单纯介绍API,要说的很多,又枯燥乏味。

所以那半篇文章就放下了。

后来又开始思考这教程该怎么写,经过几天的沉淀,终于有了一个决定:

这个教程,就用IT恋里的实例来和大伙分享了,看看在实战是怎么被应用的。

这篇文章分两部分,前面讲实战的应用,后面补充框架设计原理,及未来设想的扩展等。

Sagit 实现引导页功能:

1:首先,我们要有N张引导页的图片

IT恋里就放有3张了,如下(这里图片把翻页的效果直接带上了,我们就省点事了):

2:然后,逻辑与代码:

逻辑流程:

AppDelegate启动时=》检测如果是第一次启动App=》WelcomeController(欢迎引导页)

if([ITGlobal share].IsFirstRun)
    {
        //欢迎界面
        self.window.rootViewController = [WelcomeController new];
    }
    else if (launchOptions) {}

滑动显示三张图片之后,最后一张触发点击事件,根据条件进入以下界面:

A:(更新App时)存在Token,跳转到:MainController(主界面)

B:(第一次时)无Token时,跳转到:StartController(登陆注册引导界面)

然后就是核心的一行代码实现功能了,一切都来的这么简单轻松:

[[self.view addScrollView:nil direction:X imgName:@"welcome_1", @"welcome_2", @"welcome_3", nil].lastSubView click:name];

追加一张效果图:

Sagit 框架原理解说:

1:Controller加载View的原理:

在往上看的第一张图中,注意细节:

A:可以看到引导欢迎界面,只有一个WelcomeController,木有WelcomeView。

B:而引导注册界面,有和StartController对应的StartView。

这个功能是我这两天增加的,主要是考虑到当View里的代码极少时,节省文件的同时,也更简洁。

所以,目前Controller检测加载View的流程是:

@implementation STController

- (void)viewDidLoad {
    [super viewDidLoad];//获取当前的类名
    NSString* className= NSStringFromClass([self class]);
    NSString* viewClassName=[className replace:@"Controller" with:@"View"];
    Class viewClass=NSClassFromString(viewClassName);
    if(viewClass!=nil)//view
    {
        self.view=self.stView=[[viewClass alloc] initWithController:self];
        [self.stView initView];
    }
    else
    {
        self.view=[[STView alloc] initWithController:self];//将view换成STView
        [self initUI];
    }
}
//空方法(保留给子类复盖)
-(void)initUI{}

代码读下来是这样的:

1: 如果XXXController检测到存在XXXView,则进行加载,并调用其initView方法(里面会再调用initUI方法)

--所以框架的默认加载的约定的是XXX名字前缀一样,就会被加载。 2: 如果检测不存在,则调用自身的initUI方法(这就是这里单独一个WelcomeController存在的原因)。

 

2:UIView的AddUI相关的方法。

框架扩展了UIView,增了常用了组件方法,并对这些组件,进行了些特殊的处理:

-(void)addView:(UIView *)view name:(NSString*)name;
-(UIView*)addUIView:(NSString*)name;
-(UIButton*)addSwitch:(NSString*)name;
-(UIButton *)addStepper:(NSString *)name;
-(UIButton *)addSlider:(NSString *)name;
-(UIButton *)addProgress:(NSString *)name;

-(UILabel*)addLabel:(NSString*)name;
-(UILabel*)addLabel:(NSString*)name text:(NSString*)text;
-(UILabel*)addLabel:(NSString*)name text:(NSString*)text font:(NSInteger)px;
-(UIImageView*)addImageView:(NSString*)name;
-(UIImageView*)addImageView:(NSString*)name imgName:(NSString*)imgName;
-(UIImageView*)addImageView:(NSString*)name imgName:(NSString*)imgName xyFlag:(XYFlag)xyFlag;

-(UITextField*)addTextField:(NSString*)name;
-(UITextField*)addTextField:(NSString*)name placeholder:(NSString*)placeholder;
-(UITextView*)addTextView:(NSString*)name;

-(UIButton*)addButton:(NSString*)name;
-(UIButton*)addButton:(NSString*)name imgName:(NSString*)imgName;
-(UIButton*)addButton:(NSString*)name imgName:(NSString*)imgName buttonType:(UIButtonType)buttonType;
-(UIButton*)addButton:(NSString*)name title:(NSString*)title;
-(UIButton*)addButton:(NSString*)name title:(NSString*)title font:(NSInteger)px;
-(UIButton*)addButton:(NSString*)name title:(NSString*)title font:(NSInteger)px buttonType:(UIButtonType)buttonType;
-(UIButton*)addButton:(NSString*)name title:(NSString*)title font:(NSInteger)px imgName:(NSString*)imgName buttonType:(UIButtonType)buttonType;
-(UIView*)addLine:name color:(id)colorOrHex;
-(UIScrollView*)addScrollView:(NSString*)name;
-(UIScrollView *)addScrollView:(NSString*)name direction:(XYFlag)direction imgName:(NSString*)imgName,...NS_REQUIRES_NIL_TERMINATION;

有些组件目前还没涉及,后续根据项目情况可能会追加或进一步优化。

这里先讲一下addScrollView的基础用法:

-(UIScrollView *)addScrollView:(NSString*)name direction:(XYFlag)direction imgName:(NSString*)imgName,...NS_REQUIRES_NIL_TERMINATION;

核心讲解:

1:每个UI都有个name属性,这个name很核心,可以关联事件,用于寻找UI,也用于对UI取值赋值,如果实在没用到,可以赋nil。

2:XYFlag 指求滑动是左右的X,还是上下的Y。

3:可以指定一个可追加的图片名称,用于加载图片(内部加载时,会自动根据数据调整ScrollView和图片的宽高等属性)。

4:对于一个add的UIView,没指定xy宽高时,会自动继承上一个相对视图的frame属性,这里是继承父视图,全屏了。

 

3:事件的触发

AddScrollView只是追加了图片,并可以滑动,但我们需要对最后一张图片增加点击事件:

所以需要先拿到最后一张图片,框架对UIView扩展了四个属性:

-(UIView*)lastSubView;
-(UIView*)firstSubView;
-(UIView*)preView;
-(UIView*)nextView;

用于方便拿到子视图的第一个和最后一个,以及自己同级的上一个和下一个。

接着,是对这个UIView,追加点击事件。

框架对于UIView扩展了两种点击事件的绑定方式:

#pragma mark 扩展系统事件
-(UIView*)click:(NSString*)event;
- (UIView*)addClick:(onClick)block;

click用于指定一个事件的名称,addClick用于追加一个事件执行的代码块。

这里先讲click传的event名字的寻找事件的流程:

1:先找传进来的event在所在的Controller中是否有对应的事件,若有,执行,若没有继续以下:

2:对event追加后缀变成eventClick和eventClick:再看有没有对应的事件,若有,执行,若没有继续以下:

3:对event追加后缀变成EventController,看有没有对应的控制器,若有,执行默认的open:事件跳转,若没有,则无绑定事件。

OK,原理讲解到这里,大伙再重温一下这行代码:

[[self.view addScrollView:nil direction:X imgName:@"welcome_1", @"welcome_2", @"welcome_3", nil].lastSubView click:name];

总结:

这些天一直在改进框架,相信随着框架的不断完善,可以让大伙编写IOS代码时,变的轻松很多!!!

下一篇,我们以跳转到登陆注册引导页为示例,继续下一篇教程。 

最后,谢谢大伙对Sagit框架和本人IT连创业项目的关注!

相关文章:

  • 简单实现UIlabel可复制功能
  • 大数据学习系列之五 ----- Hive整合HBase图文详解
  • REST开放接口生成文档工具之apidoc
  • 自建Maven仓库 - Artifactory
  • 微信管理
  • 推荐一个提升工作效率的小插件[intellij-postfix-templates]
  • 面试(1)
  • ios - 关于拖动手势简单应用场景
  • 第二课、GUI程序实例分析------------------狄泰软件学院
  • 第五课、Qt Creator 工程介绍------------------狄泰软件学院
  • PL/pgSQL RETURNS TABLE 例子
  • 贝塞尔曲线学习
  • 2007浙大复试上机考试题目2--统计字符
  • static作用(修饰函数、局部变量、全局变量)
  • 18 Issues in Current Deep Reinforcement Learning from ZhiHu
  • 【347天】每日项目总结系列085(2018.01.18)
  • canvas 高仿 Apple Watch 表盘
  • Centos6.8 使用rpm安装mysql5.7
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Javascript Math对象和Date对象常用方法详解
  • JS 面试题总结
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • ReactNative开发常用的三方模块
  • 警报:线上事故之CountDownLatch的威力
  • 坑!为什么View.startAnimation不起作用?
  • 前端js -- this指向总结。
  • 双管齐下,VMware的容器新战略
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​你们这样子,耽误我的工作进度怎么办?
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • # include “ “ 和 # include < >两者的区别
  • #AngularJS#$sce.trustAsResourceUrl
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (四)图像的%2线性拉伸
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .Family_物联网
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .net MVC中使用angularJs刷新页面数据列表
  • .net 流——流的类型体系简单介绍
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • @Bean注解详解
  • @Service注解让spring找到你的Service bean
  • [16/N]论得趣
  • [20140403]查询是否产生日志
  • [2019/05/17]解决springboot测试List接口时JSON传参异常
  • [ABC294Ex] K-Coloring