Cocoa touch 未调用TTModel加载方法 问题 描述

Cocoa touch 未调用TTModel加载方法 问题 描述,cocoa-touch,ios,ios4,three20,Cocoa Touch,Ios,Ios4,Three20,以下代码导致未调用TTModel的load方法。我已经逐步完成了调试器以及TTCatalog应用程序。我所看到的两者之间的唯一区别是,当目录在控制器的createModel方法中设置其数据源时,TTModel的load方法会被调用,而我的方法不会 关于代码 我已经对代码的特定区域进行了注释,以说明它们应该做什么以及发生了什么问题,但为了完成起见,我将所有这些都包括在内 你应该特别注意 位置控制器的创建模型方法 位置列表的负荷法 这些就是问题所在的领域,也是最好的起点 代码 位置控制器:TT

以下代码导致未调用TTModelload方法。我已经逐步完成了调试器以及TTCatalog应用程序。我所看到的两者之间的唯一区别是,当目录在控制器的createModel方法中设置其数据源时,TTModel的load方法会被调用,而我的方法不会

关于代码 我已经对代码的特定区域进行了注释,以说明它们应该做什么以及发生了什么问题,但为了完成起见,我将所有这些都包括在内

你应该特别注意

  • 位置控制器的创建模型方法
  • 位置列表的负荷法
这些就是问题所在的领域,也是最好的起点


代码 位置控制器:TTTableViewController 简短回答:对于职位列表中的isLoading,返回否而不是是

关于更详细的解释:

如果深入研究Three20源代码,您会发现在视图控制器上设置数据源会设置模型,刷新模型并可能调用load。以下是TTModelViewController刷新时调用的代码:

- (void)refresh {
  _flags.isViewInvalid = YES;
  _flags.isModelDidRefreshInvalid = YES;

  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) {
      [self updateView];
    }
  }
}

对于isLoading,PositionList对象返回YES,对于isLoaded,返回NO。这意味着Three20认为您的模型正在加载,而实际情况并非如此。如果默认情况下shouldLoad没有返回YES,您可能还需要实现shouldLoad。

Perfect!作为将来的参考,你在找什么?每次我试图查看源代码时,我最终只看到头文件的内容,即使它是实现。
@implementation PositionsDataSource

@synthesize positionsList = _positionsList;

-(id)init
{
    if (self = [super init]) 
    {
        _positionsList = [[PositionsList alloc] init];
        self.model = _positionsList;
    }
    return self;
}

-(void)dealloc
{
    TT_RELEASE_SAFELY(_positionsList);
    [super dealloc];
}

-(void)tableViewDidLoadModel:(UITableView*)tableView
{
    self.items = [NSMutableArray array];
}

-(id<TTModel>)model
{
    return _positionsList;
}
@end
@implementation PositionsList

//============================================================
//NSObject

- (id)init
{
    if (self = [super init])
    {
        _delegates = nil;
        loaded = NO;
        client = [[Client alloc] init];
    }
    return self;
}

- (void)dealloc
{
    TT_RELEASE_SAFELY(_delegates);
    [client dealloc];
    [super dealloc];
}

//==============================================================
//TTModel

- (NSMutableArray*)delegates
{
    if (!_delegates)
    {
        _delegates = TTCreateNonRetainingArray();
    } 
    return _delegates;
}

-(BOOL)isLoadingMore
{
    return NO;
}

-(BOOL)isOutdated
{
    return NO;
}

-(BOOL)isLoaded
{
    return loaded;
}

-(BOOL)isEmpty
{
    //return !_positions.count;
    return NO;
}

-(BOOL)isLoading
{
    return YES;
}

-(void)cancel
{
}

//This method is never called, why is that?
-(void)load:(TTURLRequestCachePolicy)cachePolicy more:(BOOL)more
{
    //This method is not getting called
    //When the PositionsController calls self.datasource, load should be called,
    //however it isn't.
    [_delegates perform:@selector(modelDidStartLoad:) withObject:self];
    [client writeToServer:self dataToSend:@""];
}

-(void)invalidate:(BOOL)erase
{
}

@end
- (void)refresh {
  _flags.isViewInvalid = YES;
  _flags.isModelDidRefreshInvalid = YES;

  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) {
      [self updateView];
    }
  }
}