新建一个类,继承自TTTableViewController,当通过TTNavigator建立URL与对象的映射关系时会建立该新类的实例;当通过TTNavigator打开URL时会将该对象的视图加入到父视图中([parentView addSubView:newViewController.view)。如果新类没有重写loadView方法,则会调用TTTableViewController的loadView方法,我们的旅程就从此开始:
TTTableViewController
TTTableViewController:
- (void)loadView {
[super loadView];
self.tableView;
}
//新建tableView实例,TTTableView继承自UITableView
- (UITableView*)tableView {
if (nil == _tableView) {
_tableView = [[TTTableView alloc] initWithFrame:self.view.bounds style:_tableViewStyle];
_tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth
| UIViewAutoresizingFlexibleHeight;
UIColor* backgroundColor = _tableViewStyle == UITableViewStyleGrouped
? TTSTYLEVAR(tableGroupedBackgroundColor)
: TTSTYLEVAR(tablePlainBackgroundColor);
if (backgroundColor) {
_tableView.backgroundColor = backgroundColor;
self.view.backgroundColor = backgroundColor;
}
[self.view addSubview:_tableView];
}
return _tableView;
}
- (void)viewWillAppear:(BOOL)animated {
//此处的super为TTModelViewController
[super viewWillAppear:animated];
if (_lastInterfaceOrientation != self.interfaceOrientation) {
_lastInterfaceOrientation = self.interfaceOrientation;
[_tableView reloadData];
} else if ([_tableView isKindOfClass:[TTTableView class]]) {
TTTableView* tableView = (TTTableView*)_tableView;
tableView.highlightedLabel = nil;
tableView.showShadows = _showTableShadows;
}
[_tableView deselectRowAtIndexPath:[_tableView indexPathForSelectedRow] animated:animated];
}
viewWillAppear执行完成后,系统会调用[tableView reloadData]方法(在showModel方法中调用),对tableView进行更新。调用TTTableViewDataSource或子类的- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section,- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法
//通常在客户代码中进行调用,形式如self.dataSource = ...
- (void)setDataSource:(id<TTTableViewDataSource>)dataSource {
if (dataSource != _dataSource) {
[_dataSource release];
_dataSource = [dataSource retain];
_tableView.dataSource = nil;
//此处是调用从基类继承的setModel:方法
self.model = dataSource.model;
}
}
//在updateViewState中进行调用
- (void)showModel:(BOOL)show {
[self hideMenu:YES];
if (show) {
//设置tableView的delegate
[self updateTableDelegate];
_tableView.dataSource = _dataSource;
} else {
_tableView.dataSource = nil;
}
//在处理完成后,对tableView进行重新加载
[_tableView reloadData];
}
- (void)updateTableDelegate {
if (!_tableView.delegate) {
[_tableDelegate release];
//创建tableView的delegate,缺省情况下建立的是TTTableViewDelegate的实例
//如果TTTableViewDelegate无法满足要求,客户可以新建一个类继承自TTTableViewDelegate并重写createDelegate方法,创建自定义的TTTableViewDelegate子类
_tableDelegate = [[self createDelegate] retain];
// You need to set it to nil before changing it or it won't have any effect
_tableView.delegate = nil;
_tableView.delegate = _tableDelegate;
}
}
- (id<UITableViewDelegate>)createDelegate {
if (_variableHeightRows) {
return [[[TTTableViewVarHeightDelegate alloc] initWithController:self] autorelease];
} else {
return [[[TTTableViewDelegate alloc] initWithController:self] autorelease];
}
}
- (void)didLoadModel:(BOOL)firstTime {
[super didLoadModel:firstTime];
//调用数据源的tableViewDidLoadModel代理方法
[_dataSource tableViewDidLoadModel:_tableView];
}
TTModelViewController
一个view controller用于管理附加在view上的一个model
- (void)viewWillAppear:(BOOL)animated {
_isViewAppearing = YES;
_hasViewAppeared = YES;
[self updateView];
[super viewWillAppear:animated];
}
- (void)updateView {
if (_flags.isViewInvalid && !_flags.isViewSuspended && !_flags.isUpdatingView) {
_flags.isUpdatingView = YES;
// Ensure the model is created
self.model;
// Ensure the view is created
self.view;
[self updateViewStates];
if (_frozenState && _flags.isShowingModel) {
[self restoreView:_frozenState];
TT_RELEASE_SAFELY(_frozenState);
}
_flags.isViewInvalid = NO;
_flags.isUpdatingView = NO;
[self reloadIfNeeded];
}
}
- (id<TTModel>)model {
if (!_model) {
if (![TTNavigator navigator].isDelayed) {
//createModel是个虚方法,用于客户重写以定义自已的model
[self createModel];
}
if (!_model) {
[self createInterstitialModel];
}
}
return _model;
}
- (void)setModel:(id<TTModel>)model {
if (_model != model) {
[_model.delegates removeObject:self];
[_model release];
_model = [model retain];
[_model.delegates addObject:self];
TT_RELEASE_SAFELY(_modelError);
if (_model) {
_flags.isModelWillLoadInvalid = NO;
_flags.isModelDidLoadInvalid = NO;
_flags.isModelDidLoadFirstTimeInvalid = NO;
_flags.isModelDidShowFirstTimeInvalid = YES;
}
[self refresh];
}
}
- (void)refresh {
_flags.isViewInvalid = YES;
_flags.isModelDidRefreshInvalid = YES;
//执行“return _model ? _model : self”时,返回的是TTTableViewDataSource的实例
//下面的两条语句会执行TTTableViewDataSource的isLoading和isLoaded方法
BOOL loading = self.model.isLoading;
BOOL loaded = self.model.isLoaded;
if (!loading && !loaded && [self shouldLoad]) {
[self.model load:TTURLRequestCachePolicyDefault more:NO];
} else if (!loading && loaded && [self shouldReload]) {
[self.model load:TTURLRequestCachePolicyNetwork more:NO];
} else if (!loading && [self shouldLoadMore]) {
[self.model load:TTURLRequestCachePolicyDefault more:YES];
} else {
_flags.isModelDidLoadInvalid = YES;
if (_isViewAppearing) {
//此处还会调用一次updateView方法,但在无异常时不会执行if语句中的内容
[self updateView];
}
}
}
//更新视图的状态
- (void)updateViewStates {
... //前面的代码主要是对视图的状态进行判断,还有调用子类重写的代理方法如didLoadModel:,还不是太懂
if (showModel) {
//showModel和didShowModel方法都是虚方法,用于子类重写
//此处会调用TTTableViewController中相关方法
[self showModel:YES];
[self didShowModel:_flags.isModelDidShowFirstTimeInvalid];
_flags.isModelDidShowFirstTimeInvalid = NO;
}
if (showEmpty) {
[self showEmpty:YES];
}
if (showError) {
[self showError:YES];
}
if (showLoading) {
[self showLoading:YES];
}
}
自到updateViewStates方法调用结果,TTModelViewController的viewWillAppear方法才调用结束,并回到TTTableViewController的viewWillAppear方法中
新建类
- (void)createModel {
//设置tableView对应的dataSource
self.dataSource = [TTListDataSource dataSourceWithObjects:
[TTTableTextItem itemWithText:@"date" URL:@"tt://dateSelect"],
nil];
}
TTTableViewDataSource
- (id<TTModel>)model {
return _model ? _model : self;
}
- (BOOL)isLoaded {
return NO;
}
- (BOOL)isLoading {
return YES;
}