tableView.h

tableView的屬性

tableView

TableView的樣式

tablview 初始化,xib的定義

typedef NS_ENUM(NSInteger, UITableViewStyle) {
    UITableViewStylePlain,          // regular table view 標(biāo)準(zhǔn)的表視圖風(fēng)格
    UITableViewStyleGrouped         // preferences style table view 有選擇樣式的分組的表視圖風(fēng)格
};

![](
!屏幕快照 2017-03-31 上午10.21.01.png](http://upload-images.jianshu.io/upload_images/3248269-8b2fa1b29504488f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
)

scrollPosition參數(shù)決定定位的相對(duì)位置

self.tableView scrollToRowAtIndexPath:<#(nonnull NSIndexPath *)#> atScrollPosition:<#(UITableViewScrollPosition)#> animated:<#(BOOL)#>
typedef NS_ENUM(NSInteger, UITableViewScrollPosition) {
       UITableViewScrollPositionNone,   //同UITableViewScrollPositionTop
    UITableViewScrollPositionTop,       //定位完成后粤攒,將定位的行顯示在tableView的頂部    
    UITableViewScrollPositionMiddle,    //定位完成后七冲,將定位的行顯示在tableView的中間   
    UITableViewScrollPositionBottom     //定位完成后,將定位的行顯示在tableView最下面
};                // scroll so row of interest is completely visible at top/center/bottom of view

行變化(插入概龄、刪除、移動(dòng)的動(dòng)畫類型)

插入時(shí)的動(dòng)畫效果:UITableViewRowAnimationFade

self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
typedef NS_ENUM(NSInteger, UITableViewRowAnimation) {
    UITableViewRowAnimationFade,           //淡入淡出
    UITableViewRowAnimationRight,          //從右滑入   // slide in from right (or out to right)
    UITableViewRowAnimationLeft ,          //從左滑入
    UITableViewRowAnimationTop,            //從上滑入
    UITableViewRowAnimationBottom,         //從下滑入
    UITableViewRowAnimationNone,           //沒(méi)有動(dòng)畫 // available in iOS 3.0  
    UITableViewRowAnimationMiddle,         // available in iOS 3.2.  attempts to keep cell centered in the space it will/did occupy
    UITableViewRowAnimationAutomatic = 100  // 自動(dòng)選擇合適的動(dòng)畫// available in iOS 5.0.  chooses an appropriate animation style for you  
};

tableViewCell右滑時(shí)自定義添加多個(gè)按鈕

typedef NS_ENUM(NSInteger, UITableViewRowActionStyle) {
    UITableViewRowActionStyleDefault = 0,  
    UITableViewRowActionStyleDestructive = UITableViewRowActionStyleDefault,
    UITableViewRowActionStyleNormal  

![效果圖代碼如下](
!屏幕快照 2017-03-31 上午10.58.46.png](http://upload-images.jianshu.io/upload_images/3248269-0e305b84cbdfe7df.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
)

//設(shè)置可以編輯
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    return YES;
}
//設(shè)置編輯操作:刪除
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
    return UITableViewCellEditingStyleDelete;
}
//自定義按鈕
-(NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewRowAction *layTopRowAction1 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive title:@"刪除" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) {
        NSLog(@"點(diǎn)擊了刪除");
        [tableView setEditing:NO animated:YES];
    }];
    layTopRowAction1.backgroundColor = [UIColor redColor];

    UITableViewRowAction *layTopRowAction2 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive title:@"置頂" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) {
        NSLog(@"點(diǎn)擊了置頂");
        [tableView setEditing:NO animated:YES];
    }];
   layTopRowAction2.backgroundColor = [UIColor greenColor];

    UITableViewRowAction *layTopRowAction3 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive title:@"更多" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) {
        NSLog(@"點(diǎn)擊了更多");
        [tableView setEditing:NO animated:YES];

    }];
    layTopRowAction3.backgroundColor = [UIColor blueColor];

    NSArray *arr = @[layTopRowAction1,layTopRowAction2,layTopRowAction3];
    return arr;
}

自定義添加多個(gè)按鈕的方法

+ (instancetype)rowActionWithStyle:(UITableViewRowActionStyle)style title:(nullable NSString *)title handler:(void (^)(UITableViewRowAction *action, NSIndexPath *indexPath))handler;  //加block

@property (nonatomic, readonly) UITableViewRowActionStyle style;  
@property (nonatomic, copy, nullable) NSString *title; 
@property (nonatomic, copy, nullable) UIColor *backgroundColor; default background color is dependent on style 默認(rèn)背景顏色取決于系統(tǒng)  
@property (nonatomic, copy, nullable) UIVisualEffect* backgroundEffect;
  為視圖實(shí)現(xiàn)特殊效果(模糊) 
   

UITableViewDelegate

通常都要為UITableView設(shè)置代理對(duì)象(delegate),以便在UITableView觸發(fā)一下事件時(shí)做出相應(yīng)的處理,比如選中了某一行鼎姐。凡是遵守了UITableViewDelegate協(xié)議的OC對(duì)象,都可以是UITableView的代理對(duì)象更振。
![](
!屏幕快照 2017-03-31 下午1.15.53.png](http://upload-images.jianshu.io/upload_images/3248269-8febbb29740a194c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
)

@optional UITableViewDelegate<NSObject, UIScrollViewDelegate>

自定義

cellForRowAtIndexPath與willDisplayCell的區(qū)別

cellForRowAtIndexPath是data source協(xié)議中一個(gè)必須實(shí)現(xiàn)的方法炕桨,willDisplayCell是delegate協(xié)議中一個(gè)可選的方法。
cellForRowAtIndexPath中創(chuàng)建一個(gè)可重用的cell實(shí)例肯腕,我們應(yīng)該盡量快的返回創(chuàng)建的cell,對(duì)于數(shù)據(jù)的綁定之類的操作應(yīng)該放到willDisplayCell中去處理献宫;
willDisplayCell在cell 在tableview展示之前就會(huì)調(diào)用,此時(shí)cell實(shí)例已經(jīng)生成实撒,所以不能更改cell的結(jié)構(gòu)姊途,只能是改動(dòng)cell上的UI的一些屬性(例如label的內(nèi)容等)

// Display customization


# 將要展示cell/header/footer

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;
//將要顯示指定索引處的單元格

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);
//將要顯示指定區(qū)的表頭視圖

- (void)tableView:(UITableView *)tableView willDisplayFooterView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);
//將要顯示指定區(qū)的表尾視圖


# 完成展示cell/header/footer

- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath*)indexPath NS_AVAILABLE_IOS(6_0);
//完成顯示指定索引處的單元格

- (void)tableView:(UITableView *)tableView didEndDisplayingHeaderView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);
//完成顯示指定區(qū)的表頭視圖

- (void)tableView:(UITableView *)tableView didEndDisplayingFooterView:(UIView *)view forSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);
//完成顯示指定區(qū)的表視圖

可變高度支持


// Variable height support 可變高度支持
#每個(gè)cell、section-header知态、section-footer高度的返回(這里高度通過(guò)協(xié)議返回捷兰,是為了table能準(zhǔn)確的定位出來(lái)要顯示的Cell-index,從而滿足UITableView的重用機(jī)制

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
//單元格行高

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
//指定區(qū)的表頭高度

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;
//指定區(qū)的表尾/頁(yè)腳高度

設(shè)置行高(估計(jì)值)

// Use the estimatedHeight methods to quickly calcuate guessed values which will allow for fast load times of the 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.

# 設(shè)置行高负敏,頭視圖高度和尾視圖高度的估計(jì)值(對(duì)于高度可變的情況下贡茅,提高效率)

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(7_0);
//指定索引處的估算行高

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForHeaderInSection:(NSInteger)section NS_AVAILABLE_IOS(7_0);
//指定區(qū)估算的表頭/頁(yè)眉高度

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForFooterInSection:(NSInteger)section NS_AVAILABLE_IOS(7_0);
//指定區(qū)估算的表尾/頁(yè)腳高度

/*
 
 self.tableView.rowHeight=UITableViewAutomaticDimension;
 self.tableView.estimatedRowHeight=44.0;
 
 [cell setNeedsUpdateConstraints];
 [cell updateConstraintsIfNeeded];
 
 在 cellforrow 里調(diào)用     [cell setNeedsUpdateConstraints];
 [cell updateConstraintsIfNeeded];
 
 要結(jié)合起來(lái) 我之前 用Storybord做cell自使用  就使用這個(gè)方法
 
 */

section組頭部以及尾部

// Section header & footer information. Views are preferred over title should you decide to provide both

#第section組頭部以及尾部顯示什么控件
- (nullable UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;   
// ——為指定區(qū)的頁(yè)眉定制視圖   custom view for header. will be adjusted to default or specified header height

- (nullable UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section;   
//——為指定區(qū)的頁(yè)腳定制視圖    custom view for footer. will be adjusted to default or specified footer height

輔助

// Accessories (disclosures). 
# 當(dāng)cell的accessaryType為UITableViewCellAccessoryFetailDisclosureButton時(shí),點(diǎn)擊accessaryView將會(huì)調(diào)用delegate的tableView:accessoryButtonTappedForRowWithIndexPath方法其做。否則只只是didSelectRowAtIndexPath顶考;   (accessaryView 輔助視圖)
- (UITableViewCellAccessoryType)tableView:(UITableView *)tableView accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath NS_DEPRECATED_IOS(2_0, 3_0);
//指定索引處的表格行的附件類型

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath;
//指定索引處的表格行的附件按鈕被輕擊時(shí)

組(高亮)

// 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.

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0);
//當(dāng)前選中的row是否高亮
- (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0);
//指定row高亮

- (void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0);
//通知委托表視圖的指定行不在高亮顯示,一般是點(diǎn)擊其他行的時(shí)候

cell選擇和取消選擇

#cell選擇和取消選擇
// Called before the user changes the selection. Return a new indexPath, or nil, to change the proposed selection.

- (nullable NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath;
//將要選擇指定索引處的表格行

- (nullable NSIndexPath *)tableView:(UITableView *)tableView willDeselectRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(3_0);
//將要取消選擇指定索引處的表格行

已經(jīng)選擇匯總和已經(jīng)取消選擇選中后調(diào)用的函數(shù)

// Called after the user changes the selection.
已經(jīng)選擇匯總和已經(jīng)取消選擇選中后調(diào)用的函數(shù)

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
//已經(jīng)選擇指定索引處的表格行
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(3_0);
//已經(jīng)取消選擇指定索引處的表格行

編輯

// 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.

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath;
   typedef NS_ENUM(NSInteger, UITableViewCellEditingStyle) {
    UITableViewCellEditingStyleNone, 
    UITableViewCellEditingStyleDelete,  //刪除樣式
    UITableViewCellEditingStyleInsert   //插入樣式
};
//返回指定索引位置表格行的編輯風(fēng)格/樣式
- (nullable NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(3_0);
//返回指定索引處表格行上刪除確認(rèn)按鈕上的標(biāo)題文字

- (nullable NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(8_0); 
//指定索引行的表格行的編輯操作,返回  UITableViewRowAction對(duì)象組成的數(shù)組   supercedes(推遲,取代,接下來(lái)) -tableView:titleForDeleteConfirmationButtonForRowAtIndexPath: if return value is non-nil
// 8.0后側(cè)滑菜單的新接口妖泄,支持多個(gè)側(cè)滑按鈕驹沿。

行縮進(jìn)

// 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.

- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath;
//判斷當(dāng)編輯指定索引處的表格行時(shí)是否將要 indent(縮進(jìn),訂貨),默認(rèn)所有的表格行編輯狀態(tài)時(shí)都會(huì)縮進(jìn),只對(duì)grouped的TableView有效

或者cell.shouldIndentWhileEditing = NO;

開(kāi)始與完成編輯

// 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

- (void)tableView:(UITableView*)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath;
//將要開(kāi)始編輯指定索引處的表格行

- (void)tableView:(UITableView*)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath;
//指定索引處的表格行編輯完成

移動(dòng)

// Moving/reordering

// Allows customization of the target row for a particular row as it is being moved/reordered

- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath; 
// 移動(dòng)特定的某行(注意區(qū)別之前的tableView:moveRowAtIndexPath:toIndexPath方法。當(dāng)手指按住reorde accessory view移動(dòng)時(shí)蹈胡,只要有row moved/reordered都會(huì)調(diào)用該方法渊季,而前者方法只有當(dāng)手指放開(kāi)reorder accessory view時(shí),結(jié)束move/order操作才會(huì)調(diào)用自己审残。返回值代表進(jìn)行移動(dòng)操作后回到的行梭域,如果設(shè)置為當(dāng)前行斑举,則不論怎么移動(dòng)都會(huì)回到當(dāng)前行

NSInteger類型的值——縮進(jìn)水平

// Indentation

- (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath; 
//返回NSInteger類型的值——縮進(jìn)水平   return 'depth' of row for hierarchies

彈出選擇菜單時(shí)會(huì)調(diào)用此方法(BOOL) 選擇菜單項(xiàng)完成之后調(diào)用此方法(void)

// Copy/Paste.  All three methods must be implemented by the delegate.

- (BOOL)tableView:(UITableView *)tableView shouldShowMenuForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(5_0);
//長(zhǎng)按出來(lái)的Copy/Paste操作 (復(fù)制粘貼)----->通知委托是否在指定行顯示菜單搅轿,返回值為YES時(shí),長(zhǎng)按顯示菜單

- (BOOL)tableView:(UITableView *)tableView canPerformAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(nullable id)sender NS_AVAILABLE_IOS(5_0);
//彈出選擇菜單時(shí)會(huì)調(diào)用此方法(復(fù)制富玷、粘貼璧坟、全選既穆、剪切)

- (void)tableView:(UITableView *)tableView performAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(nullable id)sender NS_AVAILABLE_IOS(5_0);
//選擇菜單項(xiàng)完成之后調(diào)用此方法

Focus 焦點(diǎn)

// Focus 焦點(diǎn)

- (BOOL)tableView:(UITableView *)tableView canFocusRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(9_0);
- (BOOL)tableView:(UITableView *)tableView shouldUpdateFocusInContext:(UITableViewFocusUpdateContext *)context NS_AVAILABLE_IOS(9_0);
- (void)tableView:(UITableView *)tableView didUpdateFocusInContext:(UITableViewFocusUpdateContext *)context withAnimationCoordinator:(UIFocusAnimationCoordinator *)coordinator NS_AVAILABLE_IOS(9_0);
- (nullable NSIndexPath *)indexPathForPreferredFocusedViewInTableView:(UITableView *)tableView NS_AVAILABLE_IOS(9_0);

UITableView : UIScrollView <NSCoding>

繼承于UIscrollView ->有scrollView的屬性
scrollView

tableView 初始化 基本屬性

- (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style  NS_DESIGNATED_INITIALIZER; // must specify style at creation. -initWithFrame: calls this with UITableViewStylePlain
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;

@property (nonatomic, readonly) UITableViewStyle style;    
//tableView 的樣式 
@property (nonatomic, weak, nullable) id <UITableViewDataSource> dataSource;
@property (nonatomic, weak, nullable) id <UITableViewDelegate> delegate;
@property (nonatomic) CGFloat rowHeight;             // will return the default value if unset      行高    
@property (nonatomic) CGFloat sectionHeaderHeight;   // will return the default value if unset      組頭的高度 
@property (nonatomic) CGFloat sectionFooterHeight;   // will return the default value if unset      組尾的高度 
@property (nonatomic) CGFloat estimatedRowHeight NS_AVAILABLE_IOS(7_0); // default is 0, which means there is no estimate       估算行高,默認(rèn)0 
@property (nonatomic) CGFloat estimatedSectionHeaderHeight NS_AVAILABLE_IOS(7_0); // default is 0, which means there is no estimate     估算組頭的高度  
@property (nonatomic) CGFloat estimatedSectionFooterHeight   NS_AVAILABLE_IOS(7_0); // default is 0, which means there is no estimate     估算組尾的高度  
@property (nonatomic) UIEdgeInsets separatorInset NS_AVAILABLE_IOS(7_0) UI_APPEARANCE_SELECTOR; // allows customization of the frame of cell separators     允許更改分割線的frame 
//UIEdgeInsets:CGFloat top, left, bottom, right;  // specify amount to inset (positive) for each of the edges. values can be negative to 'outset' 

@property (nonatomic, strong, nullable) UIView *backgroundView  NS_AVAILABLE_IOS(3_2); // 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.         背景視圖(自動(dòng)匹配tableView視圖大腥妇椤)幻工,設(shè)置互作為列表視圖的子視圖,切在所有cell和headers/footers的后面黎茎,默認(rèn)為nil  


Data 數(shù)據(jù)的刷新

- (void)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       刷新列表
- (void)reloadSectionIndexTitles NS_AVAILABLE_IOS(3_0);   // reloads the index bar.         刷新你section這個(gè)方法常用語(yǔ)新加或者刪除了索引類別二無(wú)需率先呢整個(gè)表視圖的情況下
##
- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation NS_AVAILABLE_IOS(3_0);       // 刷新某些組
3

Info 信息

@property (nonatomic, readonly) NSInteger numberOfSections;     // 列表的組數(shù)

- (NSInteger)numberOfRowsInSection:(NSInteger)section;          // 某一組有多少行

- (CGRect)rectForSection:(NSInteger)section;                                    // includes header, footer and all rows     某一組所占的矩形區(qū)域(包括header囊颅,footer和所有的行)
- (CGRect)rectForHeaderInSection:(NSInteger)section;            // 某一組的header所占的矩形區(qū)域
- (CGRect)rectForFooterInSection:(NSInteger)section;            // 某一組的footer所占的矩形區(qū)域
- (CGRect)rectForRowAtIndexPath:(NSIndexPath *)indexPath;       // 某一分區(qū)的row所占的矩形區(qū)域

- (nullable NSIndexPath *)indexPathForRowAtPoint:(CGPoint)point;                         // returns nil if point is outside of any row in the table     某一點(diǎn)在tableView上所占的分區(qū),如果該點(diǎn)不在tableView的任何row上返回nil
- (nullable NSIndexPath *)indexPathForCell:(UITableViewCell *)cell;                      // returns nil if cell is not visible      某一行所在的分區(qū)傅瞻,如果改行是不可見(jiàn)的返回nil
- (nullable NSArray<NSIndexPath *> *)indexPathsForRowsInRect:(CGRect)rect;                              // returns nil if rect not valid        某一矩形區(qū)域內(nèi)所有行所在的所有分區(qū)踢代,返回元素為NSIndexPath類型的數(shù)組。當(dāng)該矩形是一個(gè)無(wú)效值時(shí)嗅骄,返回nil

- (nullable __kindof UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath;   // returns nil if cell is not visible or index path is out of range        某一分區(qū)的cell沒(méi)如果改cell是不可見(jiàn)的或者indexPath超出了返回則返回nil
@property (nonatomic, readonly) NSArray<__kindof UITableViewCell *> *visibleCells;      // 所有可見(jiàn)的cell胳挎,只讀數(shù)組型(數(shù)組類型為UITableViewCell)

@property (nonatomic, readonly, nullable) NSArray<NSIndexPath *> *indexPathsForVisibleRows;     // 所有可見(jiàn)行所在的分區(qū),只讀數(shù)組型(NSIndexPath)


- (nullable UITableViewHeaderFooterView *)headerViewForSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);       // 某一組的header視圖(常用語(yǔ)自定義headerView用)
- (nullable UITableViewHeaderFooterView *)footerViewForSection:(NSInteger)section NS_AVAILABLE_IOS(6_0);       // 某一組的footer視圖(常用語(yǔ)自定義footerView用)

- (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated;     //使表視圖定位到某一位置(行)
- (void)scrollToNearestSelectedRowAtScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated;   // 使表視圖定位到選中行

Row insertion/deletion/reloading. 插入 刪除 刷新


// 這兩個(gè)方法溺森,是配合起來(lái)使用的慕爬,標(biāo)記了一個(gè)tableView的動(dòng)畫快。分別代表動(dòng)畫的開(kāi)始和結(jié)束屏积。兩者成對(duì)出現(xiàn)医窿,可以嵌套使用。一般炊林,在添加留搔,刪除,選擇tableView中使用铛铁,并實(shí)現(xiàn)動(dòng)畫效果隔显。在動(dòng)畫快內(nèi),不建議使用reloadData方法饵逐,如果使用括眠,會(huì)影響動(dòng)畫
- (void)beginUpdates;   // allow multiple insert/delete of rows and sections to be animated simultaneously. Nestable        允許多個(gè)插入/行和段被同時(shí)刪除動(dòng)畫”度ǎ可排序
- (void)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.      只調(diào)用插入/刪除/重載呼叫或改變一更新區(qū)塊內(nèi)的編輯狀態(tài)掷豺。然而對(duì)于行數(shù)等屬性可能是無(wú)效的

- (void)insertSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation;      // 插入某些組
- (void)deleteSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation;      // 刪除某些組
- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation NS_AVAILABLE_IOS(3_0);       // 刷新某些組
- (void)moveSection:(NSInteger)section toSection:(NSInteger)newSection NS_AVAILABLE_IOS(5_0);           // 一定組section到組newSection的位置

- (void)insertRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;    // 插入某些行
- (void)deleteRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;    // 刪除某些行


- (void)reloadRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation NS_AVAILABLE_IOS(3_0);  // 刷新tableView指定行的數(shù)據(jù)
- (void)moveRowAtIndexPath:(NSIndexPath *)indexPath toIndexPath:(NSIndexPath *)newIndexPath NS_AVAILABLE_IOS(5_0);      // 移動(dòng)分區(qū)indexPath的行到分區(qū)newIndexPath

Editing 編輯

/ Editing. When set, rows show insert/delete/reorder controls based on data source queries     編輯、設(shè)置之后薄声,行的顯示會(huì)基于數(shù)據(jù)源查詢插入/刪除/重排序的控制

@property (nonatomic, getter=isEditing) BOOL editing;                             // default is NO. setting is not animated.    // 設(shè)置是否是編輯狀態(tài)(編輯狀態(tài)下的cell左邊會(huì)出現(xiàn)一個(gè)減號(hào)当船,編輯右邊會(huì)劃出刪除按鈕) 
- (void)setEditing:(BOOL)editing animated:(BOOL)animated;

@property (nonatomic) BOOL allowsSelection NS_AVAILABLE_IOS(3_0);  // default is YES. Controls whether rows can be selected when not in editing mode    當(dāng)不再編輯模式時(shí),是否可以選中默辨,默認(rèn)YES  
@property (nonatomic) BOOL allowsSelectionDuringEditing;                                 // default is NO. Controls whether rows can be selected when in editing mode       當(dāng)處在編輯模式時(shí)德频,是否可以選中。默認(rèn)NO  
@property (nonatomic) BOOL allowsMultipleSelection NS_AVAILABLE_IOS(5_0);                // default is NO. Controls whether multiple rows can be selected simultaneously        是否可以同時(shí)選中缩幸。默認(rèn)NO  
@property (nonatomic) BOOL allowsMultipleSelectionDuringEditing NS_AVAILABLE_IOS(5_0);   // default is NO. Controls whether multiple rows can be selected simultaneously in editing mode        當(dāng)處在編輯模式時(shí)壹置,是否可以同時(shí)選中竞思。默認(rèn)NO  

Selection 選中

@property (nonatomic, readonly, nullable) NSIndexPath *indexPathForSelectedRow; // returns nil or index path representing section and row of selection.     選中的行所在的分區(qū)(單選)
@property (nonatomic, readonly, nullable) NSArray<NSIndexPath *> *indexPathsForSelectedRows NS_AVAILABLE_IOS(5_0); // returns nil or a set of index paths representing the sections and rows of the selection.      選中的行所在的所有分區(qū)(多選)

// Selects and deselects rows. These methods will not call the delegate methods (-tableView:willSelectRowAtIndexPath: or tableView:didSelectRowAtIndexPath:), nor will it send out a notification.      代碼收到選中與取消選中某行,注意:這兩個(gè)方法將不會(huì)回調(diào)代理中的方法
- (void)selectRowAtIndexPath:(nullable NSIndexPath *)indexPath animated:(BOOL)animated scrollPosition:(UITableViewScrollPosition)scrollPosition;
- (void)deselectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated;

Appearance 外觀

@property (nonatomic) NSInteger sectionIndexMinimumDisplayRowCount;                                                      // show special section index list on right when row count reaches this value. default is 0        設(shè)置索引欄最小顯示行數(shù)钞护。先在右側(cè)專門章節(jié)索引列表當(dāng)行數(shù)達(dá)到此值盖喷。默認(rèn)值是0  
@property (nonatomic, strong, nullable) UIColor *sectionIndexColor NS_AVAILABLE_IOS(6_0) UI_APPEARANCE_SELECTOR;                   // color used for text of the section index      設(shè)置索引欄字體顏色  
@property (nonatomic, strong, nullable) UIColor *sectionIndexBackgroundColor NS_AVAILABLE_IOS(7_0) UI_APPEARANCE_SELECTOR;         // the background color of the section index while not being touched     設(shè)置索引欄背景顏色 
@property (nonatomic, strong, nullable) UIColor   *sectionIndexTrackingBackgroundColor NS_AVAILABLE_IOS(6_0) UI_APPEARANCE_SELECTOR; // the background color of the section index while it is being touched       設(shè)置索引欄被選中時(shí)的顏色  
@property (nonatomic) UITableViewCellSeparatorStyle separatorStyle __TVOS_PROHIBITED; // default is UITableViewCellSeparatorStyleSingleLine     設(shè)置分割線的風(fēng)格 
typedef NS_ENUM(NSInteger, UITableViewCellSeparatorStyle) {
    UITableViewCellSeparatorStyleNone,
    UITableViewCellSeparatorStyleSingleLine,
    UITableViewCellSeparatorStyleSingleLineEtched   // This separator style is only supported for grouped style table views currently
} __TVOS_PROHIBITED;


@property (nonatomic, strong, nullable) UIColor *separatorColor  UI_APPEARANCE_SELECTOR __TVOS_PROHIBITED; // default is the standard separator gray     設(shè)置分割線顏色 
@property (nonatomic, copy, nullable) UIVisualEffect *separatorEffect NS_AVAILABLE_IOS(8_0) UI_APPEARANCE_SELECTOR __TVOS_PROHIBITED; // effect to apply to table separators        設(shè)置分割線毛玻璃效果(iOS8之后可用)

@property (nonatomic) BOOL cellLayoutMarginsFollowReadableWidth NS_AVAILABLE_IOS(9_0); // if cell margins are derived from the width of the readableContentGuide.  

@property (nonatomic, strong, nullable) UIView *tableHeaderView;                           // accessory view for above row content. default is nil. not to be confused with section header      設(shè)置tableView頭視圖  
@property (nonatomic, strong, nullable) UIView *tableFooterView;                           // accessory view below content. default is nil. not to be confused with section footer      設(shè)置tableView尾視圖  

- (nullable __kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier;  // Used by the delegate to acquire an already allocated cell, in lieu of allocating a new one.        從復(fù)用池張取cell
- (__kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0); // newer dequeue method guarantees a cell is returned and resized properly, assuming identifier is registered       獲取一個(gè)已注冊(cè)的cell
- (nullable __kindof UITableViewHeaderFooterView *)dequeueReusableHeaderFooterViewWithIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);  // like dequeueReusableCellWithIdentifier:, but for headers/footers     從復(fù)用池獲取頭視圖或尾視圖

注冊(cè)cell

// 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.
- (void)registerNib:(nullable UINib *)nib forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(5_0);          // 通過(guò)xib文件注冊(cè)cell
- (void)registerClass:(nullable Class)cellClass forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);    // 通過(guò)oc類注冊(cè)cell

- (void)registerNib:(nullable UINib *)nib forHeaderFooterViewReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);  // 通過(guò)xib文件注冊(cè)頭視圖和尾視圖
- (void)registerClass:(nullable Class)aClass forHeaderFooterViewReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0);   // 通過(guò)OC類注冊(cè)頭視圖和尾視圖

Focus 焦點(diǎn)


@property (nonatomic) BOOL remembersLastFocusedIndexPath NS_AVAILABLE_IOS(9_0); // 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.

UITableViewDataSourceUITableView

需要一個(gè)數(shù)據(jù)源(dataSource)來(lái)顯示數(shù)據(jù),UITableView會(huì)向數(shù)據(jù)源查詢一共有多少行數(shù)據(jù)以及每一行顯示什么數(shù)據(jù)等难咕。沒(méi)有設(shè)置數(shù)據(jù)源的UITableView只是個(gè)空殼课梳。凡是遵守UITableViewDataSource協(xié)議的OC對(duì)象,都可以是UITableView的數(shù)據(jù)源余佃。

@protocol UITableViewDataSource<NSObject>

![


屏幕快照 2017-03-31 下午1.16.12.png

)

必須實(shí)現(xiàn)的

@required

// 每個(gè)section下cell的個(gè)數(shù)(必須實(shí)現(xiàn))
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

// Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier:
// Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls)

// 通過(guò)Indexpath返回具體的cell(必須實(shí)現(xiàn))
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

協(xié)議

返回有多少個(gè)section(默認(rèn)是1)


// 返回有多少個(gè)section(默認(rèn)是1)
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;              // Default is 1 if not implemented

每個(gè)section上面的標(biāo)語(yǔ)內(nèi)容

// 每個(gè)section上面的標(biāo)語(yǔ)內(nèi)容
- (nullable NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;    // fixed font style. use custom view (UILabel) if you want something different

// 每個(gè)section下面的標(biāo)語(yǔ)內(nèi)容

- (nullable NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;

// Editing

// 是否可編輯
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;

// 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:
// 是否可拖拽
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath;

// Index

// 右側(cè)索引條需要的數(shù)組內(nèi)容
- (nullable NSArray<NSString *> *)sectionIndexTitlesForTableView:(UITableView *)tableView __TVOS_PROHIBITED;                                                    // return list of section titles to display in section index view (e.g. "ABCD...Z#")
// 索引值對(duì)應(yīng)的section-index
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index __TVOS_PROHIBITED;  // 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
// 對(duì)Cell編輯后的回調(diào)
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath;

// Data manipulation - reorder / moving support

// 對(duì)Cell拖拽后的回調(diào)
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath;



UITableViewDataSourcePrefetching(ios 10.0)

@required
// indexPaths are ordered ascending by geometric distance from the table view
- (void)tableView:(UITableView *)tableView prefetchRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths;   
 @optional  
    // indexPaths that previously were considered as candidates for pre-fetching, but were not actually used; may be a subset of the previous call to -tableView:prefetchRowsAtIndexPaths:  
    
 - (void)tableView:(UITableView *)tableView cancelPrefetchingForRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths;  


類方法

// 類方法
+ (instancetype)indexPathForRow:(NSInteger)row inSection:(NSInteger)section;

@property (nonatomic, readonly) NSInteger section;      // indexPath的組
@property (nonatomic, readonly) NSInteger row;          // indexPath的行

補(bǔ)充

/*
 ----dataSource/delegate方法大概執(zhí)行順序(所有方法均實(shí)現(xiàn)):
 1).numberOfSectionsInTableView惦界;有多少section,例如k咙冗;
 2).tableView:estimatedHeightForHeaderInSection + tableView:estimatedHeightForFooterInSection沾歪;計(jì)算k-1 section的header、footer大概高度雾消;
 3).tableView:numberOfRowsInSection灾搏;k-1 section有多少 row;
 4).tableView:estimatedHeightForRowAtIndexPath立润;計(jì)算k-1 section中所有row的大概高度狂窑;
 5).重復(fù)1)~4)步驟,直到所有0至k-1的section計(jì)算完桑腮;
 6).sectionIndexTitlesForTableView泉哈;索引titles;
 7).tableView:heightForRowAtIndexPath破讨;依次計(jì)算visible區(qū)域(屏幕區(qū)域)里每個(gè)cell的高度(這里的所有cell記做集合A丛晦,決定于屏幕高度和estimatedHeightForXXX方法)
 8).tableView:cellForRowAtIndexPath;創(chuàng)建第一個(gè)indexPath上的cell
 9).tableView:indentationLevelForRowAtIndexPath提陶; indexPath上的cell的縮進(jìn)烫沙;
 10).tableView:canEditRowAtIndexPath; indexPath上的cell編輯屬性隙笆;
 11).tableView:willDisplayCell:forRowAtIndexPath锌蓄; indexPath上的cell將要顯示;
 12),重復(fù)8)~11)撑柔,直到所有visible區(qū)域cell(集合A)創(chuàng)建完畢瘸爽;
 13).tableView:heightForHeaderInSection + tableView:heightForFooterInSection + tableView:viewForHeaderInSection + tableView:viewForHeaderInSection;依次計(jì)算visible區(qū)域里所有section 的header高度铅忿、footer高度剪决、viewForHead、viewForFooter;
 
  ----執(zhí)行順序(沒(méi)有實(shí)現(xiàn)estimatedHeight這些方法):
 1).numberOfSectionsInTableView昼捍;有多少section,例如k肢扯;
 2).tableView:heightForHeaderInSection + tableView:heightForFooterInSection妒茬;計(jì)算k-1 section的header、footer高度蔚晨;
 3).tableView:numberOfRowsInSection乍钻;k-1 section有多少 row;
 4).tableView:heightForRowAtIndexPath铭腕;計(jì)算k-1 section中所有row得高度银择;
 5).重復(fù)1)~4)步驟,直到所有0至k-1的section計(jì)算完
 6).sectionIndexTitlesForTableView累舷;索引titles浩考;
 7).tableView:cellForRowAtIndexPath;創(chuàng)建第一個(gè)indexPath上的cell
 8).tableView:indentationLevelForRowAtIndexPath被盈; indexPath上的cell的縮進(jìn)析孽;
 9).tableView:canEditRowAtIndexPath; indexPath上的cell編輯屬性只怎;
 10).tableView:willDisplayCell:forRowAtIndexPath袜瞬; indexPath上的cell將要顯示;
 12).重復(fù)7)~12)身堡,知道所有visible區(qū)域(屏幕)cell創(chuàng)建完畢邓尤;
 13).tableView:viewForHeaderInSection + tableView:viewForHeaderInSection;依次計(jì)算visible區(qū)域里所有的viewForHead贴谎、viewForFooter汞扎;
 備注:
 1.由上可看出,estimatedHeight在加載tableview的時(shí)候代替了heightFor方法擅这,heightFor方法只有當(dāng)cell需要顯示的時(shí)候佩捞,才會(huì)調(diào)用。
 2.關(guān)于estimatedHeightForXXX相關(guān)方法蕾哟,里面的返回值并不能隨意填寫的一忱,應(yīng)該是真實(shí)高度的大概值;因?yàn)樵诩虞dtableview的時(shí)候谭确,當(dāng)所有的section header/footer row的高度都大概計(jì)算完帘营,開(kāi)始計(jì)算高度、并創(chuàng)建visible區(qū)域的cell時(shí)候逐哈,這些cell屬不屬于visible區(qū)域的判斷依據(jù)就是之前的estimatedHeightForXXX方法返回的值算出來(lái)的芬迄;例如estimatedHeightForXXX相關(guān)方法返回值過(guò)大,算出來(lái)當(dāng)前visible(屏幕)區(qū)域昂秃,包含3個(gè)section header 禀梳、footer以及里面的row杜窄,所以實(shí)際創(chuàng)建的時(shí)候也是創(chuàng)建這些cell(參考上文中方法執(zhí)行順序),當(dāng)這些cell創(chuàng)建完算途,實(shí)際情況高度(heightForXXX方法所得)可能只占visible(屏幕)區(qū)域的一半塞耕,導(dǎo)致屏幕另一半空白。注意visible區(qū)域初始顯示的cell是由estimatedHeightForXXX相關(guān)方法決定的嘴瓤,而不是heightForXXX這些方法真實(shí)高度決定的扫外,所以有時(shí)tableview中visible區(qū)域尾部cell顯示不出來(lái)或者創(chuàng)建的cell比visible區(qū)域cell多,都是estimatedHeightForXXX和heightForXXX方法相差導(dǎo)致的原因廓脆。
 3.以上方法和ViewController那些方法關(guān)系:先執(zhí)行viewdidload筛谚、willAppear等相關(guān)方法,再執(zhí)行numberOfSectionsInTableView系列方法停忿。
 */

詳談屬性設(shè)置readwrite驾讲、readonly、retain席赂、copy蝎毡、assign、nonatomic

copy氧枣、retain沐兵、weak、assign

非ARC
? 1> copy : 只用于NSString\block
? 2> retain : 除NSString\block以外的OC對(duì)象
? 3> assign : 基本數(shù)據(jù)類型便监、枚舉扎谎、結(jié)構(gòu)體(非OC對(duì)象),當(dāng)2個(gè)對(duì)象相互引用烧董,一端用retain毁靶,一端用assign
?2.ARC
? 1> copy : 只用于NSString\block
? 2> strong : 除NSString\block以外的OC對(duì)象
? 3> weak : 當(dāng)2個(gè)對(duì)象相互引用,一端用strong逊移,一端用weak
4> assgin : 基本數(shù)據(jù)類型预吆、枚舉、結(jié)構(gòu)體(非OC對(duì)象)

atomic,nonatomic

?1.atomic:設(shè)置成員變量的@property屬性時(shí)胳泉,默認(rèn)為atomic拐叉,提供多線程安全。
?2.nonatomic:禁止多線程扇商,變量保護(hù)凤瘦,提高性能。
atomic是Objc使用的一種線程保護(hù)技術(shù)案铺,基本上來(lái)講蔬芥,是防止在寫未完成的時(shí)候被另外一個(gè)線程讀取,造成數(shù)據(jù)錯(cuò)誤。而這種機(jī)制是耗費(fèi)系統(tǒng)資源的笔诵,所以在iPhone這種小型設(shè)備上返吻,如果沒(méi)有使用多線程間的通訊編程,那么nonatomic是一個(gè)非常好的選擇乎婿。

__nonnull测僵、nonnull
他們的作用是...
修飾一個(gè)屬性的值,或者參數(shù)不能為空...
使用的方法和nullable一樣

區(qū)別

1 . 可讀性: readonly次酌、readwrite
@property(readwrite,....) valueType value;
這個(gè)屬性是變量的默認(rèn)屬性恨课,就是如果你 (readwrite and readonly 都沒(méi)有使用舆乔,那么你的變量就是 readwrite屬性 ) 岳服,通過(guò)加入 readwrite 屬性你的變量就會(huì)有 get 和 set 方法。
property(readonly,...) valueType value;
這個(gè)屬性變量就是表明變量只有可讀方法希俩,也就是說(shuō)吊宋,你只能使用它的 get 方法。
2 . assign , setter 方法直接賦值颜武,不進(jìn)行任何 retain 操作璃搜,為了解決原類型與環(huán)循引用問(wèn)題
3 . retain , setter 方法對(duì)參數(shù)進(jìn)行 release 舊值再 retain 新值,所有實(shí)現(xiàn)都是這個(gè)順序
4 . copy 鳞上,setter 方法進(jìn)行 Copy 操作这吻,與 retain 處理流程一樣,先舊值 release 篙议,再 copy 出新的對(duì)象唾糯,retainCount 為 1 。這是為了減少對(duì)上下文的依賴而引入的機(jī)制鬼贱。
5 .nonatomic ,非原子性訪問(wèn)移怯,不加同步,多線程并發(fā)訪問(wèn)會(huì)提高性能这难。
注意舟误,如果不加此屬性,則默認(rèn)是兩個(gè)訪問(wèn)方法都為原子型事務(wù)訪問(wèn)姻乓。鎖被加到所屬對(duì)象實(shí)例級(jí) 嵌溢。 所以不加nonatomic 對(duì)與多線程是安全的 。
6 . retain vs. Copy
copy :建立一個(gè)索引計(jì)數(shù)為 1 的對(duì)象蹋岩,然后釋放舊對(duì)象
retain :釋放舊的對(duì)象堵腹,將舊對(duì)象的值賦予輸入對(duì)象,再提高輸入對(duì)象的索引計(jì)數(shù)為 1
那上面的是什么該死的意思呢星澳?
copy 其實(shí)是建立了一個(gè)相同的對(duì)象疚顷,而 retain 不是

修改readonly的屬性

iOS修改聲明為readonly的屬性值

修飾詞

1getter=isOn

問(wèn)題:
@property(nonatomic,getter=isOn) BOOL on; 中的getter = isOn的含義?
2 答案:
如果這個(gè)property是 BOOL on, 那么Objc默認(rèn)創(chuàng)建的 setter 為: - (void)on:(BOOL)setOn { } getter 為: - (BOOL)on { return on; } 但是你可以手動(dòng)更改 setter 和 getter 方法腿堤,就像上面的: getter = xxxOn 的話阀坏, getter 就變?yōu)椋?- (BOOL)xxxOn { return on; }

- (nullable NSArray<NSString *> *) (__kindof UITableViewCell *)

__kindof關(guān)鍵字的好處在于更加明確了以前id類型無(wú)法清晰表達(dá)的短板

  • (__kindof UITableViewCell *)
    表明方法返回的是UITableViewCell或其子類型,比以前的id類型更清晰笆檀,更明確忌堂。

對(duì)了,強(qiáng)制類型轉(zhuǎn)換酗洒,泛型也涉及到強(qiáng)制類型轉(zhuǎn)換問(wèn)題士修,NSArray<__covariant ObjectType>,其中__covariant關(guān)鍵字就是表達(dá)可以 stringArray = mutStringArray樱衷,假如這樣定義數(shù)組NSArray<ObjectType>棋嘲,那stringArray = mutStringArray也會(huì)有警告(可以自定義類實(shí)現(xiàn)泛型驗(yàn)證),與__covariant對(duì)應(yīng)的是__contravariant矩桂,如果這樣定義數(shù)組NSArray<__contravariant ObjectType>沸移,那么mutStringArray = stringArray;也不會(huì)有警告了,但這明顯不合理侄榴。關(guān)于__covariant與__contravariant就不翻譯了(有時(shí)候翻譯真不如英文原版)

注1:參考NSDictionary頭文件定義雹锣,來(lái)思考多參數(shù)泛型實(shí)現(xiàn)。

- (nullable NSArray<NSString *> *) (__kindof UITableViewCell *)

UITableView的數(shù)據(jù)源(dataSource)和代理(delegate)

UITableView需要一個(gè)數(shù)據(jù)源(dataSource)來(lái)顯示數(shù)據(jù)癞蚕,UITableView會(huì)向數(shù)據(jù)源查詢一共有多少行數(shù)據(jù)以及每一行顯示什么數(shù)據(jù)等蕊爵。沒(méi)有設(shè)置數(shù)據(jù)源的UITableView只是個(gè)空殼。凡是遵守UITableViewDataSource協(xié)議的OC對(duì)象桦山,都可以是UITableView的數(shù)據(jù)源攒射。
通常都要為UITableView設(shè)置代理對(duì)象(delegate),以便在UITableView觸發(fā)一下事件時(shí)做出相應(yīng)的處理度苔,比如選中了某一行匆篓。凡是遵守了UITableViewDelegate協(xié)議的OC對(duì)象,都可以是UITableView的代理對(duì)象寇窑。一般會(huì)讓控制器充當(dāng)UITableView的dataSource和delegate

刪除選中UITableView的行
首先要開(kāi)啟編輯模式
實(shí)現(xiàn)UITableViewDataSource的如下方法:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{
    // 如果UITableView提交的是刪除指令
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // 刪除真實(shí)數(shù)據(jù)
         // [self.data removeObjectAtIndex:indexPath.row];
        // 刪除UITableView中的某一行(帶動(dòng)畫效果)
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];
        // 如果不考慮動(dòng)畫效果鸦概,也可以直接[tableView reload];
    }
}

移動(dòng)UITableView的行
 
首先要開(kāi)啟編輯模式
實(shí)現(xiàn)UITableViewDataSource的如下方法(如果沒(méi)有實(shí)現(xiàn)此方法,將無(wú)法換行)
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath 
{
    int from = sourceIndexPath.row;
    int to = destinationIndexPath.row;
    if (from == to) return;
    // 交換數(shù)據(jù)
    // [self.data exchangeObjectAtIndex:from withObjectAtIndex:to];
}
 
選中UITableView的行
 
當(dāng)某行被選中時(shí)會(huì)調(diào)用此方法(UITableViewDelegate的方法)
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
    //取消選中某一行,讓被選中行的高亮顏色消失(帶動(dòng)畫效果)
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}
 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末甩骏,一起剝皮案震驚了整個(gè)濱河市饮笛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌福青,老刑警劉巖摄狱,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異祝谚,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)酣衷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門交惯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)席爽,“玉大人啊片,你說(shuō)我怎么就攤上這事【嫣伲” “怎么了碴里?”我有些...
    開(kāi)封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵咬腋,是天一觀的道長(zhǎng)睡互。 經(jīng)常有香客問(wèn)我就珠,道長(zhǎng),這世上最難降的妖魔是什么壳炎? 我笑而不...
    開(kāi)封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任匿辩,我火速辦了婚禮榛丢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晰赞。我一直安慰自己选侨,他們只是感情好然走,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布丰刊。 她就那樣靜靜地躺著啄巧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪码泛。 梳的紋絲不亂的頭發(fā)上澄耍,一...
    開(kāi)封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天齐莲,我揣著相機(jī)與錄音选酗,去河邊找鬼。 笑死呜叫,一個(gè)胖子當(dāng)著我的面吹牛殿衰,可吹牛的內(nèi)容都是我干的闷祥。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼果覆!你這毒婦竟也來(lái)了局待?” 一聲冷哼從身側(cè)響起菱属,我...
    開(kāi)封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤纽门,失蹤者是張志新(化名)和其女友劉穎赏陵,沒(méi)想到半個(gè)月后饲漾,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體考传,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡僚楞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年泉褐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片血淌。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖躺坟,靈堂內(nèi)的尸體忽然破棺而出乳蓄,到底是詐尸還是另有隱情虚倒,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布菠剩,位于F島的核電站具壮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏攘已。R本人自食惡果不足惜怜跑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一性芬、第九天 我趴在偏房一處隱蔽的房頂上張望批旺。 院中可真熱鬧,春花似錦搏熄、人聲如沸暇赤。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至歉糜,卻和暖如春匪补,著一層夾襖步出監(jiān)牢的瞬間烂翰,已是汗流浹背甘耿。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留润文,地道東北人典蝌。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓骏掀,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親笑陈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子葵袭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • *面試心聲:其實(shí)這些題本人都沒(méi)怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,129評(píng)論 30 470
  • 1.屬性readwrite蓬网,readonly帆锋,assign禽额,retain,copy实辑,nonatomic 各是什么作...
    曾令偉閱讀 1,046評(píng)論 0 10
  • 37.cocoa內(nèi)存管理規(guī)則 1)當(dāng)你使用new徙菠,alloc或copy方法創(chuàng)建一個(gè)對(duì)象時(shí),該對(duì)象的保留計(jì)數(shù)器值為1...
    如風(fēng)家的秘密閱讀 835評(píng)論 0 4
  • 1.OC的類可以多重繼承嗎问慎?可以實(shí)現(xiàn)多個(gè)接口嗎挤茄?要想實(shí)現(xiàn)類似多重繼承如何實(shí)現(xiàn)穷劈?答:OC不可以實(shí)現(xiàn)多重繼承踊沸”乒辏可以實(shí)現(xiàn)...
    歐辰_OSR閱讀 1,975評(píng)論 0 30
  • 綠草逐清風(fēng)腺律。枝上繁花醉夢(mèng)中宜肉。 飛雪逗梅成舊事谬返,匆匆,村外溪頭杏已紅吊圾。 春到念無(wú)窮翰蠢。最憶唇邊笑意濃梁沧。 暖透薄衾何懼雨...
    繁花落盡深眸閱讀 577評(píng)論 14 22