iphone——TTTableViewController加载过程

        新建一个类,继承自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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值