0

ストーリーボードとJSONを使用してLazyTabelImagesのルーズバージョンを作成しようとしています。メインのTableViewControllerのViewDidLoadで、NSURLConnectionを開始してJSONデータを取得しましたが、接続が完了するまでセルが読み込まれません。LazyTableImagesと同じ動作が必要です。セルは空白として読み込まれますが、情報が入力されます(テーブルデータが再読み込みされます)。LazyTablesはストーリーボードを使用しないため、ストーリーボードを使用しない場合はこれを複製できますが、それはオプションではありません。

私はLazyTableImagesを調べて解決策を見つけようとしましたが、ストーリーボードは(とにかく私にとって)大きな違いを生みます。

セルをブランクとしてロードする簡単な方法はありますか?たとえば、デバイスにインターネットがない場合でも、TableViewを表示したいので、セルにカスタムメッセージを配置します。

コード:

接続を初期化するviewDidLoadの部分...

NSURLRequest *urlrequest = [NSURLRequest requestWithURL:[NSURL URLWithString:serverURL]];
    self.dataConnection = [[NSURLConnection alloc] initWithRequest:urlrequest delegate:self];

    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

connectionDidFinnishLoading..。

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    //ListData below is an array that my data received (JSON) is loaded into. It is then passed to getTableData.
    self.dataConnection = nil;
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [self performSelectorOnMainThread:@selector(getTableData:) withObject:ListData waitUntilDone:YES];
    });
}

getTableData..。

-(void)getTableData:(NSData *)jsonData
{
    NSError *error = nil;
    arrayEntries = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableLeaves error:&error];
    for (int x = 0; x < arrayEntries.count; x++)
    {
        NSMutableDictionary *dic = [arrayEntries objectAtIndex:x];

        //ARecord is a class just like in LazyTableImages that creates objects to keep the icons/data together. The ARecords are loaded into the TableView
        ARecord *arecord = [[ARecord alloc] init];

        NSString *title = [dic objectForKey:@"title"];
        NSString *subt = [dic objectForKey:@"subtitle"];
        NSString *url = [dic objectForKey:@"image_URL"];
        arecord.Icon = nil;
        arecord.URL = url;
        arecord.Name = title;
        arecord.title = subt;

        //this is where I load an array full of the arecord objects.
        [array addObject:arecord];
    }
    [self.tableView reloadData];
}
4

3 に答える 3

1

私はこれを2つのオブジェクトで行います。まず、データを非同期でダウンロードし、完了時にデリゲートに通知するイメージフェッチャークラスがあります。次に、フェッチャーのデリゲートメソッドを実装する画像ビュークラスがあります。だから次のようなもの:

@implementation AsyncImageFetcher
-(id)initWithURL:(NSURL *)aURL andDelegate:(id<SomeProtocol>)aDelegate{

  //...

  NSURLRequest *req = [NSURLRequest requestWithURL:aURL];
  //Note that NSURLConnection retains its delegate until the connection
  //terminates! See comments in MyImageView below.
  [NSURLConnection connectionWithRequest:req delegate:self];

  //...
}

//Implement standard connection delegates here. The important part is:
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{

  // ...

  UIImage *anImage = [self decodeDownloadedDataIntoAnImage];
  if([[self delegate] respondsToSelector:@selector(imageFetcher:didFetchImage:)]){
    [[self delegate] imageFetcher:self didFetchImage:anImage];
  }

  //...
}

@end

次に、デリゲートプロトコルを実装し、フェッチャーを起動するために、サブクラスUIImageViewまたは何か(必要な柔軟性に応じて)を実行します。UIView

@implementation MyImageView

-(id)initWithURL:(NSURL *)aURL andPlaceHolderImage:(UIImage *)aPlaceHolder{

  //...

  [self setImage:aPlaceHolder];

  //Note we don't assign this to an ivar or retain it or anything. 
  //That's ok because the NSURLConnection inside the fetcher actually 
  //retains the fetcher itself. So it will live until the connection 
  //terminates -- which is exactly what we want. Thus we disable 
  //CLANG's noisy warnings.
  #pragma clang diagnostic push
  #pragma clang diagnostic ignored "-Wunused-value"
  [[AsyncImageFetcher alloc] initWithURL:aURL andDelegate:self];
  #pragma clang diagnostic pop

  return self;
}


-(void)imageFetcher:(MCMAsyncImageFetcher *)anImageFetcher didFetchImage:(UIImage *)anImage{
  [self setImage:anImage];
}

@end

特定のケースではMyImageView、セルのimageViewinとしてを設定し-tableView:cellForRowAtIndexPath:、もちろん、プレースホルダーとURLに適切な値を渡します。

于 2013-01-17T03:51:13.100 に答える
1

私は似たようなことをしました。viewDidLoadの場合:データのダウンロード中に表示したい空白行の数に応じて、テーブルデータの配列を[NSNullnull]のいくつかのオブジェクトに設定しました。cellForRowAtIndexPathの場合:[self.arrayOfTableData objectAtIndex:indexPath.row] =[NSNullnull]かどうかを確認します。その場合は「空白」のセルを返し、そうでない場合はセルにARRecrodデータをロードします。次に、URLが完成したら、NSNullの配列をARRecordの配列に置き換えます。

于 2013-01-18T18:23:11.007 に答える
0

私はあなたのコードを見たことがないので、ここで私の提案をします:

- (void)viewDidLoad
{
    [super viewDidLoad];

    dispatch_queue_t queue = dispatch_queue_create(NULL, NULL);
    dispatch_async(queue, ^{

        //add your connection code here
        //parse the json and store the data
        //

        dispatch_async(dispatch_get_main_queue(), ^{

            //here to reload your table view again, 
            //since UI related method should run on main thread.

            [YOUR_TABLEVIEW reloadData];

        });

    });

    [YOUR_TABLEVIEW reloadData];
}

注:ストーリーボードのテーブルビューがコードのテーブルビューに接続されていることを確認してください。それが役に立てば幸い!

于 2013-01-17T03:14:08.850 に答える