2011-02-01 42 views
0

嘿,我看不出为什么这段代码不工作?我试图将我从web服务返回的数据添加到uitableview中,但是失败了。该表每次显示空白。它似乎不喜欢cellForRowAtIndexPath方法。但老实说,我不确定。我什么也找不到。请帮忙。谢谢!返回的Web服务数据没有填充tableview

#import "RSSTableViewController.h" 


@implementation RSSTableViewController 

- (id)initWithStyle:(UITableViewStyle)style 
{ 
if (self = [super initWithStyle:style]) { 
    songs = [[NSMutableArray alloc] init]; 
} 
return self; 
} 



- (void)loadSongs 
{ 

[songs removeAllObjects]; 
[[self tableView] reloadData]; 

// Construct the web service URL 
NSURL *url =[NSURL URLWithString:@"http://localhost/get_params"]; 

NSURLRequest *request = [NSURLRequest requestWithURL:url 
             cachePolicy:NSURLRequestReloadIgnoringCacheData 
            timeoutInterval:30]; 

if (connectionInProgress) { 
    [connectionInProgress cancel]; 
    [connectionInProgress release]; 
} 

[xmlData release]; 
xmlData = [[NSMutableData alloc] init]; 

connectionInProgress = [[NSURLConnection alloc] initWithRequest:request 
                 delegate:self]; 
} 
- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [self loadSongs]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
[xmlData appendData:data]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
[connection release]; 

NSString *responseString = [[NSString alloc] initWithData:xmlData encoding:NSUTF8StringEncoding]; 

songs = [responseString componentsSeparatedByString:@","]; 

newSongs = [[NSMutableArray alloc] init]; 

for(int i=0; i < [songs count]; i++) { 
    [newSongs addObject:[songs:i]]); 
} 
    [songs autorelease]; 


[[self tableView] reloadData]; 
// 
} 

- (void)connection:(NSURLConnection *)connection 
    didFailWithError:(NSError *)error 
{ 
    [connectionInProgress release]; 
    connectionInProgress = nil; 

    [xmlData release]; 
    xmlData = nil; 

    NSString *errorString = [NSString stringWithFormat:@"Fetch failed: %@", 
         [error localizedDescription]]; 
    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:errorString 
                  delegate:nil 
                cancelButtonTitle:@"OK" 
               destructiveButtonTitle:nil 
                otherButtonTitles:nil]; 
    [actionSheet showInView:[[self view] window]]; 
    [actionSheet autorelease]; 

    [[self tableView] reloadData]; 
} 


- (void)didReceiveMemoryWarning { 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc that aren't in use. 
} 

- (void)viewDidUnload { 
    [super viewDidUnload]; 

} 


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

- (NSInteger)tableView:(UITableView *)tableView 
numberOfRowsInSection:(NSInteger)section 
{ 
    return [newSongs count]; 
} 
- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    UITableViewCell *cell = [tableView  dequeueReusableCellWithIdentifier:@"UITableViewCell"]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] 
       initWithStyle:UITableViewCellStyleDefault 
       reuseIdentifier:@"UITableViewCell"] autorelease]; 
    } 

    [[cell textLabel] setText:[newSongs objectAtIndex:[indexPath row]]]; 



    return cell; 
} 

@end 
+0

为什么不在Web服务之后放置一些日志记录,以便看到返回的内容?对于单个问题,这是太多的代码 - 您需要缩小问题范围。 – 2011-02-01 00:41:37

+0

我做到了。数据按预期填充数组。这发生在connectionDidFinishLoading方法中。之后,uitableview方法不希望将数据添加到tableview。 – toneb 2011-02-01 01:03:03

回答

2

看来你忽略了警告消息,这在Objective-C中是一个不允许的。下面的代码不可能工作:

[newSongs addObject:[songs:i]] 

你大概意思写的是这样的事情是什么:

[newSongs addObject:[songs objectAtIndex:i]] 

但是在做这一切:

newSongs = [[NSMutableArray alloc] init]; 

for(int i=0; i < [songs count]; i++) { 
    [newSongs addObject:[songs:i]]); 
} 

为什么不只是做这个?

newSongs = [songs mutableCopy];