使用StackView以及其他UI元素来完善一个iOS程序的界面功能

  • 时间:2017-05-26
  • 分类:IOS开发
  • 2157 人浏览
[导读]原先的App用于从Github上下载Swift提交信息,然后显示出来。App通过Github暴露出来的API接口返回json信息,然后将其通过CoreData保存...

原先的App用于从Github上下载Swift提交信息,然后显示出来。App通过Github暴露出来的API接口返回json信息,然后将其通过CoreData保存到本地数据库中。

在最后作者遗留了4个未完成的问题,如下:

我们依次来解决,不要被上面一大串的英文吓跑,实现起来也没你想象的那么难 ;)

1.修正FetchRequestController(后面简称为FRC)的Section排序错误

因为将FRC的section机制启用,所以原先的按日期的单排序出现错误,我们只需要增加一个按name的排序,和之前的按日期的排序一起组成排序数组即可:

这里写图片描述

从上图可以看出,现在按name分组显示是正常的,所以第一个问题就解决啦 ;)

2.将提交url页面在WKWebView中显示

原先只是用一个UILable简单的显示commit里的内容,不太美观。因为每个commit都有一个url地址指向其详细信息,我们可以用WKWebView对象将其显示在视图中。

首先需要略微修改原来Main.storyboard中DetailViewController的布局,大致上就是将原先得UILabel放到新添加的UIStackView中去,并且将UIStackView的元素间隔设置为5,并且设置Outlet为webView:

这里写图片描述

因为我们希望在加载页面时给用户一个反馈,所以我们打算用旋转指示器来表示页面正在加载,首先导入WebKit,让DetailViewController遵守WKNavigationDelegate协议,然后在其中增加一个属性:

我们需要在DetailViewController显示的时候随即开始加载url页面,同时旋转指示器:

当然我们需要在页面加载完毕后将指示器删除,所幸的是我们前面遵守了WKNavigationDelegate协议,我们现在只需要在页面加载完毕的回调方法里处理就可以了:

大概就是下面这个效果:

这里写图片描述

那么这第二个问题也轻松解决了 ;)

3.使用NSUserDefaults保存最近的日期

这是一个细微的小问题,不注意可能都发现不了:当我们删除最近的commit时,下一次刷新该commit还是会出现,但是删除其他的commit并无此情况。问题的原因在于我们需要现存的最近commit作为标准,如果将其删除,就会取得错误的数据。

我们可以立即想到解决之道在于用一个不会“丢失”的地方保存最近日期,即NSUserDefaults,打开MasterViewController,废除原来的func getNewestCommitDate()->String方法,将其拆分为2个小方法:

因为我们只需要在从本地加载数据后更新最近的日期,所以在loadSavedData()方法中try fetchedResultsController.performFetch()一行后面添加如下代码:

然后在fetchCommits方法开头从UserDefaults中取得最近的日期:

这样每次App运行后会从数据库中加载最近的日期,每次从web中取得更新数据后也会更新一次最近日期,所以这个bug从此搞定了。这样留给我们的就只剩最后一个问题啦。

4.创建新的TableViewController显示某位提交者的所有提交

最后一个问题同样简单,我们在Xcode中创建一个新类CommitsViewController继承于UITableViewController,为其添加2个属性:

我们需要在VC加载时初始化commits数组,在viewDidLoad中添加如下代码:

为了能够在cell里显示完整commit的内容,我们需要设置自动Cell高度:

最后我们补全TableView的UI回调方法:

好啦,大功告成,我们看一下最终的App效果:

这里写图片描述

通过上面4个小问题的解决,我为大家展示了如何一步一步使用小重构的方式完善功能,写了这么多代码,希望您对重构有所感悟

来源:本文为线上采编,如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除!