一般来说,ViewController继承自UITableViewController是最方便的,因为已经有了很多默认的行为。比如会自动设置tableView属性,自动调用reloadData,自动支持滚动等。但是有的时候,需要自定义UITableView,所以相应的也需要自定义UITableViewController
比如创建一个UIView,上半部分是TableView,下半部分有一个自定义视图,这时候就需要自定义UIView和UIViewController
@interface SettingView : UIView @property UITableView *tableView; -(id) initWithController:(SettingViewController*)controller; @end
@implementation SettingView -(id) initWithController:(SettingViewController*)controller { self = [super initWithFrame:[[UIScreen mainScreen] applicationFrame]]; if(self){ self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 468) style:UITableViewStylePlain]; self.tableView.dataSource = controller; self.tableView.delegate = controller; [self.tableView setScrollEnabled:NO]; self.tableView.separatorInset = UIEdgeInsetsMake(0, 10, 0, 10); self.tableView.tableFooterView = [[UIView alloc] init]; // 自定义UIView [self addSubview:self.tableView]; [self addSubview:logout]; } return self; } @end
@interface SettingViewController : UIViewController<UITableViewDataSource, UITableViewDelegate> -(void) logout; @end
这时候会发现,当选中table中的一行,再切换回来的时候,不会有自动取消行选中的效果,因此需要在viewDidAppear或者viewWillAppear里:
-(void) viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; SettingView *myView = (SettingView*)self.view; [myView.tableView deselectRowAtIndexPath:[myView.tableView indexPathForSelectedRow] animated:YES]; }