UITableView API

UITableView 的 api 大致分为三个部分

  1. UITableView 类定义的 api
  2. UITableViewDelegate 的 api
  3. UITableViewDataSource 的 api

1. UITableView 类定义

这一部分 api 主要是 UITableView 视图的一些基本设置
这是一些和 tableView 相关但是和其他视图控件关联不大的类声明

// tableView 风格样式枚举
public enum UITableViewStyle : Int {
    
    case Plain // regular table view (tableView 的常规样式)
    case Grouped // preferences style table view (tableView 偏好设置风格的样式)
}


// tableView 滚动位置的枚举
public enum UITableViewScrollPosition : Int {
    
    case None
    case Top            // 顶部
    case Middle         // 中间
    case Bottom         // 底部
}
// scroll so row of interest is completely visible at top/center/bottom of view
// cell 滚动交互完成后,视图的那一部分是完全可见的


// row animation 这个主要是用在添加 cell 和 删除 cell 的时候
public enum UITableViewRowAnimation : Int {
    
    case Fade                // 慢慢溶解的效果
    case Right               // slide in from right (or out to right) 从右开始滑
    case Left                // 从左 
    case Top                 // 从上
    case Bottom              // 从下
    case None                // available in iOS 3.0 (没有确定方向或效果)
    case Middle              // available in iOS 3.2.  attempts to keep cell centered in the space it will/did occupy 试图保持 cell 集中在空间/并占领
    case Automatic           // available in iOS 5.0.  chooses an appropriate animation style for you  自动选择
}

// Including this constant string in the array of strings returned by sectionIndexTitlesForTableView: will cause a magnifying glass icon to be displayed at that location in the index.
// This should generally only be used as the first title in the index.
// 这通常只应该用作索引中的第一个标题
@available(iOS 3.0, *)
// tableView 索引搜索的字符串
public let UITableViewIndexSearch: String

// Returning this value from tableView:heightForHeaderInSection: or tableView:heightForFooterInSection: results in a height that fits the value returned from
// tableView:titleForHeaderInSection: or tableView:titleForFooterInSection: if the title is not nil.
@available(iOS 5.0, *)
// 自动尺寸 
public let UITableViewAutomaticDimension: CGFloat

@available(iOS 8.0, *)
public enum UITableViewRowActionStyle : Int {
    
    case Default
    public static var Destructive: UITableViewRowActionStyle { get }
    case Normal
}

@available(iOS 8.0, *)
// tableView Row 事件 
public class UITableViewRowAction : NSObject, NSCopying {
    
    // 快速创建一个事件
    public convenience init(style: UITableViewRowActionStyle, title: String?, handler: (UITableViewRowAction, NSIndexPath) -> Void)

    // 获取事件的风格样式
    public var style: UITableViewRowActionStyle { get }
    // 标题
    public var title: String?

    // 背景颜色
    @NSCopying public var backgroundColor: UIColor? // default background color is dependent on style
    
  // 背景的效果
    @NSCopying public var backgroundEffect: UIVisualEffect?
}

@available(iOS 9.0, *)
// UITableViewFocusUpdateContext : 焦点更新的上下文
public class UITableViewFocusUpdateContext : UIFocusUpdateContext {
    
    public var previouslyFocusedIndexPath: NSIndexPath? { get }
    public var nextFocusedIndexPath: NSIndexPath? { get }
}


// This category provides convenience methods to make it easier to use an NSIndexPath to represent a section and row
// 索引对象的分类
extension NSIndexPath {
    
    // 用来快速创建一个索引对象
    public convenience init(forRow row: Int, inSection section: Int)
    
    // 获取  section
    public var section: Int { get }

    //  获取  row
    public var row: Int { get }
}

UITableView 声明

@available(iOS 2.0, *)
public class UITableView : UIScrollView, NSCoding {
    
    // 通过指定样式的方式来创建 TableView
    public init(frame: CGRect, style: UITableViewStyle) // must specify style at creation. -initWithFrame: calls this with UITableViewStylePlain
    // xib,sb 调用
    public init?(coder aDecoder: NSCoder)
    
    // 获取 tableView 样式
    public var style: UITableViewStyle { get }

    // 数据源(加载的数据获取)
    weak public var dataSource: UITableViewDataSource?
    // 代理(事件回调,和传递)
    weak public var delegate: UITableViewDelegate?

    // 行高(不设置返回默认值)
    public var rowHeight: CGFloat // will return the default value if unset
    
    // 组头高度(不设置返回默认高度)
    public var sectionHeaderHeight: CGFloat // will return the default value if unset

    // 组尾高度(不设置返回默认高度)
    public var sectionFooterHeight: CGFloat // will return the default value if unset

    @available(iOS 7.0, *)
    // 预估行高(默认是0,意思是没有预估)
    public var estimatedRowHeight: CGFloat // default is 0, which means there is no estimate

    @available(iOS 7.0, *)
    // 预估组头高度(默认是0,意思是没有预估)
    public var estimatedSectionHeaderHeight: CGFloat // default is 0, which means there is no estimate

    @available(iOS 7.0, *)
    // 预估组尾高度(默认是0,意思是没有预估)
    public var estimatedSectionFooterHeight: CGFloat // default is 0, which means there is no estimate

    @available(iOS 7.0, *)
     // 分隔线的边距
    public var separatorInset: UIEdgeInsets // allows customization of the frame of cell separators(允许自定义 cell 的分割线的 frame )
    
    @available(iOS 3.2, *)
    // 背景视图
    public var backgroundView: UIView? // the background view will be automatically resized to track the size of the table view.  this will be placed as a subview of the table view behind all cells and headers/footers.  default may be non-nil for some devices. 
    // 背景视图会自动更具 tableView 视图的大小来进行调整。背景视图将会放在 cell header footer 的后面,在某些是被上这个视图的值可能是非空的。
    



    // Data  数据 (和数据有关的基本都在这里)
    // 重新加载数据
    public func reloadData() // reloads everything from scratch. redisplays visible rows. because we only keep info about visible rows, this is cheap. will adjust offset if table shrinks
    // 从原始状态加载一切,再一次显示可见的行。因为这样的性能消耗是小的。
    @available(iOS 3.0, *)
    // 重新加载组索引标题
    public func reloadSectionIndexTitles() // reloads the index bar.(重新加载索引条 )
    



    // Info  基本信息的获取
    
    // 有多少组
    public var numberOfSections: Int { get }

    // 某组有多少行
    public func numberOfRowsInSection(section: Int) -> Int
    
    // 根据 组数来获取 组的 rect
    public func rectForSection(section: Int) -> CGRect // includes header, footer and all rows (rect 包含header footer 和所有的 cell )

    // 获取某一组里面 header 的大小位置
    public func rectForHeaderInSection(section: Int) -> CGRect

    // 获取某一组里面 Footer 的大小位置
    public func rectForFooterInSection(section: Int) -> CGRect

    // 获取 cell 的 大小位置信息
    public func rectForRowAtIndexPath(indexPath: NSIndexPath) -> CGRect
    
    // 根据传入的点来确定行和列的索引信息
    public func indexPathForRowAtPoint(point: CGPoint) -> NSIndexPath? // returns nil if point is outside of any row in the table

    // 根据 cell 来获取索引信息
    public func indexPathForCell(cell: UITableViewCell) -> NSIndexPath? // returns nil if cell is not visible

    // 根据一个给定的位置大小信息来获取范围内的索引信息
    public func indexPathsForRowsInRect(rect: CGRect) -> [NSIndexPath]? // returns nil if rect not valid
    
    // 根据一个索引获取一个 cell 
    public func cellForRowAtIndexPath(indexPath: NSIndexPath) -> UITableViewCell? // returns nil if cell is not visible or index path is out of range

    // 获取可用的 cell
    public var visibleCells: [UITableViewCell] { get }

    // 获取一个可用的行的索引信息
    public var indexPathsForVisibleRows: [NSIndexPath]? { get }
    
    @available(iOS 6.0, *)
    // 获取某组的 header 视图
    public func headerViewForSection(section: Int) -> UITableViewHeaderFooterView?

    @available(iOS 6.0, *)
    // 获取某组的 footer 视图
    public func footerViewForSection(section: Int) -> UITableViewHeaderFooterView?
    

    // 滚动到某一列的某一行
    public func scrollToRowAtIndexPath(indexPath: NSIndexPath, atScrollPosition scrollPosition: UITableViewScrollPosition, animated: Bool)

    // 滚动到选中行的附近
    public func scrollToNearestSelectedRowAtScrollPosition(scrollPosition: UITableViewScrollPosition, animated: Bool)
    



    // Row insertion/deletion/reloading.  row 的插入,删除,重新加载
    // 开始更新
    public func beginUpdates() // allow multiple insert/delete of rows and sections to be animated simultaneously. Nestable
    // 允许以动画的形式多行的插入,删除,和选中。(可以嵌套)

    // 结束更新
    public func endUpdates() // only call insert/delete/reload calls or change the editing state inside an update block.  otherwise things like row count, etc. may be invalid.
    // 只调用插入/删除/重载调用在一块更新或改变编辑状态。否则之类的行数等可能是无效的。
    
    // 插入组
    public func insertSections(sections: NSIndexSet, withRowAnimation animation: UITableViewRowAnimation)

    // 删除组
    public func deleteSections(sections: NSIndexSet, withRowAnimation animation: UITableViewRowAnimation)

    @available(iOS 3.0, *)
    // 刷新组
    public func reloadSections(sections: NSIndexSet, withRowAnimation animation: UITableViewRowAnimation)

    @available(iOS 5.0, *)
    // 移动组到哪一组
    public func moveSection(section: Int, toSection newSection: Int)
    
    // 插入一行
    public func insertRowsAtIndexPaths(indexPaths: [NSIndexPath], withRowAnimation animation: UITableViewRowAnimation)

    // 删除一行
    public func deleteRowsAtIndexPaths(indexPaths: [NSIndexPath], withRowAnimation animation: UITableViewRowAnimation)

    @available(iOS 3.0, *)
    // 刷新一行
    public func reloadRowsAtIndexPaths(indexPaths: [NSIndexPath], withRowAnimation animation: UITableViewRowAnimation)
    
    @available(iOS 5.0, *)
    // 移动一行到哪一行
    public func moveRowAtIndexPath(indexPath: NSIndexPath, toIndexPath newIndexPath: NSIndexPath)
    




    // Editing. When set, rows show insert/delete/reorder controls based on data source queries
    // 编辑操作,当设置,行显示插入/删除/重新排序控制基于数据源的查询
    

    // 是否正在编辑(默认是不能编辑的,设置是没有动画的)
    public var editing: Bool // default is NO. setting is not animated.
    // 设置是否编辑 (可以设置以动画的方式)
    public func setEditing(editing: Bool, animated: Bool)
    
    @available(iOS 3.0, *)
    // 是否允许选中 (默认是允许选中)在编辑模式下是不能被选中
    public var allowsSelection: Bool // default is YES. Controls whether rows can be selected when not in editing mode

    // 设置是否咋编辑模式的时候可以进行选中 (默认是不可以的)
    public var allowsSelectionDuringEditing: Bool // default is NO. Controls whether rows can be selected when in editing mode

    @available(iOS 5.0, *)
    // 是否允许多选 (默认是不支持多选的)
    public var allowsMultipleSelection: Bool // default is NO. Controls whether multiple rows can be selected simultaneously

    @available(iOS 5.0, *)
    是否允许在编辑模式下进行多选
    public var allowsMultipleSelectionDuringEditing: Bool // default is NO. Controls whether multiple rows can be selected simultaneously in editing mode
    


    // Selection  选择
    
    // 选中某行的 索引
    public var indexPathForSelectedRow: NSIndexPath? { get } // returns nil or index path representing section and row of selection.

    @available(iOS 5.0, *)
    // 返回选中多行的索引
    public var indexPathsForSelectedRows: [NSIndexPath]? { get } // returns nil or a set of index paths representing the sections and rows of the selection.
    
    // Selects and deselects rows. These methods will not call the delegate methods (-tableView:willSelectRowAtIndexPath: or tableView:didSelectRowAtIndexPath:), nor will it send out a notification.
    // 选中和取消选中多行,这些方法将不会被调用代理的方法和发送通知

     // 根据传入的索引选中某一行
    public func selectRowAtIndexPath(indexPath: NSIndexPath?, animated: Bool, scrollPosition: UITableViewScrollPosition)
    // 更具传入的索引取消选中某一行
    public func deselectRowAtIndexPath(indexPath: NSIndexPath, animated: Bool)
    




    // Appearance  外观设置
    
    // 组索引显示的最小行数  
    public var sectionIndexMinimumDisplayRowCount: Int // show special section index list on right when row count reaches this value. default is 0
    // 展示指定组索引,当这个 row 达到这个值的时候,(默认是 0)


    @available(iOS 6.0, *)
    // 组索引的颜色 (组索引文本的颜色)
    public var sectionIndexColor: UIColor? // color used for text of the section index

    @available(iOS 7.0, *)
    // 组索引的背景颜色
    public var sectionIndexBackgroundColor: UIColor? // the background color of the section index while not being touched(不是开始触摸的时候显示的颜色)
    @available(iOS 6.0, *)
    // 组索引指示器(跟踪的)颜色
    public var sectionIndexTrackingBackgroundColor: UIColor? // the background color of the section index while it is being touched(开始触摸的时候显示的颜色)
    
    // 分割线的样式
    public var separatorStyle: UITableViewCellSeparatorStyle // default is UITableViewCellSeparatorStyleSingleLine

    // 分隔线的颜色
    public var separatorColor: UIColor? // default is the standard separator gray
    
    @available(iOS 8.0, *)
    // 分隔线的效果
    @NSCopying public var separatorEffect: UIVisualEffect? // effect to apply to table separators
    
    @available(iOS 9.0, *)
    // 单元布局的利润跟读的宽度
    public var cellLayoutMarginsFollowReadableWidth: Bool // if cell margins are derived from the width of the readableContentGuide.
    
    // headerView
    public var tableHeaderView: UIView? // accessory view for above row content. default is nil. not to be confused with section header
    // footerView
    public var tableFooterView: UIView? // accessory view below content. default is nil. not to be confused with section footer
    



    // 通过重用标识符来获取 cell
    public func dequeueReusableCellWithIdentifier(identifier: String) -> UITableViewCell? // Used by the delegate to acquire an already allocated cell, in lieu of allocating a new one.
    @available(iOS 6.0, *)
    // 通过重用标识符加 索引的方式来获取 cell 
    public func dequeueReusableCellWithIdentifier(identifier: String, forIndexPath indexPath: NSIndexPath) -> UITableViewCell // newer dequeue method guarantees a cell is returned and resized properly, assuming identifier is registered

    @available(iOS 6.0, *)  
    // 获取重用的 header 和 footer view
    public func dequeueReusableHeaderFooterViewWithIdentifier(identifier: String) -> UITableViewHeaderFooterView? // like dequeueReusableCellWithIdentifier:, but for headers/footers
    
    // Beginning in iOS 6, clients can register a nib or class for each cell.
    // If all reuse identifiers are registered, use the newer -dequeueReusableCellWithIdentifier:forIndexPath: to guarantee that a cell instance is returned.
    // Instances returned from the new dequeue method will also be properly sized when they are returned.
    @available(iOS 5.0, *)
    // 通过 xib 注册 cell
    public func registerNib(nib: UINib?, forCellReuseIdentifier identifier: String)
    @available(iOS 6.0, *)
    // 通过 class 注册 cell
    public func registerClass(cellClass: AnyClass?, forCellReuseIdentifier identifier: String)
    
    @available(iOS 6.0, *)
    // 通过 xib 注册 header 和 footer 
    public func registerNib(nib: UINib?, forHeaderFooterViewReuseIdentifier identifier: String)
    @available(iOS 6.0, *)
    // 通过 class 注册 header 和 footer 
    public func registerClass(aClass: AnyClass?, forHeaderFooterViewReuseIdentifier identifier: String)
    
    // Focus
    
    @available(iOS 9.0, *)
    public var remembersLastFocusedIndexPath: Bool // defaults to NO. If YES, when focusing on a table view the last focused index path is focused automatically. If the table view has never been focused, then the preferred focused index path is used.
}

2. UITableViewDelegate

这一部分 api 主要是 UITableView 视图的中的一些事件进行传递,回调。

public protocol UITableViewDelegate : NSObjectProtocol, UIScrollViewDelegate {
    
    // Display customization  对 cell 的显示进行一些定制
    
    @available(iOS 2.0, *)
    // cell 将要显示
    optional public func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath)

    @available(iOS 6.0, *)
    // header View 将要显示
    optional public func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int)

    @available(iOS 6.0, *)
    // Footer View 将要显示
    optional public func tableView(tableView: UITableView, willDisplayFooterView view: UIView, forSection section: Int)

    // cell 已经显示
    @available(iOS 6.0, *)
    optional public func tableView(tableView: UITableView, didEndDisplayingCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath)

     // Header View 完成显示
    @available(iOS 6.0, *)
    optional public func tableView(tableView: UITableView, didEndDisplayingHeaderView view: UIView, forSection section: Int)

    // Footer View 完成显示
    @available(iOS 6.0, *)
    optional public func tableView(tableView: UITableView, didEndDisplayingFooterView view: UIView, forSection section: Int)
    


    // Variable height support  cell 高度的变量的支持
    
    @available(iOS 2.0, *)
    // 定制 cell 的高度
    optional public func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat

    @available(iOS 2.0, *)
    // 定制 Header 的高度
    optional public func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat

    @available(iOS 2.0, *)
    // 定制 Footer 的高度
    optional public func tableView(tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat
    


    // 这几个方法主要是用来提高 tableView 的性能的
    // Use the estimatedHeight methods to quickly calcuate guessed values which will allow for fast load times of the table.
    // 使用预估高度的方法可以快速的计算一个建议的值,这样将会加快 table 的加载时间
    // If these methods are implemented, the above -tableView:heightForXXX calls will be deferred until views are ready to be displayed, so more expensive logic can be placed there. 
    
    // 如果实现了这个方法,只有已经显示的单元视图才会调用  -tableView:heightForXXX  方法
    @available(iOS 7.0, *)
    // 预估 cell 的行高
    optional public func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat

    @available(iOS 7.0, *)
    // 预估 Header 的高
    optional public func tableView(tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat

    @available(iOS 7.0, *)
    // 预估 Footer 的高
    optional public func tableView(tableView: UITableView, estimatedHeightForFooterInSection section: Int) -> CGFloat
    



    // Section header & footer information. Views are preferred over title should you decide to provide both
    // section 的头和尾信息,视图是优于 title 被提供的。
    
    @available(iOS 2.0, *)
    // 定制 header 视图
    optional public func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? // custom view for header. will be adjusted to default or specified header height
    @available(iOS 2.0, *)
    // 定制 footer 视图
    optional public func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? // custom view for footer. will be adjusted to default or specified footer height
    



    @available(iOS 2.0, *)
    // row 的附件按钮的点击
    optional public func tableView(tableView: UITableView, accessoryButtonTappedForRowWithIndexPath indexPath: NSIndexPath)
    


    // Selection  选中
    
    // -tableView:shouldHighlightRowAtIndexPath: is called when a touch comes down on a row. 
    // Returning NO to that message halts the selection process and does not cause the currently selected row to lose its selected look while the touch is down.
    @available(iOS 6.0, *)
    // cell 将要高亮
    optional public func tableView(tableView: UITableView, shouldHighlightRowAtIndexPath indexPath: NSIndexPath) -> Bool
    
    @available(iOS 6.0, *)
    // cell 已经高亮
    optional public func tableView(tableView: UITableView, didHighlightRowAtIndexPath indexPath: NSIndexPath)

    @available(iOS 6.0, *)
    // cell 失去高亮
    optional public func tableView(tableView: UITableView, didUnhighlightRowAtIndexPath indexPath: NSIndexPath)
    
    // Called before the user changes the selection. Return a new indexPath, or nil, to change the proposed selection.
    @available(iOS 2.0, *)
    // 将要选中
    optional public func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath?

    @available(iOS 3.0, *)
    // 将要取消选中
    optional public func tableView(tableView: UITableView, willDeselectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath?

    // Called after the user changes the selection.
    @available(iOS 2.0, *)
    //  已经选中
    optional public func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)

    @available(iOS 3.0, *)
   //  已经取消选中
    optional public func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath)


    
    // Editing 编辑操作
    
    // Allows customization of the editingStyle for a particular cell located at 'indexPath'. If not implemented, all editable cells will have UITableViewCellEditingStyleDelete set for them when the table has editing property set to YES.
    @available(iOS 2.0, *)
    // 每一行 cell 的编辑的样式
    optional public func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle

    @available(iOS 3.0, *)
    optional public func tableView(tableView: UITableView, titleForDeleteConfirmationButtonForRowAtIndexPath indexPath: NSIndexPath) -> String?
    @available(iOS 8.0, *)
    optional public func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? // supercedes -tableView:titleForDeleteConfirmationButtonForRowAtIndexPath: if return value is non-nil
    
    // Controls whether the background is indented while editing.  If not implemented, the default is YES.  This is unrelated to the indentation level below.  This method only applies to grouped style table views.
    @available(iOS 2.0, *)
    optional public func tableView(tableView: UITableView, shouldIndentWhileEditingRowAtIndexPath indexPath: NSIndexPath) -> Bool
    
    // The willBegin/didEnd methods are called whenever the 'editing' property is automatically changed by the table (allowing insert/delete/move). This is done by a swipe activating a single row
    @available(iOS 2.0, *)
    optional public func tableView(tableView: UITableView, willBeginEditingRowAtIndexPath indexPath: NSIndexPath)
    @available(iOS 2.0, *)
    optional public func tableView(tableView: UITableView, didEndEditingRowAtIndexPath indexPath: NSIndexPath)
    
    // Moving/reordering
    
    // Allows customization of the target row for a particular row as it is being moved/reordered
    @available(iOS 2.0, *)
    optional public func tableView(tableView: UITableView, targetIndexPathForMoveFromRowAtIndexPath sourceIndexPath: NSIndexPath, toProposedIndexPath proposedDestinationIndexPath: NSIndexPath) -> NSIndexPath
    
    // Indentation
    
    @available(iOS 2.0, *)
    optional public func tableView(tableView: UITableView, indentationLevelForRowAtIndexPath indexPath: NSIndexPath) -> Int // return 'depth' of row for hierarchies
    
    // Copy/Paste.  All three methods must be implemented by the delegate.
    
    @available(iOS 5.0, *)
    optional public func tableView(tableView: UITableView, shouldShowMenuForRowAtIndexPath indexPath: NSIndexPath) -> Bool
    @available(iOS 5.0, *)
    optional public func tableView(tableView: UITableView, canPerformAction action: Selector, forRowAtIndexPath indexPath: NSIndexPath, withSender sender: AnyObject?) -> Bool
    @available(iOS 5.0, *)
    optional public func tableView(tableView: UITableView, performAction action: Selector, forRowAtIndexPath indexPath: NSIndexPath, withSender sender: AnyObject?)
    
    // Focus
    
    @available(iOS 9.0, *)
    optional public func tableView(tableView: UITableView, canFocusRowAtIndexPath indexPath: NSIndexPath) -> Bool
    @available(iOS 9.0, *)
    optional public func tableView(tableView: UITableView, shouldUpdateFocusInContext context: UITableViewFocusUpdateContext) -> Bool
    @available(iOS 9.0, *)
    optional public func tableView(tableView: UITableView, didUpdateFocusInContext context: UITableViewFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator)
    @available(iOS 9.0, *)
    optional public func indexPathForPreferredFocusedViewInTableView(tableView: UITableView) -> NSIndexPath?
}

3. UITableViewDataSource

决定了视图的内容显示,和一些与数据有关的设置

public protocol UITableViewDataSource : NSObjectProtocol {

     //*******************  这三个方法是 tableView 显示数据的基本方法,实现这三个方法就可以显示 tableView 的内容  ************************
    @available(iOS 2.0, *)  // iOS 2.O 开始使用
    //  tableView 有多少行
    public func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    
    // Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier:
    // 行显示的时候,通过设置 cell 的重用标识符,和调用 dequeueReusableCellWithIdentifier 方法来确认是否有可重用的 cell,尝试去重用 cell,
    // Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls)
    
    @available(iOS 2.0, *)
    // 每一行 cell 显示什么内容
    public func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
    
    @available(iOS 2.0, *)
    // tableView 有多少组 ( 这个方法是可选的 默认的实现返回时 1 ,不实现这个数据源方法,tableView 就显示一组数据)
    optional public func numberOfSectionsInTableView(tableView: UITableView) -> Int // Default is 1 if not implemented

    // ********************** tableView 组的头尾标题设置**************************

    @available(iOS 2.0, *)
    // 设置每一组的头标题
    optional public func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? // fixed font style. use custom view (UILabel) if you want something different
   
    @available(iOS 2.0, *)
    // 设置每一组的尾标题
    optional public func tableView(tableView: UITableView, titleForFooterInSection section: Int) -> String?
    


    // ********************** tableView 的编辑功能的设置 **************************
    // Editing (进行 cell 的 增加 和 删除 )
    
    // Individual rows can opt out of having the -editing property set for them. If not implemented, all rows are assumed to be editable. 
    // 当行能够有这个编辑属性,如果不实现这个方法所有行是不允许被编辑的
    @available(iOS 2.0, *)
    optional public func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool
    

    // ********************** tableView 移动 和 重新排序 **************************
    // Moving/reordering  ( 移动 和 重新排序 )
    
    // Allows the reorder accessory view to optionally be shown for a particular row. By default, the reorder control will be shown only if the datasource implements -tableView:moveRowAtIndexPath:toIndexPath:
    // 允许重新排序的附属视图作为 row 的一部分,可选的显示。默认情况下,只有数据源的 -tableView:moveRowAtIndexPath:toIndexPath: 方法被实现的时候,重新排序的视图才会显示。
    @available(iOS 2.0, *)
    // 是否能够移动 cell 
    optional public func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool
    


    // Index  (下标)
    
    @available(iOS 2.0, *)
    // 实现这个方法就可以显示和 组标题对应的下标索引()
    optional public func sectionIndexTitlesForTableView(tableView: UITableView) -> [String]? // return list of section titles to display in section index view (e.g. "ABCD...Z#")

    @available(iOS 2.0, *)
    // 组的索引的回调
    optional public func tableView(tableView: UITableView, sectionForSectionIndexTitle title: String, atIndex index: Int) -> Int // tell table which section corresponds to section title/index (e.g. "B",1))
    



    // ********************(数据操作,插入和删除) **********************
    // Data manipulation - insert and delete support 
    
    // After a row has the minus or plus button invoked (based on the UITableViewCellEditingStyle for the cell), the dataSource must commit the change
    // Not called for edit actions using UITableViewRowAction - the action's handler will be invoked instead
    @available(iOS 2.0, *)
    // 点击删除按钮或者增加按钮的时候回调用这个方法
    optional public func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath)
    


    // ******************(数据操作 排序和移动操作)****************
    // Data manipulation - reorder / moving support 
    
    @available(iOS 2.0, *)
    // 移动操作必须实现的方法
    optional public func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath)

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,121评论 29 470
  • 许多 iOS 应用程序向用户显示列表项,并允许用户选择,删除或重新排列列表项。 不管是显示用户地址簿中的人员列表的...
    titvax阅读 1,487评论 2 1
  • import :使客户端以一个整体获取一个模块 from :获取一个模块中所有属性 imp.reload:不终止程...
    捕风的王小仲阅读 241评论 0 0
  • 四季耕种,守时有序。雨水惊蛰,万物复苏。小满芒种,
    祗树阅读 110评论 0 0