UITableView / UITableViewDataSource / UITableViewDelegate

一张图解释TableView各属性

0

 

UITableView

 

Initializing a UITableView Object

 初始化:

 

- (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style

 

 

Configuring a Table View

 配置:

 

1. style

/** TableView样式,默认Plain */

@property(nonatomic, readonly) UITableViewStyle style

 

typedef enum {

   UITableViewStylePlain,

   UITableViewStyleGrouped 

} UITableViewStyle;

 

2. - numberOfRowsInSection:

/** 返回对应Section的rows number */

- (NSInteger)numberOfRowsInSection:(NSInteger)section

 

3. - numberOfSections

/**  返回对应的Sections number */

- (NSInteger)numberOfSections

 

4. rowHeight

/**  cell的高度 */

@property(nonatomic) CGFloat rowHeight

**可用tableView:heightForRowAtIndexPath:代替rowHeight

 

5. separatorStyle

/** cell分割线的样式,默认SingleLine */

@property(nonatomic) UITableViewCellSeparatorStyle separatorStyle

 

typedef enum : NSInteger {

   UITableViewCellSeparatorStyleNone,

   UITableViewCellSeparatorStyleSingleLine,

   UITableViewCellSeparatorStyleSingleLineEtched 

} UITableViewCellSeparatorStyle;

 

6. separatorColor

/** cell分割线颜色,默认灰色 */

@property(nonatomic, retain) UIColor *separatorColor

 

7. backgroundView

/** tableView下的backgroundView */

@property(nonatomic, readwrite, retain) UIView *backgroundView

 Tips: A table view’s background view is automatically resized to match the size of the table view. You must set this property to nil to set the background color of the table view.

 提示: tableView的backgroundView会自动拉伸覆盖整个tableView, 且backgroundView位于backgroundColor所设置的view的上层, 所以如果同时存在backgroundView和backgroundColor两个有效值, 需要把backgroundView设置为nil.

 

8. separatorInset

/** 分割线的内嵌距离 */

@property(nonatomic) UIEdgeInsets separatorInset

 Inset只有设置左右距离会产生效果, 上下并无反应

 

Creating Table View Cells

 创建cell

 

1. - registerNib:forCellReuseIdentifier:

/** 通过xib创建cell */

- (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier

 指明cell可以从哪个xib文件中加载出来

 

2. - registerClass:forCellReuseIdentifier:

/** 通过类创建cell */

- (void)registerClass:(Class)cellClass forCellReuseIdentifier:(NSString *)identifier

 指明cell可以从哪个类中创建

 

3. - dequeueReusableCellWithIdentifier:forIndexPath:

/** 创建可重用cell */

- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath

 

registerNib:forCellReuseIdentifier:registerClass:forCellReuseIdentifier:Tips: If you registered a class for the specified identifier and a new cell must be created, this method initializes the cell by calling its initWithStyle:reuseIdentifier:  method. For nib-based cells, this method loads the cell object from the provided nib file. If an existing cell was available for reuse, this method calls the cell’s prepareForReuse  method instead.

 提示: 用该方法创建reuse的cell之前, 需要先调用-registerNib 或者 -registerClass, 若cell是从类中创建, 则会调用 initWithStyle:reuseIdentifier: 方法, 若Cell之前已经存在, 则会调用 prepareForReuse 方法.

 

4. - dequeueReusableCellWithIdentifier:

/** 创建可重用cell */

- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier

 使用该方法创建cell, identifier并没有找到相应的cell, 则不会创建成功, cell返回nil

 

Accessing Header and Footer Views

 

1. - registerNib:forHeaderFooterViewReuseIdentifier:

    - registerClass:forHeaderFooterViewReuseIdentifier:

/** 创建headerView/footerView */

- (void)registerNib:(UINib *)nib forHeaderFooterViewReuseIdentifier:(NSString *)identifier

- (void)registerClass:(Class)aClass forHeaderFooterViewReuseIdentifier:(NSString *)identifier

- (id)dequeueReusableHeaderFooterViewWithIdentifier:(NSString *)identifier

 与创建cell类似

 

2. tableHeaderView/tableFooterView

/** 获得当前tableHeaderView,默认为nil */

/** 获得当前tableFooterView,默认为nil */

@property(nonatomic, retain) UIView *tableHeaderView

@property(nonatomic, retain) UIView *tableFooterView

 

3. sectionHeaderHeight/sectionFooterHeight

/** 获得section对应的Header/Footer高度 */

@property(nonatomic) CGFloat sectionHeaderHeight

@property(nonatomic) CGFloat sectionFooterHeight 

 不能与 tableView:heightForHeaderInSection:/tableView:heightForFooterInSection:同用,且只用在table的Style为Group的情况下才邮箱

 

4. - headerViewForSection: / - footerViewForSection:

/** 获得指定section下的header/footer */

- (UITableViewHeaderFooterView *)headerViewForSection:(NSInteger)section

- (UITableViewHeaderFooterView *)footerViewForSection:(NSInteger)section

 

Accessing Cells and Sections

 

1. - cellForRowAtIndexPath:

/** 返回特定的cell, 用于设置各行的tableViewCell */

- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath

 

2. - indexPathForCell:

/** 获得cell对应的indexPath */

- (NSIndexPath *)indexPathForCell:(UITableViewCell *)cell

 

3. - indexPathForRowAtPoint:

/** 根据特定点point获得该点下特定indexPath */

- (NSIndexPath *)indexPathForRowAtPoint:(CGPoint)point

 

4. - indexPathForRowsInRect:

/** 根据范围rect返回该范围下所有的indexPath */

- (NSArray *)indexPathsForRowsInRect:(CGRect)rect

 

5. - visibleCells

/** 返回当前屏幕下显示的所有cell */

- (NSArray *)visibleCells

 

6. - indexPathsForVisibleRows

/** 返回当前屏幕下显示的Rows所对应的所有indexPath */

- (NSArray *)indexPathsForVisibleRows

 

Estimating Element Heights

 估计高度

 

1. estimatedRowHeight / estimatedSectionHeaderHeight / estimatedSectionFooterHeight

/** 估计高度,用于延迟设置高度,默认为0 */

@property(nonatomic) CGFloat estimatedRowHeight

@property(nonatomic) CGFloat estimatedSectionHeaderHeight

@property(nonatomic) CGFloat estimatedSectionFooterHeight

Discussion

Providing a nonnegative estimate of the height of rows can improve the performance of loading the table view. If the table contains variable height rows, it might be expensive to calculate all their heights when the table loads. Using estimation allows you to defer some of the cost of geometry calculation from load time to scrolling time.

 

Scrolling the Table View

 滚动中的TableView

 

1. - scrollToRowAtIndexPath:atScrollPosition:animated:

/** 让tableView滚动到特定位置 */

- (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated

 使用该方法不会调用scrollViewDidScroll:方法.

 

typedef enum {

   UITableViewScrollPositionNone,

   UITableViewScrollPositionTop,

   UITableViewScrollPositionMiddle,

   UITableViewScrollPositionBottom 

} UITableViewScrollPosition;

 

2. - scrollToNearestSelectedRowAtScrollPosition:animated:

/** 滚到最近row的特定位置,并没什么用.... */

- (void)scrollToNearestSelectedRowAtScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated

 

Managing Selections

 点击事件处理

 

1. - indexPathForSelectedRow / - indexPathsForSelectedRows

/** 返回点击的indexPath */

- (NSIndexPath *)indexPathForSelectedRow

- (NSArray *)indexPathsForSelectedRows

 

2. - selectRowAtIndexPath:animated:scrollPosition

/** 手动选中指定位置的cell */

- (void)selectRowAtIndexPath:(NSIndexPath *)indexPath
                    animated:(BOOL)animated
              scrollPosition:(UITableViewScrollPosition)scrollPosition

Discussion

Calling this method does not cause the delegate to receive a tableView:willSelectRowAtIndexPath: or tableView:didSelectRowAtIndexPath: message, nor does it send UITableViewSelectionDidChangeNotification notifications to observers

 调用该方法不会引起代理方法和通知

 

3. - deselectRowAtIndexPath:animated

/** 取消选取 */

- (void)deselectRowAtIndexPath:(NSIndexPath *)indexPath
                      animated:(BOOL)animated

 

4. allowsSelection

/** 是否允许被选择 */

@property(nonatomic) BOOL allowsSelection

 

5. allowsMultipleSelection

/** 是否允许同时选中多个cell, 默认NO */

@property(nonatomic) BOOL allowsMultipleSelection

 

6. allowsSelectionDuringEditing

/** 是否允许编辑状态下可以选中cell, 默认NO */

@property(nonatomic) BOOL allowsSelectionDuringEditing

 

7. allowsMultipleSelectionDuringEditing

/** 是否允许编辑状态下同时选中多个cell */

@property(nonatomic) BOOL allowsMultipleSelectionDuringEditing

 

 

Inserting, Deleting, and Moving Rows and Sections

 编辑状态

 

1. beginUpdates / endUpdates

/** 编辑完成后调用该方法, 可以自行调用该方法以完成动画效果 */

- (void)beginUpdates

- (void)endUpdates

 

2. - insertRowsAtIndexPaths:withRowAnimation: / deleteRowsAtIndexPaths:withRowAnimation

    - insertSections:withRowAnimation: / - deleteSections:withRowAnimation

/** 在特定indexPath中插入/删除 */

- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation

- (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation

 

/** 在特定section中插入/删除 */

- (void)insertSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation

- (void)deleteSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation

 

3. - moveRowAtIndexPath:toIndexPath:

    - moveSection:toSection

/** 把cell从某个位置移动到另一个位置 */

- (void)moveRowAtIndexPath:(NSIndexPath *)indexPath toIndexPath:(NSIndexPath *)newIndexPath

 

- (void)moveSection:(NSInteger)section toSection:(NSInteger)newSection

 

Managing the Editing of Table Cells

 编辑cells

 

1. editing / - setEditing:animated:

/** 是否进入编辑状态 */

@property(nonatomic, getter=isEditing) BOOL editing

- (void)setEditing:(BOOL)editing animated:(BOOL)animate

 

Reloading the Table View

 重载/更新

 

1. - reloadData

/** 重新加载tableView全部数据, 不应该在插入删除后调用 */

- (void)reloadData

It should not be called in the methods that insert or delete rows, especially within an animation block implemented with calls to beginUpdates and endUpdates.

 

2. - reloadRowsAtIndexPaths:withRowAnimation:

/** 重载特定indexPaths的数据 */

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation

 

typedef enum {

   UITableViewRowAnimationFade,

   UITableViewRowAnimationRight,

   UITableViewRowAnimationLeft,

   UITableViewRowAnimationTop,

   UITableViewRowAnimationBottom,

   UITableViewRowAnimationNone,

   UITableViewRowAnimationMiddle,

   UITableViewRowAnimationAutomatic = 100

} UITableViewRowAnimation;

 

 

3. - reloadSections:withRowAnimation

/** 重载特定sections的数据 */

- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation

 

4. - reloadSectionIndexTitles

/** 重载section的序号 */

- (void)reloadSectionIndexTitles

Discussion

This method gives you a way to update the section index after inserting or deleting sections without having to reload the whole table.

 

 

Accessing Drawing Areas of the Table View

 组件位置

 

- (CGRect)rectForSection:(NSInteger)section

- (CGRect)rectForRowAtIndexPath:(NSIndexPath *)indexPath

- (CGRect)rectForFooterInSection:(NSInteger)section

- (CGRect)rectForHeaderInSection:(NSInteger)section

 

Managing the Delegate and the Data Source

 代理/数据源

 

1. dataSource

/** 设置数据源 */

@property(nonatomic, assign) id< UITableViewDataSource > dataSource

 

2. delegate

/** 设置代理 */

@property(nonatomic, assign) id< UITableViewDelegate > delegate

 

 

Notifications

 

UITableViewSelectionDidChangeNotification

Posted when the selected row in the posting table view changes. There is no userInfo dictionary associated with this notification.

 

 

 

 

 

TIPS:

 

UITableView overrides the layoutSubviews method of UIView so that it calls reloadData only when you create a new instance of UITableView or when you assign a new data source.

 

If you want to customize your table cell beyond the standard cell styles, you can set the cell style to custom and add your custom views to the cell’s contentView property programmatically.

 

You can customize the appearance of your header or footer by setting a custom background view or tint color. The background view is placed behind the contentView and used to display static background content behind the header or footer.!!Avoid setting both a custom background view and a custom tint.

 

UITableViewDataSource

 

 

Configuring a Table View

 配置:

 

1. - tableView:cellForRowAtIndexPath:

/** 设置cell */

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

 

2. - numberOfSectionsInTableView:

/** 设置section的数目, 默认为1 */

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

 

3. - tableView:numberOfRowsInSection:

/** 设置特定Section中row的数目 */

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

 

4. - sectionIndexTitlesForTableView:

/** 返回每个section对应的title */

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView

 

5. - tableView:sectionForSectionIndexTitle:atIndex:

/** 根据section title和title的index 返回 section对应在tableView下的index */

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index

 

6. - tableView:titleForHeaderInSection: / - tableView:titleForFooterInSection:

/** 返回特定section对应的header的title */

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section

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

Discussion

The table view uses a fixed font style for section header titles. If you want a different font style, return a custom view (for example, a UILabel object) in the delegate method tableView:viewForHeaderInSection: instead.

 想更改header / footer 的字体, 调用delegate的方法 tableView:viewForHeaderInSection: / tableView:viewForFooterInSection:

 

Inserting or Deleting Table Rows

 插入/删除

 

1. - tableView:commitEditingStyle:forRowAtIndexPath:

/** 提交编辑操作 */

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

 

typedef enum : NSInteger {

   UITableViewCellEditingStyleNone,

   UITableViewCellEditingStyleDelete,

   UITableViewCellEditingStyleInsert 

} UITableViewCellEditingStyle;

  

 调用这个方法后, 根据插入或者删除操作, 会通知tableView方法 insertRowsAtIndexPaths:withRowAnimation: or deleteRowsAtIndexPaths:withRowAnimation:

 要实现横扫删除效果需要实现该方法, 可以用  performSelector:withObject:afterDelay:  实现延迟操作 

 

 

2. - tableView:canEditRowAtIndexPath

/** 设置对应indexPath位置下的Cell是否可以编辑 */

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath

 可以通过代理方法 tableView:editingStyleForRowAtIndexPath: 返回 UITableViewCellEditingStyleNone 取消编辑状态

 

Reordering Table Rows

 排序

 

1. - tableView:canMoveRowAtIndexPath:

/** 设置对应indexPath位置下的Cell是否可以移动 */

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath

 

2. - tableView:moveRowAtIndexPath:toIndexPath:

/** 移动cell */

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath

 

 

UITableViewDelegate

 

 

Configuring Rows for the Table View

 配置:

 

1. - tableView:heightForRowAtIndexPath:

/** 设置cell的高度 */

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

 

2. - tableView:estimateHeightForRowAtIndexPath:

/** 设置估计高度 */

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath

Return Value

 Return UITableViewAutomaticDimension if you have no estimate.

 

3. - tableView:indentationLevelForRowAtIndexPath:

/** 返回特定section的凹陷程度 */

- (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath

 

4. - tableView:willDisplayCell:forRowAtIndexPath:

/** 创建cell前会调用该方法, 可以提前在这里设置一些值 */

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

 

Managing Accessory Views

 指向标

 

1. - tableView:editActionsForRowAtIndexPath:

/** 自定义一个action */

- (NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath

 

2. - tableView:accessoryButtonTappedForRowWithIndexPath:

/** 用户点击accessory */

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath

 

Managing Selections

 

1. - tableView:willSelectRowAtIndexPath:

/** 将要选中特定row */

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath

 

2. - tableView:didSelectRowAtIndexPath:

/** 正在选中特定row */

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

 

3. - tableView:willDeselectRowAtIndexPath:

/** 将要取消选中 */

- (NSIndexPath *)tableView:(UITableView *)tableView willDeselectRowAtIndexPath:(NSIndexPath *)indexPath

 

4. - tableView:didDeselectRowAtIndexPath:

/** 已经取消选中 */

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath

 

Modifying the Header and Footer of Sections

 

1. - tableView:viewForHeaderInSection: / - tableView:viewForFooterInSection:

/** 设置特定section上的header / footer */

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section

 

Discussion

The returned object can be a UILabel or UIImageView object, as well as a custom view. This method only works correctly when tableView:heightForHeaderInSection: / tableView:heightForFooterInSection: is also implemented.

 

2. - tableView:heightForHeaderInSection: / - tableView:estimatedHeightForHeaderInSection:

/** 设置特定section上header / footer的高度 */

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForHeaderInSection:(NSInteger)section

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForFooterInSection:(NSInteger)section

 

3. - tableView:willDisplayHeaderView: / - tableView:willDisplayFooterView:

/** 将要显示各个section的header时调用 */

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section

- (void)tableView:(UITableView *)tableView willDisplayFooterView:(UIView *)view forSection:(NSInteger)section

 

Editing Table Rows

 

1. - tableView:willBeginEditingRowAtIndexPath:

/** 将要进入编辑模式前调用 */

- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath

 

2. - tableView:didEndEditingRowAtIndexPath:

/** 完成编辑后调用 */

- (void)tableView:(UITableView *)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath

 

3. - tableView:editdingStyleForRowAtIndexPath:

/** 设置特定indexPath下的编辑模式 */

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath

 

typedef enum : NSInteger {

   UITableViewCellEditingStyleNone,

   UITableViewCellEditingStyleDelete,

   UITableViewCellEditingStyleInsert 

} UITableViewCellEditingStyle;

 

4. - tableView:titleForDeleteConfirmationButtonForRowAtIndexPath:

/** 修改特定indexPath下删除按钮的文字 */

- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath

 

Reordering Table Rows

 

1. - tableView:targetIndexPathForMoveFromRowAtIndexPath:

/** 拖动cell, 返回最后所在indexPath */

- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath

 

posted @ 2015-10-14 19:56  自己的心灵猎手  阅读(921)  评论(0编辑  收藏  举报