iOS Programming Subclassing UITableViewCell 

1.Creating BNRItemCell

UITableViewCell is a UIView subclass.

UITableViewCell是UIView的子类。

When subclassing UIView (or any of its subclasses), you often override its drawRect: method to customize the view's appearance.

当继承UIView时,你经常需要重写drawRect方法来适应view的appearance。

However, when subclassing UITableViewCell, you usually customize its appearance by adding subviews to the cell.

当继承UITableViewCell时,你经常适应它的appearance 通过往cell 里添加subviews。

You do not add them directly to the cell though; instead you add them to the cell's content view.

你把他们添加到cell得content view中。

Each cell has a subview named contentView, which is a container for the view objects that make up the layout of a cell subclass

Adding subviews to the contentView instead of directly to the cell itself is important because the cell will resize its contentView at certain times.

把subview添加到content view上而不是直接添加到cell上很重要,因为cell 将resize 它的content view 在特定的时间。

For example, when a table view enters editing mode the contentView resizes itself to make room for the editing controls

当table view 进入editing 模式时,contentView重新调整他们的来腾出空间为编辑控制。

The cell cannot adjust its size when entering edit mode (it must remain the width of the table view), but the contentView can resize, and it does.

1.1

By the way, notice the UIScrollView in the cell hierarchy? That is how iOS moves the contents of the cell to the left when it enters editing mode. You can also use a right-to-left swipe on a cell to show the delete control, and this uses that same scroll view to get the job done. It makes sense then that the contentView is a subview of the scroll view.

注意在cell hierarchy中有一个UIScrollView?

这是为什么cell的content移动到了左边当进入编辑模式时。

Open Homepwner.xcodeproj. Create a new NSObject subclass and name it BNRItemCell. In BNRItemCell.h, change the superclass to UITableViewCell.

@interface BNRItemCell : UITableViewCell

2.  Configuring a UITableViewCell subclass's interface

The easiest way to configure a UITableViewCell subclass is with a XIB file. Create a new Empty XIB

file and name this file BNRItemCell.xib. (The Device Family is irrelevant for this file.)

最简单的方式是用一个xib文件。

This file will contain a single instance of BNRItemCell. When the table view needs a new cell, it will

create one from this XIB file.

 

In BNRItemCell.xib, select BNRItemCell.xib and drag a UITableViewCell instance from the object library to the canvas.

 

Select the Table View Cell in the outline view and then the identity inspector (the tab). Change the Class to BNRItemCell

Double-check that BNRItemCell.h looks like this: @interface BNRItemCell : UITableViewCell

@property (weak, nonatomic) IBOutlet UIImageView *thumbnailView; @property (weak, nonatomic) IBOutlet UILabel *nameLabel; @property (weak, nonatomic) IBOutlet UILabel *serialNumberLabel; @property (weak, nonatomic) IBOutlet UILabel *valueLabel;

@end

 

Note that you did not specify the File's Owner class or make any connections with it. This is a little different than your usual XIB files where all of the connections happen between the File's Owner and the archived objects.

你没有指明File' Owner 类和其他链接。这一点有一些不同。

3. Using BNRItemCell

In BNRItemsViewController's tableView:cellForRowAtIndexPath: method, you will create an

instance of BNRItemCell for every row in the table.

In BNRItemsViewController.m, import the header file for BNRItemCell so that

BNRItemsViewController knows about it.

#import "BNRItemCell.h"

Now that you are using a custom NIB file to load a UITableViewCell subclass, you will register that NIB instead.

现在你用一个通用的NIB文件加载UITableViewCell的子类,你将注册这个NIB。

In BNRItemsViewController.m, modify viewDidLoad to register BNRItemCell.xib for the "BNRItemCell" reuse identifier.

- (void)viewDidLoad

{
[super viewDidLoad];

 

// Load the NIB file
UINib *nib = [UINib nibWithNibName:@"BNRItemCell" bundle:nil];

// Register this NIB, which contains the cell

[self.tableView registerNib:nib

forCellReuseIdentifier:@"BNRItemCell"];

}

The registration of a NIB for a table view is not anything fancy: the table view simply stores the UINib instance in an NSDictionary for the key "BNRItemCell".

一个NIB文件的注册一点也不神奇:table view 简单地存储这个UINib实例到一个NSDictionary,key是BNRItemCell。

A UINib contains all of the data stored in its XIB file, and when asked, can create new instances of the objects it contains.

一个UINib包含了所有存储在XIB文件中得数据,当被要求时,能创建它包含的新的对象实例。

Once a UINib has been registered with a table view, the table view can be asked to load the instance of BNRItemCell when given the reuse identifier "BNRItemCell".

一旦一个UINIb被registered 在一个table view,那么这个table view 就能被要求加载BNRItemCell的实例了。

In BNRItemsViewController.m, modify tableView:cellForRowAtIndexPath:.

// Get a new or recycled cell BNRItemCell *cell =

[tableView dequeueReusableCellWithIdentifier:@"BNRItemCell" forIndexPath:indexPath];

// Configure the cell with the BNRItem

cell.nameLabel.text = item.itemName;

cell.serialNumberLabel.text = item.serialNumber;

cell.valueLabel.text =

[NSString stringWithFormat:@"$%d", item.valueInDollars];

 

BNRItemsViewController's table view will change its size to match the size of the window.

When a table view changes its width, each of its cells also change their width to match. Thus, you need to set up constraints in the cell that account for this change in width.

table view 改变它的宽度时,它的cell 将该改变他们的宽度来匹配。因此,如果你需要为宽度的变化设置限制。(cell 的高度不会改变,除非你明确指出。)

However, Auto Layout does not care about how big a view is when it is first created; it only cares about what the constraints say.

auto layout 并不关心你第一次创建的view有多大。它仅关心constraints 怎么说的。

If you were to add a constraint to the image view that pins its width to 500 points, the width would be 500 points – the original size does not factor in.

iOS Programming Subclassing UITableViewCell的更多相关文章

  1. iOS programming UITableView and UITableViewController

    iOS programming  UITableView and UITableViewController A UITableView displays a single column of dat ...

  2. ios Programming:The Big Nerd Ranch Guid(6th Edition) (Joe Conway & AARON HILLEGASS 著)

    Introduction (已看) Prerequisites What Has Changed in the Sixth Edition? Our Teaching Philosophy How t ...

  3. iOS Programming UIStoryboard 故事板

    iOS Programming UIStoryboard In this chapter, you will use a storyboard instead. Storyboards are a f ...

  4. iOS Programming State Restoration 状态存储

    iOS Programming State Restoration 状态存储 If iOS ever needs more memory and your application is in the ...

  5. iOS Programming Web Services and UIWebView

    iOS Programming Web Services and UIWebView The work is divided into two parts. The first is connecti ...

  6. Head First iOS Programming

    内部分享: Head First iOS Programming http://www.slideshare.net/tedzhaoxa/head-first-ios-programming-4606 ...

  7. iOS Programming Recipe 6: Creating a custom UIView using a Nib

    iOS Programming Recipe 6: Creating a custom UIView using a Nib JANUARY 7, 2013 BY MIKETT 12 COMMENTS ...

  8. iOS Programming Autorotation, Popover Controllers, and Modal View Controllers

    iOS Programming Autorotation, Popover Controllers, and Modal View Controllers  自动旋转,Popover 控制器,Moda ...

  9. iOS Programming Controlling Animations 动画

    iOS Programming Controlling Animations 动画 The word "animation" is derived from a Latin wor ...

随机推荐

  1. windows内存管理的机制以及优缺点

    分页存储管理基本思想:用户程序的地址空间被划分成若干固定大小的区域,称为“页”,相应地,内存空间分成若干个物理块,页和块的大小相等.可将用户程序的任一页放在内存的任一块中,实现了离散分配. 分段存储管 ...

  2. Bash Shell 解析路径获取文件名称和文件夹名

    前言 还是今天再写一个自己主动化打包脚本.用到了从路径名中获取最后的文件名称.这里记录一下实现过程. 当然,最后我也会给出官方的做法.(ps:非常囧,实现完了才发现原来Bash Shell有现成的函数 ...

  3. Java小白手记:SSH

    以下内容只是一个小白菜鸟的理解和总结,目的仅在于梳理思路. 13年的时候,我就说要学JAVA,有个C++高手同事赞许地说:"嗯,不错,SSH..."我不禁肃然起敬.SSH!多么高大 ...

  4. slf4j的总结

    参考文章 log4j2使用总结 slf4j介绍以及实现原理窥探 使用Slf4j集成Log4j2构建项目日志系统的完美解决方案 slf4j(全称是Simple Loging Facade For Jav ...

  5. 内存转储文件 Memory.dmp

    https://baike.sogou.com/v63435711.htm?fromTitle=内存转存文件 内存转储是用于系统崩溃时,将内存中的数据转储保存在转储文件中,供给有关人员进行排错分析用途 ...

  6. (19)javaWeb项目名称修改

    1,选中项目,[右键]-[Refactor]-[Rename] 在弹出面板中,填写New Name 点击[OK] 2,改变运行时目录名称 选中项目[右键]-[Properties] 在弹框中选择选择[ ...

  7. 文件上传Apache

    Map<String, Object> rtnMap = new HashMap<String, Object>(); // 获取文件 String tempPath = re ...

  8. Tyvj:1729 文艺平衡树(saply练习)

    您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 Input 第一 ...

  9. silverlight 子UserControl获取父UserControl

    文章转载自: [Silverlight] Silverlight中访问父对象 http://bbs.blueidea.com/thread-2964806-1-1.html 当前一个需求是一个User ...

  10. 【NOIP2006】作业调度方案 {语文难题}

    Description: 我们现在要利用 m 台机器加工 n 个工件,每个工件都有 m 道工序,每道工序都在不同的指定的机器上完成.每个工件的每道工序都有指定的加工时间.  每个工件的每个工序称为一个 ...