VTMagic的使用介绍(二)

前言

距离VTMagic正式开源已经过去整整一个月,这短短的时间里收获了九百多颗star,在GitHub月榜Objective-C语言中,其排名基本一直维持在前三。目前第一是雅虎的AppDevKit,第三名是大家熟知的AFNetworking。坦白说,这样的成绩完全出乎我的预料,大家对VTMagic的认可让我满怀欣喜的同时也变得有些忐忑不安。针对VTMagic的改进,我慢慢开始变得谨慎,每一次改动都需要不断测试验证,以保证其可以正常运行。个人的力量是微小的,希望能与各位江湖高手一起完善VTMagic,参与开源项目将会是一件很有趣的事!

正文

上一篇文章中,已经初步介绍了VTMagic的部分特性和基本使用,同时也收到了不少反馈,本文将进一步介绍VTMagic使用中的一些要点和技巧,并针对部分反馈做一些总结,希望对各位开发者能有所帮助。

重用机制

该机制是整个框架的核心,它保证了单个模块中即使有数十上百个页面,应用内存依旧可控,不会出现突然暴涨,甚至被系统强制杀死的情况。在预加载机制下,VTMagic默认会加载当前页面和下一个页面,也就是说同时被加载的页面可能有两个,也可能有三个,具体视当前页面的位置而定。若当前页面处于两侧边缘,则被加载的页面有两个,若在中间则会有三个页面被加载。这也是有些开发者反馈的viewControllerAtPage:方法会被多次调用的原因。

而之前加载的其它页面则会在不需要时被移除,并放到内部缓存池中等待重用。当某个页面即将被重用时,方法vtm_prepareForReuse会被调用,该方法属于协议VTMagicReuseProtocol,需要开发者在各子页面中手动重写,通常可以在这个方法中清除页面旧数据、修正页面偏移等。

需要说明的是,可以通过将属性needPreloading置为NO来关闭预加载机制。在预加载机制关闭的情况下,VTMagic只会加载当前显示的页面,而不再预加载下一页,同时点击菜单项切换时,页面也不再有切换动画。

生命周期方法

当某个子页面出现或消失时,VTMagic能准确触发其相应的生命周期方法(viewWillAppear:等)。如果该页面是可重用的,则可以将网络请求放在viewDidAppear:方法中,然后根据menuInfo.menuId去请求当前菜单项的对应数据,作为必要的补充,请求时应该判断一下页面是否已经有了最新数据;与之相对的,我们应该在viewWillDisappear:viewDidDisappear:方法中将网络请求取消掉,以免被重用后页面数据错乱和造成不必要的流量开销。而如果页面是唯一的,即不会有其它页面重用该页面,这种情况下也可以将网络请求放在viewDidLoad方法中,特别是当预加载逻辑关闭时,即needPreloadingNO时。

谈到网络请求就不得不说加载本地数据的问题。针对可重用页面,当其menuInfo改变时(可重写menuInfosetter方法),我们通常需要为页面加载缓存数据,以保证滑动切换时能有良好的用户体验。关于缓存数据,可以是从数据库中读取,也可以直接将之前的页面数据保存到某个变量中以供后来使用,甚至可以从plist文件中获得,根据具体情况可灵活选择。

刷新和切换

  • reloadData方法会重新加载所有页面;
  • reloadDataToPage:方法会在重新加载所有页面时,同步聚焦到指定页面;
  • switchToPage:animated:方法用于在需要的时候切换到指定页面。

以上三个方法的使用场景各有不同,可根据具体情况灵活使用。需要注意的是,应尽可能避免在viewWillAppear:viewWillDisappear:方法中调用以上方法,否则会造成某些页面的生命周期方法不能准确触发,控制台会输出类似Unbalanced calls to begin/end appearance transitions for <VTGridViewController: 0x7fc3e2d43a70>的警告。这是因为这时的currentViewController与之后viewDidAppear:viewDidDisappear:方法中的currentViewController不是同一个,也就是说currentViewController的生命周期没有完整触发。而在viewDidLoadviewDidAppear:viewDidDisappear:或者其它地方调用以上方法都是没问题的。

多层嵌套

VTMagic支持多层嵌套,也就是在子页面中可以再嵌套一个VTMagic,类似需求一般常见于iPad项目,其使用原则与单个VTMagic的使用一致,并无其它明显区别。

跨层级业务处理

为方便跨层级处理业务,VTMagic提供了在子页面中直接访问上层最近主控制器的方法self.magicController,甚至你可以进一步通过self.magicController. magicView拿到当前的magicView。当然,你也可以通过self.vtm_pageIndex获取当前页面的索引。同样的,在主控制器中可以通过self.currentViewControllerself.currentPage获取当前显示的页面和索引。

自定义组件

VTMagic中几乎所有组件都支持自定义,框架本身主要提供核心的切换逻辑处理和良好的性能管理,开发者可根据业务需要自定义对外接口提供的任意组件。

自定义menuItem

你可以在menuItemAtIndex:方法中返回自定义的任意menuItem,只要它是UIBUtton类型即可。menuItem是顶部菜单栏中的单个菜单项,其可以支持文本、图片、文本+图片等几种格式。可见菜单栏文本的颜色和字体就是通过修改menuItem的文本和颜色来实现的,VTMagic本身并不直接提供修改文本和字体的接口。

自定义菜单栏两侧视图

可以通过属性leftNavigatoinItemrightNavigatoinItem在顶部菜单栏两侧添加任意视图,需要注意的是,被添加的视图应该有确定的size,然后VTMagic会自动完成相应布局。

自定义sliderView

由于需求各有不同,VTMagic提供的下划线、气泡等样式可能都不是你想要的,这种情况下你可以通过setSliderView:方法来自定义任意样式的sliderView,比如类似demo中的显示一个三角标识等。

自定义separatorView

如果需要,你甚至可以通过方法setSeparatorView:自定义顶部导航分割线,不过一般情况下应该是没这必要的。

其它

  • VTMagic中有许多有意思的小feature,比如scrollEnabledswitchEnabledswitchEvent以及navigationInset等等,详情请参见VTMagicView.h文件。
  • 关于VTMagic的所有重要修改都会记录在GitHub上的变更日志中,想知道每个版本都有哪些更新,可查阅该文件。

结束语

最后,按照惯例,如果你喜欢这个轮子,请留下一颗star,这是对作者最大的鼓励和支持,拜谢!!!假如你有更好的想法或方案,也欢迎提交pull request!!!GitHub地址

上一篇文章:VTMagic的使用介绍

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,259评论 25 707
  • 内容抽屉菜单ListViewWebViewSwitchButton按钮点赞按钮进度条TabLayout图标下拉刷新...
    皇小弟阅读 46,683评论 22 664
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,977评论 4 60
  • 多年以后他才明白那看似来来回回的鸟,其实并不是最初的那一只,他所感动的,是自己自以为的归巢。其实候鸟无非是寻求适宜...
    可可西里一根草阅读 242评论 0 1
  • 童话不是尽都美好,其实仍然是现实的折射。只是,相比现实,童话的温暖力量,在于抚慰人心,在于用光明和希望,让人相信,...
    流落于笔尖的灵魂阅读 187评论 0 0