0

我正在调用 WCF 服务以在 UITableViewController 中显示数据。.m 文件中的代码是:

- (void)viewDidLoad
{
  [super viewDidLoad];
  [docTable setDataSource:self];
  [docTable setDelegate:self];
}

-(void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    EDViPadDocSyncService *service = [[EDViPadDocSyncService alloc]init];
    EDVCategory *cat = [EDVCategory alloc];
    cat.categoryId = [catId intValue];
    [service getDocsByCatId:self action:@selector(getDocsByCatIdHandler:) category:cat];
    [docTable reloadData];
}

- (void) getDocsByCatIdHandler: (id)value 
{
if([value isKindOfClass:[NSError class]]) 
    {
    NSLog(@"%@", value);
    return;
}
if([value isKindOfClass:[SoapFault class]]) 
    {
    NSLog(@"%@", value);
    return;
    }               
    NSMutableArray* result = (NSMutableArray*)value;
    NSMutableArray *documentList = [[NSMutableArray alloc] init];
    self.myDocList = [[NSMutableArray array] init];
    for (int i = 0; i < [result count]; i++)
    {
       EDVDocument *docObj = [[EDVDocument alloc]init];
       docObj = [result objectAtIndex:i];
       [documentList addObject:[docObj docName]];        
    }
    self.myDocList = documentList;
    [docTable reloadData];
}

- (void)viewDidUnload
{  
   [super viewDidUnload];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return YES;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
  return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    int cnt = [self.myDocList count];
    NSLog(@"ABC=%@",cnt);
    return [self.myDocList count];
    //return 1;
 }

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   DocumentCell *cell = [tableView dequeueReusableCellWithIdentifier:@"DocumentCell"];
   if (cell == nil)
   {
      cell = [[[DocumentCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"DocumentCell"] autorelease];
   }
   NSLog(@"cell text=%@",[self.myDocList objectAtIndex:indexPath.row]);
   cell.lblDocName.text = [self.myDocList objectAtIndex:indexPath.row];
   return cell;
}

我正在使用情节提要。我已经挂钩了“docTable”,为“docTable”设置了数据源和委托。问题是,在调用“numberOfRowsInSection”之后调用了该服务。所以,'return [self.myDocList count] '是 0。我已将[docTable reloadData]放入viewWillAppear以及服务处理程序中,即“getDocsByCatIdHandler”。但它没有像预期的那样重新加载。还有什么我可以尝试的吗?编辑:- 这是一个主从应用程序。我使用相同的代码在“MasterViewController”UITableViewController 中加载数据并且它可以工作。当用户选择此表中的单元格时,我需要通过调用在第二个表视图中填充数据WCF 服务。第二个表视图不显示数据。

4

2 回答 2

0

当我进行异步 webService 调用时,我遇到了同样的问题。我正在使用私有库来调用 web 服务,因此我的控制权转到了库,并且在响应到来之后,Appdelegate 中的一个方法被设置为处理程序。所以你需要做的是在调用Webservice之前将tableview的状态保存在一个共享变量中,在你收到响应后将它设置回tableView,然后调用reload方法。如下所示:

SharedView.tblView = self.tableView; 
[webservice Call];

After Response:
 self.tableView = SharedView.tblView;
[self.tableView reloadData];

希望这可以帮助。

于 2012-12-21T08:21:33.100 回答
0

一切看起来都很好,这让我相信你没有从你期望的 web 服务中得到结果。

一件小事首先不是你的问题。如果结果实际上是一个数组并且其中有一个对象,则不需要分配新的 EDVDocument。

EDVDocument *docObj = [result objectAtIndex:i];

您可以记录 (id)value 参数以查看我们正在处理的内容吗?

NSLog(@"%@", value);

如果 value 不是一个数组,演员不会抱怨,它只会通过不工作来工作。但是,如果它是一个数组,您可能会在将您的属性(我不知道它是如何声明的)分配给本地数组时遇到麻烦。您可以使用以下函数使用临时数组的元素创建一个新数组;

self.myDocList = [[NSArray alloc] initWithArray:documentList];
[docTable reloadData];

我希望这有帮助。

于 2012-08-21T01:58:34.023 回答