主題:功能的代碼實(shí)現(xiàn)與storyboard實(shí)現(xiàn)
問題描述:當(dāng)在父視圖ViewController(繼承自WMPageController)文件中以代碼(alloc init)實(shí)現(xiàn)子視圖newTableViewController,子視圖中的cell也采用代碼化的定義,子視圖確實(shí)如期呈現(xiàn),而newTableViewCell的cell.label定義于storyboard中,而在stroyboard中并未初始化newTableViewController,所以沒有初始化的cell.label無法賦值。
問題代碼:
ViewController.m
- (UIViewController *)pageController:(WMPageController *)pageController viewControllerAtIndex:(NSInteger)index {
switch (index) {
case 0: {
newTableViewController *vc = [[newTableViewController alloc] init];
return vc;
}
break;
case 1: {
oldViewController *vc = [[oldViewController alloc] init];
return vc;
}
break;
case 2: {
blackViewController *vc = [[blackViewController alloc] init];
return vc;
}
break;
default: {
return [[blackViewController alloc] init];
}
break;
}
}
newTableViewController.m
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
[self.tableView registerClass:[newTableViewCell class] forCellReuseIdentifier:@"newCell"];
newTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"newCell" forIndexPath:indexPath];
cell.cellLabelc = @"123";
return cell;
}
newTableViewCell.m
- (void)awakeFromNib {
[super awakeFromNib];
// Initialization code
}
解決方案:
用storyboard構(gòu)建cell
1.父視圖ViewController中實(shí)現(xiàn)newTableViewController:將storyboard中的newTableViewController給identitier:newT,
2.父視圖ViewController中實(shí)現(xiàn)newTableViewController:將storyboard中控制器與代碼聯(lián)系
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
return [sb instantiateViewControllerWithIdentifier:@"newTableViewController"];
3.刪除newTableViewController中的代碼化定義cell方法(此處重復(fù)定義了cell,因?yàn)樵趕toryboard中已經(jīng)寫了)
解決代碼:
ViewController.m
- (UIViewController *)pageController:(WMPageController *)pageController viewControllerAtIndex:(NSInteger)index {
switch (index) {
case 0: {
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
newTableViewController *tv = [sb instantiateViewControllerWithIdentifier:@"newT"];
tv.newsId = @"32";
return tv;
}
break;
case 1: {
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
newTableViewController *tv = [sb instantiateViewControllerWithIdentifier:@"newT"];
tv.newsId = @"34";
return tv;
}
break;
case 2: {
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
newTableViewController *tv = [sb instantiateViewControllerWithIdentifier:@"newT"];
tv.newsId = @"33";
return tv;
}
break;
case 3: {
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
newTableViewController *tv = [sb instantiateViewControllerWithIdentifier:@"newT"];
tv.newsId = @"70";
return tv;
}
break;
case 4: {
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
newTableViewController *tv = [sb instantiateViewControllerWithIdentifier:@"newT"];
tv.newsId = @"46";
return tv;
}
break;
case 5: {
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
newTableViewController *tv = [sb instantiateViewControllerWithIdentifier:@"newT"];
tv.newsId = @"69";
return tv;
}
break;
case 6: {
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
newTableViewController *tv = [sb instantiateViewControllerWithIdentifier:@"newT"];
tv.newsId = @"51";
return tv;
}
break;
default: {
return [[blackViewController alloc] init];
}
break;
}
}
newTableViewController.m
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
newTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"newCell" forIndexPath:indexPath];
cell.cellLabelc = @"123";
return cell;
}
newTableViewCell.m
- (void)awakeFromNib {
[super awakeFromNib];
// Initialization code
}
總結(jié):在storyboard中寫就一直在storyboard中寫,純代碼寫就一直純代碼寫,避免出錯(cuò)。
本次問題就在于創(chuàng)建的cell.label是用storyboard寫的(在storyboard中以圖形化編程定義),但寫代碼的時(shí)候返回了一個(gè)未定義在storyboard中的視圖,故也沒法初始化以storyboard定義的cell。
我以為我創(chuàng)建好的視圖中定義好了cell,實(shí)際上并沒有,因?yàn)槭怯眉兇a創(chuàng)建的,而我的cell定義在storyboard中,而我的代碼沒有跟storyboard產(chǎn)生聯(lián)系(需要給storyboard中定義cell的視圖newTableViewController給identifier)
需要注意的一點(diǎn):storyboard定義與純代碼定義不要重復(fù),會(huì)有邏輯混亂