最終效果
<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 />