调用WCF服务后重新加载tableview

时间:2012-08-21 01:34:24

标签: ios5 uitableview xcode4.3 sudzc

我正在调用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;
}

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

2 个答案:

答案 0 :(得分:0)

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

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

EDVDocument *docObj = [result objectAtIndex:i];

您可以记录(id)值参数以查看我们正在使用的内容吗?

NSLog(@"%@", value);

如果值不是一个数组,那么演员不会抱怨,它会因为不工作而起作用。但是,如果它是一个数组,您可能会发现将属性(授予我不知道它的声明方式)分配给本地数组的问题。您可以使用以下函数创建一个包含临时数组元素的新数组;

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

我希望这会有所帮助。

答案 1 :(得分:0)

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

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

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

希望这有助于。