一个简单的类别,可以不用使用故事板来使用静态 UITableViewCells
如果您使用 CocoaPods,做法很简单
pod 'VMTableViewStaticCells'
如果您不使用 CocoaPods,只需下载源代码并将 VMTableViewStaticCells 文件夹的内容复制到您的项目中。您可以 #import "UITableView+StaticCells.h"
,这就是您所需要的全部。
设置 UITableView
要通过代码设置 UITableView 使用静态单元格,您只需这样做
self.tableView.dataSource = self.tableView;
self.tableView.chainedDelegate = self;
不用担心将 dataSource
设置为 tableView
本身,它将自动将所有方法转发到 chainedDelegate
!
通过代码设置一个静态单元格
操作非常简单,只需调用
self.tableView.items[0][1] = staticCell;
然后第一部分的第二行将自动成为一个静态单元格,如同在 staticCell
实例中设置的。
从 XIB 加载一个静态单元格设置
没有比这更简单的了,只需
self.tableView.items[1][1] = [UITableViewCell loadFromNib:@"StaticCells" cellWithIdentifier:@"buttonCell"];
来加载具有 "buttonCell" 相同 reuseIdentifier
的 UITableViewCell
。或者,如果您想使用标签,
self.tableView.items[1][3] = [UITableViewCell loadFromNib:@"StaticCells" cellWithTag:10];
并将 UITableViewCell
从同一个 XIB 加载,但基于标签值。
混合静态和动态单元格
您可以设置一个完全静态的 UITableView
,但也有可能混合静态和动态单元格,在同一个部分或不同的部分。要这样做,只需像上面设置您需要的那些静态单元格。在
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
方法中,您会自动获得将 indexPath
转换到您的系统的值。这意味着,例如
self.tableView.items[0][0] = staticCell1;
self.tableView.items[0][2] = staticCell2;
self.dynamicItems = @[myItem, myItem2];
在这个场景中,您将只得到
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
被调用两次。一次用于项目 [0][1]
,一次用于项目 [0][3]
。但是,您实际上会得到包含值的索引路径 [0][0]
和 [0][1]
,这样您不需要记住静态单元格的位置,也不需要转换数组的索引,因为这一切都是由 UITableView
自动完成的;无论如何,如果您设置了聪明的转换索引的方法,或者使用了一些不关心索引转换的数据结构,您总是可以通过调用
[indexPath originalIndexPath];
请注意,在
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
您应该只返回您自己管理的部分数量(不是只有静态单元格的部分)。为了帮助类别更好地工作,请
返回 0
在
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
对于所有你不管理的部分(完全静态的部分),例如以下片段
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if(section == 0)
return _firstSectionObjects.count;
else if(section == 1)
return _secondSectionObjects.count;
else if(section == 3)
return _fourthSectionObjects.count;
else
return 0; //third section is completely static
}
设置静态单元格的高级方法
设置静态单元格有几种方式。除了程序化或从 XIB 文件初始化单元格外,您还可以以下方式设置静态单元格的数组
NSIndexPath
以替代使用索引索引方式。NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:2];
self.tableView.items[indexPath] = staticCell1;
NSArray
。self.tableView.items[1] = @[staticCell1, staticCell2, staticCell3];
运行时移除静态单元格
在用户生成一些有趣的事件后完成静态单元格,您只需将静态单元格设置为 nil,然后在您准备好的时候重新加载数据。
self.tableView.items[0][0] = nil;
[self.tableView reloadData];