Ryan

Back To My Keyboard


  • 首页

  • 归档

项目中不常出现但非常有用的设置

发表于 2020-08-13

没有更新Blog已经很久了,实在是懒的惭愧😂。终于在经历了去年的风波和今年的疫情后安稳了下来,也因为Swift也只是在之前工作之余中学过一点,并没有在真正的项目中使用过,所以还是很有必要好好的记录记录。

从手中项目中的表现来看主要功能的实现还是没什么问题的,主要的问题在于一些比较特殊情况的实现或者说应该注意的点。这些情况实现虽然出现的不是那么的频繁,但能在不查资料的情况下使用它们还是再好不过的。以下都是在项目中碰到的情况。

Swift 4.0

自定义TabelViewCell 的 arrowImage 在 .scaleAspectFit 状态下如何修改原生的箭头图标

1
2
3
4
5
6
let arrowImage = UIImageView.init(frame: CGRect(x: 0, y: 0, width: 20, height: 20))

arrowImage.contentMode = .scaleAspectFit

arrowImage.image = UIImage(named: "next_icon")
cell.accessoryView = arrowImage

虽然可以在自定义的Cell中设置统一的箭头Icon,但在Cell的布局相对简单又觉得创建一个自定义的Cell又显麻烦,而且用自带的Cell样式就能搞定的情况下要修改箭头的样式。使用这种方式就很方便了。

隐藏TabelViewCell 没有内容的区间(不显示没有内容区域的分割线)

1
tableView.tableFooterView = UIView()
阅读全文 »

load & initialize

发表于 2019-08-15

load、initialize方法在平时的项目真的说实话压根就没怎么用过,唯一有印象的是在Runtime的Method Swilzzing的作用下在Cagetory中有定义过load方法。粗咯整理以下几点。

阅读全文 »

MVVM简谈

发表于 2019-06-30

搬砖的时间总是过的很快,在新环境已满一个月了。想想之前找工作面试时被各种问题问的发愣时的种种尴尬,想想关键还是自身的原因。因为在上份工作期间只顾着学习新的知识点而没有花时间去做深入总结. 有了之前的教训应当引以为戒。

当然该文章主要目的并不是发牢骚。而是在这一个月内自己对MVVM的一个接触和大致的理解。虽然我一直很怀疑对于一年多点的经验的我现来才开始理解MVVM是否已晚,但我始终坚信学了总没有错!

之前是一直沉浸在自我认为的MVC中,对于MVC的理解还是远远不够的,也没有花时间去深入理解过,只是在大致的理解同时在项目中自我认为比较合理的去实现模块的分离工作。

低耦合

经过一些Blog的阅读和实践,在低耦合上我是这么理解的:少写重复的代码,利用现有的资源实现相同的功能。就拿TableView的实现来说Delegate和DataSource 是必不可少的,在MVC中我会一股脑的在ViewController中去实现它们,然后在其他的类中重复着相同的事情。这显然不是低耦合

而在MVVM的实现中我却发现真正低耦合的其实只有DataSource。因为对于Delegate部分方法在不同功能的TableView实现中是不一样的。而DataSource的实现却是很固定的,简单点说无非就是多分区和单个分区的区别以及cellForRowAtIndexPath的内部实现了。这些实现完全可以通过一定的方法固定实现。

当然Delegate也可以,但是相对于DataSource只有几个主要的方法来说Delegate是相当不稳定的。因为在平时的项目中Delegate的方法使用率相对比较是更高的。又比如didSelectRowAtIndexPath的方法又不得不从新回到ViewControll中来实现点击的跳转。

按照MVVM设计思路,被重用的是ViewModel,而改变内容的其实只有Model。Model多半只涉及到数据跟操作是没有多大关联的。

开发需求

MVVM出现有个作用是为了解决在MVC中厚重的ViewController。但是以我目前的接触过的项目来说我并没有碰到过这种情况,因为目前的模块功能并不会复杂到不得不在ViewController内写过超千行的代码量。即使如此我想很多人都会绕过采用更优的方法来实现。


其实以上几点并不是对MVVM的排挤,相反而是一种对比和理解。每个设计模式都有自己有优缺点,哪种更适合自己的项目、更容易维护当然只有自己最清楚了。

Runtime

发表于 2019-05-12

Runtime的特性是消息/方法的传递,如果消息/方法在对象中找不到,就进行转发。是对获取Objective-C运行时和Objective-C根类底层的访问。

都知道Objective-C是C语言的一门衍生语言,而Runtime的核心就是C。C语言在函数调用的时候就会决定用哪个函数,如果调用了未实现的函数就会报错。然而Objective-C是一门动态语言,即在动态调用过程(运行时)编译器才会决定调用哪个函数。当调用的某对象为被实现时,可以通过”消息转发”进行解决,即编译截断。

下面讲讲Runtime的作用:

阅读全文 »

防止Button连续点击-Runtime的使用

发表于 2019-05-11

面试时被问及的一个问题,容我技术菜接触少被问及时虽然吞吞吐吐说了点,但毕竟没接触也不是很有信心,具体怎么实现更不用说了。面试完回来后就翻阅各种文章发现用的最多的就是Runtime的方法交换功能了。在此只是个人的知识点整理,各位客官如有不足多多提点。

阅读全文 »

Category & Extension

发表于 2019-05-07

对于什么是Category,我觉得还是从其作用上将应该更容易理解。

由于某些原因发现现有的类的方法特别是系统自带的类无法满足现有的情况,那怎么办呢?这个时候Category就出现了。因为Category可以在不改变原有类的结果情况下添加自己自定义的方法。需要注意的是Category原则上只能添加方法而不能添加属性。为什么是原则上情况呢?下文会逐步讲解。

Category 有分类和类别两种叫法。

上面只是笼统的讲述了Category,下面来逐个讲解相关功能。

一:添加方法

首页创建一个Category。此处创建了一个UIColor的分类Default,并自定义一个方法。

阅读全文 »

Property

发表于 2019-05-07

提到属性必然要理解Property了。

Property:(属性)是Objective-C的一项特性,用于封装对象中的数据。

  • Objective-C对象通常会把其所需要的数据保存为各种实例变量。

先理解下实例变量:

  • 实例变量:属性是用变量来表示的,这种变量就称为实例变量。是在类声明的内部但是在类的其他成员方法之外声明的。一般通过”存取方法”来访问。
1
2
3
4
5
6
7
8
9
10
// 比如定义一个 NSString类型 的属性 strongedStr。
@interface Test_ViewController ()

@property NSString * strongedStr;

@end

// 当我们要调用这个strongedStr属性时系统会自动帮我们生成一个实例变量`_ strongedStr` 已经对应的setter和get方法

_strongedStr = @"";
阅读全文 »

理论知识总结一属性关键字

发表于 2019-04-25

属性关键字:

  • atomic
  • nonatomic
  • strong
  • weak
  • copy
  • assign
  • retain
  • readwrite
  • readondy
  • unsafe_unretained

属性关键字与所有权关键字之间是对应关系:

  • assign 对应 __unsafe_unretained修饰符
  • copy 对应__strong修饰符
  • retain 对应 __strong修饰符
  • strong 对应 __strong修饰符
  • unsafe_unretained 对应 __unsafe_unretained修饰符
  • weak 对应 __weak修饰符
阅读全文 »

理论知识总结一ARC

发表于 2019-04-17

近几个星期一直在看面试题,一开始说实话真的只是为了应付之后的面试但是越来越发现我的想法真的是一个天真+无邪!原因其实很简单面试的时候面试官可能只提几个跟自己公式项目相关的题目但也有可能提其他的,然而有一点是肯定的那就是随机性。作为应聘者的我们必然不清楚面试官会问些什么,但是我们又必须掌握那些面试官可能不会提及的问题。二来知识点其实都是连贯的很少有“单独“存在的理论知识,当你理解其中一层的含义的同时必然会引发出其他层面的知识,理解双层或者多层的知识这必然是个大工程。既然这样为什么不逐一的深入理解呢?说这些也无非在提醒自己和看到该文章的亲们。

既然要“逐一”去理解那必然也得有个起步,经过这么久的面试图了解发现从ARC/MRC开始理解还是蛮合理的。废话不多说直接进入主题。(在此也说明下:本文主要内容还是来源于网络相关文章的总结,如有侵权行为望能联系我做及时修改 谢谢!)

阅读全文 »

Git clone & update

发表于 2019-04-10

Clone

CD到一个目录然后执行以下步骤:

1
$ git clone xx // 项目地址

过程

1
2
3
4
5
6
7
Cloning into 'ZGPageMenu'...
remote: Enumerating objects: 121, done.
remote: Counting objects: 100% (121/121), done.
remote: Compressing objects: 100% (85/85), done.
remote: Total 121 (delta 34), reused 114 (delta 27), pack-reused 0
Receiving objects: 100% (121/121), 56.63 KiB | 19.00 KiB/s, done.
Resolving deltas: 100% (34/34), done.

然后就可以开始修改

阅读全文 »
123

Ryan

26 日志
© 2020 Ryan
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.3