Day21 - TalbeViewCell滑動、分享

最終效果

day21.gif

<br />

1、UI布局

一個TableView就沒其他的了,很簡單,如果你之前有看過前面系列的文章。不介紹了

<br />

2、代碼實現(xiàn)

新的知識點:

  • 在一個Swift中可以創(chuàng)建多個類
    在自定義的Cell類中創(chuàng)建一個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 />
在之前的文章中已經(jīng)把DataSource抽取了出來,從而達到減少controller中代碼過于復(fù)雜,這里把代碼貼出來
PS:其實代碼沒多少,就是注釋多了點...

//
//  TBDataSource.swift
//  CustomPullToRefresh
//
//  Created by ios on 16/9/26.
//  Copyright ? 2016年 ios. All rights reserved.
//

import UIKit
/**
 設(shè)置Section樣式,默認(rèn) Single
 */
public enum TBSectionStyle : Int {
    
    ///Default 默認(rèn)沒有多個Section
    case Section_Single
    /// 有多個Section
    case Section_Has
}


typealias TBMoveCellBlock = ((item : UITableViewRowAction,index : Int) -> Void)?

class TBDataSource: NSObject,UITableViewDataSource,UITableViewDelegate {
    /**
     數(shù)據(jù)類型
     */
    private var sectionStyle : TBSectionStyle = .Section_Single
    /**
     數(shù)據(jù)源
     */
    private var data : NSArray?
    /**
     標(biāo)識符
     */
    private var identifier : String = "null"
    /**
     cell回調(diào)
     */
    private var cellBlock : ((cell : AnyObject, item : AnyObject) -> ())?

    private var moveBlock : TBMoveCellBlock?
    
    
    /**
     快速創(chuàng)建一個數(shù)據(jù)源,需要提前注冊,數(shù)組和style要對應(yīng)
     
     - parameter identifier: 標(biāo)識
     - parameter data:       數(shù)據(jù)
     - parameter style:      類型
     - parameter cell:       回調(diào)
     
     - returns: 數(shù)據(jù)源對象(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
        
    }
    /**
     返回數(shù)據(jù)
     
     - parameter indexPath: indexPath
     
     - returns: 數(shù)據(jù)
     */
    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)!
    }
    
    /**
     返回對應(yīng)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封裝到外面,提供樣式設(shè)置
     
     - 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 實現(xiàn)代理方法 delegate方法
PS:代碼中的注釋都比較全了,就不做介紹了

func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {
        //創(chuàng)建選項
        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()
        
        //創(chuàng)建選項
        let share = UITableViewRowAction(style: .Normal, title: "??\n分享") { (action: UITableViewRowAction!, indexPath: NSIndexPath) -> Void in
            
            //創(chuàng)建一個分享頁面
            let activityViewController = UIActivityViewController(activityItems: ["老師","老司機"], applicationActivities: [PQCustomActivity()])
            //加載分享頁面
            self.presentViewController(activityViewController, animated: true, completion: nil)
            
            //刷新頁面
            self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Fade)
        }
        share.backgroundColor = UIColor.redColor()
        
        //創(chuàng)建選項
        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]
    }
  • 關(guān)于分享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
中文翻譯(大概意思):當(dāng)展示這個ViewController的時候需要根據(jù)當(dāng)前的設(shè)備類型進行判斷,在iPad上面使用popover,在其他的設(shè)備上面使用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 - 服務(wù)
官方文檔: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必須通過繼承來使用,他主要是操作給用戶展示的信息,而且還可以操作展示定制化的界面來獲取給多的數(shù)據(jù)信息

  • 關(guān)于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
    }
    //標(biāo)題
    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")
    }
    //指定可以處理的數(shù)據(jù)列席,如果可以處理返回 ture
    override func canPerformWithActivityItems(activityItems: [AnyObject]) -> Bool {
        return true
    }
    
    // 點擊我們自定義的按鈕,調(diào)用自定義服務(wù)處理之前的準(zhǔn)備工作,都需要在這方法中指定,比如可以根據(jù)數(shù)據(jù)展示一個界面來獲取用戶的額外數(shù)據(jù)信息
    override func prepareWithActivityItems(activityItems: [AnyObject]) {
        print("想操作更多的東西,就在我這里處理")
    }
    
    //返回操作類型
    /*
        UIActivityCategoryAction    表示在最下面一欄的操作型服務(wù),比如Copy、Print
        UIActivityCategoryShare     表示在中間一欄的分享型服務(wù),比如一些社交軟件
     */
    override class func activityCategory() -> UIActivityCategory{
        return UIActivityCategory.Share
    }
    
    //要處理的事情
    override func performActivity() {
        print("你要我干嘛")
    }
}

<br />

本文Demo- TableViewCellEdit

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • **2014真題Directions:Read the following text. Choose the be...
    又是夜半驚坐起閱讀 11,179評論 0 23
  • 朋友弟弟的分?jǐn)?shù),詢問怎么報考,抽出一點時間,回想這兩年經(jīng)歷,寫了一點文章,個人見解。 語文107,數(shù)學(xué)128,英1...
    紫燕南飛閱讀 366評論 0 0
  • 北京可是每個中國人的首都,在小學(xué)語文課本里就經(jīng)常見到了。如果活了大半輩子,做個中國人還沒去過北京,還是有點遺憾吧。...
    靜靜生長閱讀 418評論 0 1
  • 陰云方歇,春風(fēng)已渡,桃李羞探佳顏。 翠枝吐綠,飛燕羽輕含。 黃昏孤身一隅,向西南,往事如煙。 繁縟過,心緒難寧,何...
    麥草店主閱讀 282評論 0 0

友情鏈接更多精彩內(nèi)容