最终效果
day21.gif<br />
1、UI布局
一个TableView就没其他的了,很简单,如果你之前有看过前面系列的文章。不介绍了
<br />
2、代码实现
新的知识点:
- 在一个Swift中可以创建多个类
在自定义的Cell类中创建一个cell的模型
class cellModel : NSObject{
let image :String
let name : String
init(image:String,name : String){
self.image = image
self.name = name
}
}
<br />
- 在同一个文件下(*.swift),private修饰的变量/常量,可以在整个文件使用,所以模型也可以添加上private
class cellModel : NSObject{
private let image :String
private let name : String
init(image:String,name : String){
self.image = image
self.name = name
}
}
<br />
在之前的文章中已经把DataSource抽取了出来,从而达到减少controller中代码过于复杂,这里把代码贴出来
PS:其实代码没多少,就是注释多了点...
//
// TBDataSource.swift
// CustomPullToRefresh
//
// Created by ios on 16/9/26.
// Copyright © 2016年 ios. All rights reserved.
//
import UIKit
/**
设置Section样式,默认 Single
*/
public enum TBSectionStyle : Int {
///Default 默认没有多个Section
case Section_Single
/// 有多个Section
case Section_Has
}
typealias TBMoveCellBlock = ((item : UITableViewRowAction,index : Int) -> Void)?
class TBDataSource: NSObject,UITableViewDataSource,UITableViewDelegate {
/**
数据类型
*/
private var sectionStyle : TBSectionStyle = .Section_Single
/**
数据源
*/
private var data : NSArray?
/**
标识符
*/
private var identifier : String = "null"
/**
cell回调
*/
private var cellBlock : ((cell : AnyObject, item : AnyObject) -> ())?
private var moveBlock : TBMoveCellBlock?
/**
快速创建一个数据源,需要提前注册,数组和style要对应
- parameter identifier: 标识
- parameter data: 数据
- parameter style: 类型
- parameter cell: 回调
- returns: 数据源对象(dataSource)
*/
class func cellIdentifierWith(identifier : String , data : NSArray , style : TBSectionStyle , cell : ((cell : AnyObject, item : AnyObject) -> Void)) -> TBDataSource {
let source = TBDataSource()
source.sectionStyle = style
source.data = data
source.identifier = identifier
source.cellBlock = cell
return source
}
/**
返回数据
- parameter indexPath: indexPath
- returns: 数据
*/
private func itemWithIndexPath(indexPath : NSIndexPath) -> AnyObject{
if sectionStyle == .Section_Single {
return data![indexPath.row]
}
else{
return data![indexPath.section][indexPath.row]
}
}
/**
返回有多少个Section
- parameter tableView: tableView
- returns: section
*/
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
if sectionStyle == .Section_Single {
return 1
}
return (data?.count)!
}
/**
返回对应Section的rows
- parameter tableView: tableView
- parameter section: section
- returns: rows
*/
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
if sectionStyle == .Section_Single {
return (data?.count)!
}else{
return (data?[section].count)!
}
}
/**
返回cell,并用闭包把cell封装到外面,提供样式设置
- parameter tableView: tableView
- parameter indexPath: indexPath
- returns: cell
*/
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier(identifier, forIndexPath: indexPath)
if let block = cellBlock {
block(cell: cell, item: itemWithIndexPath(indexPath))
}
return cell
}
}
<br />
2.1 实现代理方法 delegate方法
PS:代码中的注释都比较全了,就不做介绍了
func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {
//创建选项
let delete = UITableViewRowAction(style: .Normal, title: "🗑\n删除") { action, index in
print("Delete button tapped")
//刷新页面
self.tableView.reloadRowsAtIndexPaths([index], withRowAnimation: UITableViewRowAnimation.Fade)
}
delete.backgroundColor = UIColor.grayColor()
//创建选项
let share = UITableViewRowAction(style: .Normal, title: "🤗\n分享") { (action: UITableViewRowAction!, indexPath: NSIndexPath) -> Void in
//创建一个分享页面
let activityViewController = UIActivityViewController(activityItems: ["老师","老司机"], applicationActivities: [PQCustomActivity()])
//加载分享页面
self.presentViewController(activityViewController, animated: true, completion: nil)
//刷新页面
self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Fade)
}
share.backgroundColor = UIColor.redColor()
//创建选项
let download = UITableViewRowAction(style: .Normal, title: "⬇️\n下载") { action, index in
print("Download button tapped")
//刷新页面
self.tableView.reloadRowsAtIndexPaths([index], withRowAnimation: UITableViewRowAnimation.Fade)
}
download.backgroundColor = UIColor.blueColor()
return [download, share, delete]
}
- 关于分享controller:
介绍UIActivityViewController
展示重点:
官方文档:When presenting the view controller, you must do so using the appropriate means for the current device. On iPad, you must present the view controller in a popover. On iPhone and iPod touch, you must present it modally
中文翻译(大概意思):当展示这个ViewController的时候需要根据当前的设备类型进行判断,在iPad上面使用popover,在其他的设备上面使用present
excludedActivityTypes - 忽略类型
NSString *const UIActivityTypePostToFacebook;
NSString *const UIActivityTypePostToTwitter;
NSString *const UIActivityTypePostToWeibo;
NSString *const UIActivityTypeMessage;
NSString *const UIActivityTypeMail;
NSString *const UIActivityTypePrint;
NSString *const UIActivityTypeCopyToPasteboard;
NSString *const UIActivityTypeAssignToContact;
NSString *const UIActivityTypeSaveToCameraRoll;
NSString *const UIActivityTypeAddToReadingList;
NSString *const UIActivityTypePostToFlickr;
NSString *const UIActivityTypePostToVimeo;
NSString *const UIActivityTypePostToTencentWeibo;
NSString *const UIActivityTypeAirDrop;
<br />
UIActivity - 服务
官方文档:This class must be subclassed before it can be used. The job of an activity object is to act on the data provided to it and to provide some meta information that iOS can display to the user. For more complex services, an activity object can also display a custom user interface and use it to gather additional information from the user
中文翻译(大概意思):UIActivity必须通过继承来使用,他主要是操作给用户展示的信息,而且还可以操作展示定制化的界面来获取给多的数据信息
- 关于Activity
//
// PQCustomActivity.swift
// TableViewCellEdit
//
// Created by ios on 16/9/28.
// Copyright © 2016年 ios. All rights reserved.
//
import UIKit
class PQCustomActivity: UIActivity {
private let UIActivityTypePQCustomMine = "UIActivityTypePQCustomMine"
//类型
override func activityType() -> String? {
return UIActivityTypePQCustomMine
}
//标题
override func activityTitle() -> String? {
return NSLocalizedString("customActivity", comment: "")
}
//图片
/*
deivce ios version size (pt)
iphone ipod ios 6 < 43*43
iphone ipod ios 7 60*60
ipad ios 6 < 60*60
ipad ios 7 76*76
retina all @2x
*/
override func activityImage() -> UIImage? {
return UIImage(named: "icon2")
}
//指定可以处理的数据列席,如果可以处理返回 ture
override func canPerformWithActivityItems(activityItems: [AnyObject]) -> Bool {
return true
}
// 点击我们自定义的按钮,调用自定义服务处理之前的准备工作,都需要在这方法中指定,比如可以根据数据展示一个界面来获取用户的额外数据信息
override func prepareWithActivityItems(activityItems: [AnyObject]) {
print("想操作更多的东西,就在我这里处理")
}
//返回操作类型
/*
UIActivityCategoryAction 表示在最下面一栏的操作型服务,比如Copy、Print
UIActivityCategoryShare 表示在中间一栏的分享型服务,比如一些社交软件
*/
override class func activityCategory() -> UIActivityCategory{
return UIActivityCategory.Share
}
//要处理的事情
override func performActivity() {
print("你要我干嘛")
}
}
<br />
网友评论