標籤:
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