0

UITableViewController にデータを表示するために WCF サービスを呼び出しています。.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」の呼び出し後にサービスが呼び出されることです。 'は 0 です。[docTable reloadData]viewWillAppearとサービス ハンドラ、つまり「getDocsByCatIdHandler」に入れました。編集:- これはマスター/ディテール アプリケーションです。「MasterViewController」UITableViewController にデータをロードするために同じコードを使用しましたが、動作します。ユーザーがこのテーブルのセルを選択すると、2 番目のテーブルビューにデータを入力する必要があります。 WCF サービス。2 番目のテーブルビューにデータが表示されていません。

4

2 に答える 2

0

非同期の webService 呼び出しがあるときに、同じ問題に直面していました。プライベート ライブラリを使用して webservice を呼び出していたので、コントロールがライブラリに移動し、応答が返された後、Appdelegate のメソッドがハンドラーとして設定されます。したがって、Web サービスを呼び出す前に 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);

値が配列でない場合、キャストは文句を言わず、機能しないだけで機能します。ただし、それが配列の場合、プロパティをローカル配列に割り当てる際に問題が発生する可能性があります (ただし、どのように宣言されているかはわかりません)。次の関数を使用して、一時配列の要素で新しい配列を作成できます。

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

これが役立つことを願っています。

于 2012-08-21T01:58:34.023 に答える