在TableView中使用不同各类的附件


问题


通过展示不同附件(accessories),抓住用户对一个TableView的关注,或者提供不同的方式使用户在你的TableView中和每个cells进行互动。

方案


使用UITableViewCell类中的accessoryType,在tableView的数据源对象中进行想着的实例化。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
	UITableViewCell* result = nil;

	if ([tableView isEqual:self.myTableView]) {
		static NSString *MyCellIdentifier = @"SimpleCell";

		result = [tableView  dequeueReusableCellWithIdentifier:MyCellIdentifier];
		if (result == nil) {
			result = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyCellIdentifier];
		}

		result.textLabel.text = [NSString stringWithFormat:@"Section %ld, Cell %ld",
			(long)indexPath.section,
			(long)indexPath.row];
		result.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
	}

	return result;
}
typedef NS_ENUM(NSInteger, UITableViewCellAccessoryType) {
    UITableViewCellAccessoryNone,                   // don't show any accessory view
    UITableViewCellAccessoryDisclosureIndicator,    // regular chevron. doesn't track
    UITableViewCellAccessoryDetailDisclosureButton, // info button w/ chevron. tracks
    UITableViewCellAccessoryCheckmark,              // checkmark. doesn't track
    UITableViewCellAccessoryDetailButton NS_ENUM_AVAILABLE_IOS(7_0) // info button. tracks
};

讨论


可以把UITableViewCellAccessoryType枚举中定义的任何值分配到一个UITableViewCell类的实例中accessoryType的属性。

discloure indicator 和 detail discloure按钮是两个非常有用的附件。它们都通过V形乘着向用户指示,如果他们在关联的TableView单元格进行点击,将显示新的视图或视图控制器。

换句话说,用户将看到一个有更多关于当前所选项信息的屏幕。这两个附件的区别在于discloure indicator不产生事件,而detail discloure按钮在被点击时会向委托触发一个事件。

也就是说,点击cell上的按键会有不同的效果。因此detail discloure按钮允许用户在同一行上执行两个独立但想着的操作。

图4-3显示在一个TableView中展示了这两个不财附件,第一个是discloure indicator,第二个是detail discloure按钮。

TableView-3

图4-3. 2个不同附件的TableViewCells.

如果你点击任何一个分配到TableViewCells中的detail discloure按钮,你会马上意识到它事实上是一个按钮。现在问题来了:当用户点击这个按钮的时候TableView如何知道呢?

TableView在其委托对象上产生一个事件,一个TableViewCell的detail discloure按钮也会产生一个被TableView的委托对象捕获的事件:

- (void) tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath{
	NSLog(@"Accessory button is tapped for cell at index path = %@", indexPath);
	UITableViewCell *ownerCell = [tableView cellForRowAtIndexPath:indexPath];
	NSLog(@"Cell Title = %@", ownerCell.textLabel.text);
}

此代码查找哪个TableViewCell的detail discloure按钮触发,并将该cell的文本标签的内容打印到控制台屏幕。

提醒:可以通过选择Xcode中的Run –> Console来显示控制台屏幕。