纯Swift代码构建一个功能完善的APP
源代码地址:https://github.com/yoferzhang/FoodPin
效果演示
iOS11之后,导航栏可以设置这样变大的效果。
在 ViewController 的 viewDidLoad() 方法中添加下面这行代码可以实现:
1 | // iOS11之后这个属性可以让导航栏往下滑动的时候title变大 |
向右滑动菜单:
向左滑动菜单:
tableView,actionSheet
详情页面
导航栏透明,并修改大字体状态的title颜色, viewDidLoad()
中
1 | navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default) |
详情页面的导航栏变透明,返回按钮变色
1 | navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default) |
调整tableView的顶部位置
1 | detailTableView.contentInsetAdjustmentBehavior = .never |
全局修改导航栏的返回按钮 application(_:didFinishLaunchingWithOptions:)
中添加
1 | let backButtonImage = UIImage(named: "back") |
修改详情页状态栏,
1 | /// 状态栏颜色 |
可以没有生效,因为会用导航栏controller的颜色,为了让可以针对性修改页面,加一个Extension文件,UINavigationController+Ext.swift
1 | import UIKit |
添加地图信息
自定义 annotationView
,实现 MKMapViewDelegate
1 | //MARK: - MKMapViewDelegate |
1 | mapView.showsTraffic = true |
测试一些动画
代理回调,将选择的表情回调给详情页,展示在 headerView
的右下角
静态列表,textField
使用
图片选择器
改用 CoreData
存储数据,并用 NSFetchedResultsController
监听;新建局部刷新首页 tableview
删除后,局部刷新首页 tableview
1 | func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? { |
更新rating 表情,同样是数据库级别的更新,加 appDelegate.saveContext()
就可以
1 | //MARK: - YQRestaurantReviewViewControllerDelegate |
添加搜索栏,支持name搜索,搜索状态时禁止左右滑动的编辑态
tabBarController
About页面;使用元组;分别用 WKWebView
和 SFSafariViewController
打开web页面
使用iCloud,在 CloudKit Dashboard 中创建数据;原本是想上传图片,但 Dashboard 一上传那图片就 停止响应了,苹果这个做的有点坑==
然后用 Convenience API:
1 | func fetchRecordsFromCloud() { |
代码中拉取到的数据结构:
改用 Operational API。因为 Convenience API 不能只请求携带某些字段,它会把所有数据都完整拉下来
1 | func fetchRecordsFromCloud() { |
使用 UIActivityIndicatorView
和 UIRefreshControl
将数据存储到iCloud
1 | func saveRecordToCloud(restaurant: RestaurantMO!) -> Void { |