(註:環境Mac OS X Lion 10.7.3 + Xcode 4.2.1 + iOS SDK 5.0.)
一、建立iOS Application工程,選擇Single View Application,不要選中Use Storyboard.假設指定的是product name和class prefix都是one,則完成後自動產生程式碼檢視如:
該應用預設載入的是oneViewController的view.雙擊oneViewController.xib,在該xib預設的view上面添加控制項UILabel、UIButton和一個UITableView,如所示:
在oneViewController標頭檔和*.m檔案中定義和聲明三個屬性label、button、tableViewCell前兩個對應xib介面上的label和button,最後一個對應於即將建立的xib檔案中的tableViewCell,並且將label和button屬性和介面上的控制項通過拖拽相互關聯,如:
oneViewController.h:
oneViewController.m:
二、建立根view為UITableViewCell的xib檔案Cell.xib:
無法直接產生根view為UITableViewCell的xib檔案,可以通過先建立根view為UIView的xib檔案,然後將該xib的根view刪除,再從Library視窗中拖一個Table View Cell到該xib中做為該xib的根view.如:
剛產生的時候:
將上面的view刪除,拖一個table view cell代替,並且在該table view cell上面添加一個label和一個button,如:
設定Table View Cell下面的Cell Label和Cell Button的view Tag分別為1和2:
然後選中上面的File's owner,在identify inspector視圖Custom Class中選擇對應的載入類為oneViewController:
並且從connections inspector下面的Outlets內的UITableViewCell對象tableViewCell與中間視圖視窗中的Objects下面的Table View Cell相拖拽串連:(圖XXX)
在Attributes inspector中設定Table View Cell的identifier為:CellIdentifier:
儲存。
三、代碼中動態載入Table View Cell XIB:
開啟oneViewController.h讓oneViewController實現協議UITableViewDataSource,UITableViewDelegate,即:
oneViewController.m中實現下面的介面方法:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return20;
}
// Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with
dequeueReusableCellWithIdentifier:
// Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls)
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
staticNSString *CustomCellIdentifier =@"CellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CustomCellIdentifier];
if (cell ==nil) {
NSArray *nib = [[NSBundlemainBundle]loadNibNamed:@"Cell" owner:selfoptions:nil];
// if ([nib count] > 0) {
// cell = self.tableViewCell;
// } else {
// NSLog(@"failed to load CustomCell nib file!");
// }
cell = [nib objectAtIndex:0]; // 注釋掉的和該句是兩種方式,在這裡兩種方式都行。但是如果沒有上面紅色處(圖XXX)的拖拽串連過程,這裡只能使用nib objectAtIndex方式。
}
NSUInteger row = [indexPathrow];
NSLog(@"++++++++++++++ jonesduan %s, cell row:%d", __func__, row);
UILabel *cellLabel = (UILabel *)[cellviewWithTag:1];
cellLabel.text = [NSStringstringWithFormat:@"cell index: %d", row];
UIButton *cellButton = (UIButton *)[cellviewWithTag:2];
[cellButton setTitleColor:[UIColorredColor]forState:UIControlStateNormal];
[cellButton setTitleColor:[UIColororangeColor]forState:UIControlStateHighlighted];
[cellButton setTitle:@"Press me!"forState:UIControlStateNormal];
[cellButton setTitle:@"Pressed!"forState:UIControlStateHighlighted];
return cell;
}
- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
// Modified by jonesduan.
return80;
}
- (void)didReceiveMemoryWarning
{
[superdidReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[superviewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self.labelsetBackgroundColor:[UIColorgrayColor]];
[self.buttonsetTitleColor:[UIColorgreenColor]forState:UIControlStateNormal];
[self.buttonsetTitleColor:[UIColororangeColor]forState:UIControlStateHighlighted];//這裡控制的是oneViewController.xib中的label和button,前面已經拖拽串連過。
}
這樣完成後。CMD + R運行一下看看,發現介面如所示:
並沒有顯示Cell.xib中的Cell Label和Cell Button,下面是最重要的一點,也是一個人研究了很久才知道的,即:選中oneViewController.xib中view下的子Table View,切換到connections inspector,將Table View的dataSource和delegate均與File's owner相拖拽進行串連。如:
連完後,再CMD + R運行看看,結果是不是就如所示了,
OK,成功!
總結:通過xib自訂view比較重要的一點就是這個view被哪個view controller使用,比如xxxViewController,就要在identity inspector中Custom Class指定對應的載入類為xxxViewController,然後選中File's owner(中間大視窗中的Placeholders下),並切換到connections inspector將Outlets下面的對象與中間大視窗中的Objects(與Placeholders同層級,在Placeholders下面)下的根視圖相串連。最後別忘了Table View的dataSource和delegate均與File's owner相拖拽進行串連。
APPLE開發最不習慣的就是拖拽串連,在此記錄一下作為個人蔘考,免得以後忘記了。
demo:http://download.csdn.net/detail/duanyipeng/4063778
摘自 Code Heaven