2010-11-25 14 views
1

データを取得してテーブルビューをポピュレートするための接続を実行するメソッドがあります。 このメソッドは素晴らしい動作します。 は、今私はiphone nsurlconnect、テーブルビューとアクティビティインジケータ

[NSThread detachNewThreadSelector:@selector(connTre) 
toTarget:self 
withObject:nil];  

でのviewDidLoadで、このメソッドを起動するよ、私は、この他の関数を作成しました:

- (void)initSpinner { 
av = [[[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(195.0, 8.0, 30.0, 30.0) ] autorelease];  
av.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge; 
[av hidesWhenStopped]; 
[self.view addSubview:av]; 
} 

(私はのviewDidLoadでこのinitialiteました)

- (void)spinBegin { 
    [av startAnimating]; 
} 

- (void)spinEnd { 
[av stopAnimating]; 
} 

さんを私のactivityindicatorviewを開始して停止するには良い場所ですか?

私は

[self performSelectorOnMainThread:@selector(spinBegin) 
withObject:nil 
waitUntilDone:false]; 

を開始しようとしました。ここのテーブルデータソースのための私はかなりの標準的なコードです:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
return [listaOggetti count]; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
NSDictionary *dictionary = [listaOggetti objectAtIndex:section]; 
NSArray *array = [dictionary objectForKey:@"Elementi"]; 
return [array count]; 

} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
return 30; 
} 

-(UITableViewCell *)tableView:(UITableView *)tableView 
cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"Cell"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault  
reuseIdentifier:CellIdentifier] autorelease]; 
    cell.selectionStyle = UITableViewCellStyleValue1 ; 
} 
NSInteger sectionRows = [tableView numberOfRowsInSection:[indexPath section]]; 
NSInteger row = [indexPath row]; 

// Configure the cell. 

NSDictionary *dictionary = [listaOggetti objectAtIndex:indexPath.section]; 
NSArray *array = [dictionary objectForKey:@"Elementi"]; 
NSString *cellValue = [array objectAtIndex:indexPath.row]; 

if (row == 0){ 
    cell.textLabel.text = cellValue; 
    cell.textAlignment = UITextAlignmentCenter; 
    cell.backgroundColor = [UIColor redColor]; 
    cell.font = [UIFont systemFontOfSize:13]; 
    cell.selectionStyle = UITableViewCellStyleValue1 ; 
} else { 


cell.textLabel.text = cellValue; 
cell.textAlignment = UITextAlignmentCenter; 
cell.backgroundColor = [UIColor whiteColor]; 
cell.selectionStyle = UITableViewCellStyleValue1 ; 
} 

return cell; 
} 

これは私のデータを取得するための方法である:

- (void)connTre { 
NSThread *spinThread=[[NSThread alloc] initWithTarget:self 
selector:@selector(startSpinning) object:nil]; 
[spinThread start]; 

NSError *error; 
NSURLResponse *response; 
NSData *dataReply; 

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: [NSURL URLWithString: @"myloginurl"]]; 

[request setHTTPMethod: @"GET"]; 
dataReply = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
//message tre soglie ok 
path = @"my_url_for_getting_data"; 
url = [NSURL URLWithString:path]; 
NSError *errors; 
htmlString = [NSString stringWithContentsOfURL:url encoding:NSASCIIStringEncoding error:&errors]; 

NSString *regexString = @"(?:\r\n|[\n\v\f\r\302\205\\p{Zl}\\p{Zp}])"; 
NSString *reg2 [email protected]".+class=\"dettaglioSoglie.*"; 
NSString *reg3 [email protected]"</table>"; 
NSString*[email protected]"<td><b>(.+)&nbsp;</b></td><td>(.+)&nbsp;&nbsp;</td><td>(.+)&nbsp;&nbsp;</td><td>(.+)&nbsp;&nbsp;</td>"; 
NSString *replaceWithString = @"$1"; 
NSString *replaceWithString1 = @"Effettuato $2"; 
NSString *replaceWithString2 = @"Rimanente $3"; 
NSString *replaceWithString3 = @"Totale $4"; 
if(htmlString){ 
    NSArray *linesArray = [htmlString componentsSeparatedByRegex:regexString]; 
    for(NSString *lineString in linesArray) { 
     if(lineString ==[lineString stringByMatching:reg2]) { print = YES;} 
     if (print == YES) { 
      if(lineString ==[lineString stringByMatching:reg4]) { 
       replace = [lineString stringByReplacingOccurrencesOfRegex:reg4 withString:replaceWithString]; 
       replace1 = [lineString stringByReplacingOccurrencesOfRegex:reg4 withString:replaceWithString1]; 
       replace2 = [lineString stringByReplacingOccurrencesOfRegex:reg4 withString:replaceWithString2]; 
       replace3 = [lineString stringByReplacingOccurrencesOfRegex:reg4 withString:replaceWithString3]; 
//NSLog(@"%@\n%@\n%@\n%@\n",replace, replace1, replace2, replace3); 
//sectionz = [NSMutableArray arrayWithObjects: replace, nil]; 
       //NSMutableArray *voice = [NSMutableArray arrayWithObjects: replace, replace1, replace2, replace3, nil]; 
       NSMutableArray *voice = [NSMutableArray arrayWithObjects: replace, replace1, replace2, replace3, nil]; 
       NSDictionary *detVoice = [NSDictionary dictionaryWithObject:voice forKey:@"Elementi"]; 
       [listaOggetti addObject:detVoice];     
       NSLog(@"%@", listaOggetti); 

} 


//NSLog(@"%@",listaDettaglioOggetti); 
} 
if (lineString ==[lineString stringByMatching:reg3]) { print = NO;} 

} 
} else { 
NSLog(@"Error reading file '%@'", htmlString); 
} 

[av stopAnimating]; 
[spinThread release]; 
} 

これが私の紡績を構成する方法です:

- (void)startSpinning { 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
av = [[[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(195.0, 8.0, 30.0, 30.0) ] autorelease];  
av.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge; 
[av hidesWhenStopped]; 
[self.view addSubview:av]; 
[av startAnimating]; 
[pool release]; 
} 

ジョブは実行されましたが、データはnslogで開始して停止しますが、データは私のテーブルには格納されませんでした(空のテーブルが表示されず、テーブルが表示されません)。 私は私のアニメーションを実行しない場合、私はデータで私の右のテーブルを取得します。 ありがとうございます。

答えて

0

これは正しい方法であるかどうかわかりませんが、これはうまく動作します。

-(void) yourFunctionThatPopulatesTableView 
{ 
    NSThread *spinThread=[[NSThread alloc] initWithTarget:self selector:@selector(startSpinner) object:nil]; 
    [spinThread start]; 

    //Populate TableView 

    //Last Line of he function 
    [av stopAnimating]; 
    [spinThread release]; 
} 

-(void)startSpinner 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    CGRect frame = CGRectMake(195.0, 8.0, 30.0, 30.0); 
    av = [[UIActivityIndicatorView alloc] initWithFrame:frame]; 
    av.activityIndicatorViewStyle=UIActivityIndicatorViewStyleGray; 
    [av hidesWhenStopped]; 
    [self.view addSubview:av]; 
    [av startAnimating]; 
    [pool release]; 
} 

スレッドによって呼び出される関数には、ドキュメントごとにNSAutoReleasePoolが必要です。

+0

あなたの答えに感謝します。私はあなたの方法で試してみました、スピンが始まります、私は私の要求には、私のコンソールで、スピン停止が表示されますが、私はシミュレータ上の私のテーブルが表示されません。 – zebra

+0

ここにTableViewコードを入れてみてください。 – iPrabu

+0

自分のコードをすべて追加しました:D – zebra

関連する問題