开源:Sagit.Framework For IOS 开发框架
一:创造Sagit开发框架的起因:
记得IT连创业刚进行时,招了个IOS的女生做开发,然后:
----------女生的事故就此开始了-----------
1:面试时候:有作品,态度也不错,感觉应该能做点事。
2:刚招进来:发现每天都在看文章,但迟迟不见有点东西。
3:过程问答:现在在整些什么?回答在搭框架。
4:发现危机:不小心看到她用单手指敲键盘,感觉不妙。
5:处理危机:速学IOS,一个星期后,看完她代码,谈话Over!
----------女生的事故就到此结束了----------
在速学IOS时,快速扫了不少培训的视频教程,发现套路都是很原始。
这些原始的套路了解可以,但若这些过来搬到项目来,就祸害无穷了。
按照当时创业的成本考虑,很大概率招来的人是以下三种:
1: 刚从培训班出来的;
2:刚看完培训视频过来;
3:刚用培训视频的套路祸害完一个项目后跳过来的。
为了对下一个开发人员有所约束:
让一个有3-4年开发经验的朋友帮忙整一下框架。
看完他整的框架,发现只是常规性的工具类分文件夹。
给他提了一个要求,把其中一个网络请求重新封装一下。
回头再看,虽有所改进,但还是不尽我意。
也许可以指导继续改进,但时不以我,也不以他。
于是自己动手了:框架大体完成60%时,招了个男开发人员。
----------男生的事故就此开始了-----------
为了赶项目,让新人在框架的基础上动工了。
鉴于新人开发人员能弄点东西,加上有框架的辅助,就撒手了。
由于框架的不完善,以及对框架的不理解,遇到点小坑就吐槽。
吐槽多了,也只能同意他混着其它的框架一起整了。
再后来,多的数不清的坑和闪退事故。
早期关注IT连及用IT连App的童学,就清楚了。
或者在我之前的IT连创业系列文章里应该可以感知了。
现在,他也Over了!
----------男生的事故就到此结束了-----------
重新接手回IOS后,发现代码逻辑也是一团槽,好在之前有一部份还是按框架走。
最近花了一周多的时候,理解,并开始重构整个项目的代码。
同时对框架之前已有的依赖关系也进行了抽离,并重新重构了一下框架。
目前对框架的重构的工作已经进行了70%-80%,还有一些功能想了还没加上。
但整体并不影响基础功能,所以是时候把Sagit的框架和大伙分享了!
二:关于框架起名:
自从:CYQ.Data 框架这名字被大伙吐槽之后,后续的框架命名,就显的格外用心了。
在研究了行星、星座、水果、植物、动物、颜色、形状等英文名称之后。
终于有了:白羊(Areis.DevFramework For DotNet)、
再也有了:金牛(Taurus.MVC For DotNet)
之后没了:双子(Gemini.workflow For DotNet) 工作流引擎目前难产中(写了开头,后来没空折腾)。
因此,凑齐黄金十二宫,召换雅典娜,就成了我来地球最神秘的任务了!
这次越级选了:Sagittarius (射手)
一来是ST的前缀简写刚好对应的现在创业公司的名字:随天。
二来取前半部做框架名,简写:Sagit(发音:射日,很和谐发现有木有)

三:框架的适用场景:
1:研究学习:
A:工作几年之后,开发功能已不是问题,需要有点新思维来突破受限的瓶颈。
看懂框架代码不难,主要是学习思维,多思考,并多训练自己怎么写。
B:对于在培训行业的教师,可以在培训结束前用框架的思维引导一下新人,再放他们出来。
2:项目开发:
A:开发人员没有框架的概念。
B:目前没有其它可选择的框架。
一般的说,除了游戏,其它常规性的项目都适合。
下面对框架进行简单的介绍,也只能是简单介绍:
Sagit 创新一:简洁的相对布局语法
1:统一标准参数,自适配手机屏幕,实现AutoLayout。
A:框架默认以IPhone6的像素为标准参考体系:750*1334。
B:开发时,都以标准的像素单位为参数。
C:运行时,会自动适配成对应比例的参数。
(PS :如果需要修改标准,可在STDefineUI.h文件中修改定义)
看着UI给的参数标注图,轻松布局:

2: 简洁的相对布局语法,一行看尽
以上图片为例,做布局
A:相对父元素的布局 Logo:
[[[[self addImageView:@"login_logo"] width: height:] relate:Top v:] toCenter:X];
B:相对固定元素的布局,下面这行代码是引用其它地方的:
[[[[self addImageView:@"icon_verify"] width: height:] onBottom:pwdIcon y:26] toCenter:X];
3:可局部刷新的布局
以下这行代码,会对批定的视图的子视图重新进一次相对布局。
[self refleshLayout];
Sagit 创新二:彻底分离的View与Controller
记得很早以前,我写过一篇文章:Objective-C iOS纯代码布局 一堆代码可以放这里!
那时候只是研究的前奏,并没有实现完整分离,当然现在是解决了。
举个例如:一个文本框一个按钮,点击按钮弹出文字框的内容。
之前的做法,你都会在Controller里写一堆UI相关的创建方法,或者需要将某些UI定义为全局变量,以便后续再去获取UI的值。
最差也是我之前未完成时留下的那点手尾:(下面红色的,在Controller中需要定义一个具体的LoginView变量)

好了,现在这个问题已经被我彻底解决了,0入侵已经成为了事实,下面看示例代码:
LoginView 的代码:创建了一个文本框和一个点击按钮
@interface LoginView : STView //这是LoginView.h @end @implementation LoginView //这是LoginView.m -(void)initUI
{
[[self addTextField:@"userName" placeholder:@"输入手机号"] x: y: width: height:];
[[self addButton:@"btnLogin" title:@"登录"] onRight:self.lastSubView.PreView x:];
}
@end
LoginController 的代码:有一个按钮事件,获取手机号用户名然后弹出来提示
@interface LoginController : STController // 这是LoginController.h @end @implementation LoginController //这是LoginController.m -(void)btnLoginClick
{
NSString* userName=[self uiValue:@"userName"];
[self.box prompt:userName];
}
调用:
self.window.rootViewController = [LoginController new];
效果:(为了截图,特意新建了个demo...)

解析:
LoginView和LoginController两个文件代码里,并没有互相引用的地方。
但是UI和事件却补神奇的关联起来了,这是怎么做到的呢?
秘密就在STView和STController文件的源码中。
Sagit 创新三:表单的自动提交与回显
如果你需要提交一个表单的数据,你只需要这样:
-(void)btnLoginClick
{
// NSString* userName=[self uiValue:@"userName"];
// [self.box prompt:userName]; [self.http post:@"/Login" paras:self.formData success:^(STModel *result) {
if(result.success)//如果:提交成功
{
[self.stView loadData:result.msg];//将返回的数据回显到控件
}
}];
}
解析:
self.formData可以自动收集UI表单的内容。
self.stView loadData 可以自动将字典的数据写回UI中。
一切就是这么Easy,在这种常规的提交中,批量来批量去,不需要有Model的存在。
这里暂就不提供Demo了,后续文章再跟进。
Sagit 其它功能一:月下无限连的属性语法:
UITextField *userName= [[[self addTextField:@"UserName" placeholder:@"手机号码"] width: height:] onRight:mobileIcon x: y:-];
[[userName maxLength:] keyboardType:UIKeyboardTypeNumberPad];
不用再去这样写的憔碎了:
mobileTF.keyboardType = UIKeyboardTypeNumberPad;// UIKeyboardTypeNamePhonePad;
mobileTF.MaxLength=;// = (id)self.Controller;
Sagit 其它功能二:封装了适合C#玩家的简洁语法
OC的命名总是很长,做为了一名C#的大神,有义务把C#简洁的语法带过来。
例如:
@interface NSString(ST) -(NSString*)reverse;
-(BOOL)isInt;
-(BOOL)isFloat;
-(NSString*)append:(NSString*)string;
-(NSString*)replace:(NSString*)a with:(NSString*)b;
-(NSString *)replace:(NSString *)a with:(NSString *)b isCase:(BOOL)isCase;
-(NSArray<NSString*>*)split:(NSString*)separator;
-(NSString*)toUpper;
-(NSString*)toLower;
-(BOOL)startWith:(NSString*)value;
-(BOOL)endWith:(NSString*)value;
-(BOOL)contains:(NSString*)value;
-(BOOL)contains:(NSString*)value isCase:(BOOL)isCase;
-(BOOL)isEmpty;
+(BOOL)isNilOrEmpty:(NSString*)value;
+(NSString*)toString:(id)value;
-(NSString*)trim;
Sagit 其它功能...
1:网络的请求只有三个:
[self.http get ...]
[self.http post ...]
[self.http upload ...]
2:消息提示框:
[self.box prompt...]
[self.box alert..]
[self.box confirm...]
其它等。。。就不在这里介绍了,后续会慢慢写文介绍。
Sagit 开源地址:
GitHub:https://github.com/cyq1162/Sagit
目前以源码方式提供,并未打包成类库。
新开的:IOS Sagit框架 :QQ群:702724292
总结:
1 :框架刚开源,预示着在未来的日子里,升级与变动是少不了的。
2:框架只是个基础,完整的项目架构,还需要根据不同的业务搭配不同的第三方类库。
3:后续会将IT连和IT恋两个App的源码,做为示例教程,和大伙分享。
4:最后,依然感谢大伙关注我正在进行的IT连创业项目!
开源:Sagit.Framework For IOS 开发框架的更多相关文章
- Sagit.Framework For IOS 开发框架入门开发教程1:框架下载与环境配置
背景: 前天开源了框架:开源:Sagit.Framework For IOS 开发框架 所以注定要追补一套开发教程了,所以尽量抽空了!!! 步骤 1:下载框架源码 GitHub:https://git ...
- Sagit.Framework For IOS 开发框架入门开发教程2:一行代码实现引导页
前言: 开篇比较简单:Sagit.Framework For IOS 开发框架入门开发教程1:框架下载与环境配置 第二篇教程之前写了一半,感觉不太好写,而且内容单纯介绍API,要说的很多,又枯燥乏味. ...
- Sagit.Framework For IOS 开发框架入门教程3:Start引导页及框架布局和隐藏事件的内幕
前言: 框架依旧在快速更新着:在重构.简化代码,统一标准的过程中. 中间也遇到各种坑,不过好在一步一脚印的解决了. 虽然还有些功能还在思考,不过教程,还是得补上: 上篇文章:Sagit.Framewo ...
- Sagit.Framework For IOS 开发框架入门教程4:注册页布局-被消灭的变量
前言: 上篇写完:Sagit.Framework For IOS 开发框架入门教程3:Start引导页-框架布局和隐藏事件的内幕 之后,好久没写文章了,有IT连创业系列.有DotNetCore的一篇文 ...
- Sagit.Framework For IOS 开发框架入门教程6:网络请求STHttp
前言: IOS的文章,今天,再来补一篇,Sagit的教程: 虽然感觉IOS的文章没什么观众,还是努力写吧,-_-〜 Sagit 开源地址:https://github.com/cyq1162/Sagi ...
- Sagit.Framework For IOS 开发框架入门教程5:消息弹窗STMsgBox
前言: 昨天刚写了一篇IT连创业的文章:IT连创业系列:产品设计之答题模块,(欢迎大伙关注!) 感觉好久没写IOS的文章了,今天趁机,来补一篇,Sagit的教程. Sagit 开源地址:https:/ ...
- 讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(中)- IOS不为人知的Bug
前言: 话说昨晚还是前晚,写了一篇:讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(上) 文章写到最后时,多了很多莫名奇妙的问题!!! 为了解决了这些莫名奇妙的问题,我又战斗了2 ...
- 讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(下)- block中任性用self
前言: 在处理完框架内存泄漏的问题后,见上篇:讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(中)- IOS不为人知的Bug 发现业务代码有一个地方的内存没释放,原因很也简单: ...
- Android 开源控件与常用开发框架开发工具类
Android的加载动画AVLoadingIndicatorView 项目地址: https://github.com/81813780/AVLoadingIndicatorView 首先,在 bui ...
随机推荐
- 使用JS实现图片轮播滚动跑马灯效果
我的第一篇文章.哈哈.有点小鸡冻. 之前在百度搜索"图片轮播"."图片滚动",结果都是那种可以左右切换的.也是我们最常见的那种.可能是搜索 关键字的问题吧. ...
- Leetcode题解(十五)
42.Trapping Rain Water 题目 这道题目参考http://www.cnblogs.com/felixfang/p/3713197.html 观察下就可以发现被水填满后的形状是先升后 ...
- 哈尔滨理工大学第六届程序设计团队 H-Permutation
/* 数学是硬伤......推了半小时推出来一个错误的公式 */ #include <iostream> #include <stdio.h> #include <alg ...
- python如何将指定路径下的某类型文件,返回一个树形结构体,让前端显示为树形的目录结构
最近遇到一个问题就是某个linux的目录下有各种文件现在的要求是只需要返回.kml格式的文件,并根据前端要求返回如下结构体即:[{'children': [{'children': [{'title' ...
- 转 html5离线储存,application cache,manifest使用体验
html5离线应用application cache 最近在APP里新增一个论坛模块,为了快速地完成,决定将整个论坛模块做成WEB APP,WEB APP最致命的就是用户体验问题,页面跳转和过多的请求 ...
- javascript中的变量、作用域和内存问题
1.变量 变量的值的类型:基本类型值和引用类型值两种. 基本类型:Undefined.Null.Boolean.String.Number,这五类基本数据类型的值在内存中占有固定大小的空间,因此保存在 ...
- Visual formatting model 可视化格式模型
在可视化格式模型里,每个元素都是由一个或者多个盒子组成,这些盒子的布局由下面规则控制: box dimensions and type.(块元素和行内元素) positioning scheme (n ...
- R-CNN论文翻译——用于精确物体定位和语义分割的丰富特征层次结构
原文地址 我对深度学习应用于物体检测的开山之作R-CNN的论文进行了主要部分的翻译工作,R-CNN通过引入CNN让物体检测的性能水平上升了一个档次,但该文的想法比较自然原始,估计作者在写作的过程中已经 ...
- 浅谈web移动端适配问题
一.布局方案 目前在解决移动端页面适配问题方案选择上,目前用得比较多是百分比布局,弹性布局flex,rem布局,本文将重点跟大家探讨rem布局. 二.viewport 在介绍rem布局之前,首先跟大家 ...
- HTML知识速递
1.html的定义 超文本标记语言(Hypertext Markup Language,HTML)通过标签语言来标记要显示的网页中的各个部分.一套规则,浏览器认识的规则 浏览器按顺序渲染网页文件,然后 ...