如何使用didSelectedRowAtIndexPath在tableView中重新加载数据并调用其中的方法组 [英] How to reloadData in tableView with didSelectedRowAtIndexPath and call group of methods in it

查看:91
本文介绍了如何使用didSelectedRowAtIndexPath在tableView中重新加载数据并调用其中的方法组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的应用程序中,我正在启动NSURLConnection,解析XML,从此XML初始化数组,并在tableView中显示它。在ViewDidLoad中,我呼吁服务器使用查询参数0,并且它返回给我字符串,在所有转换后有一个tableView 4行 - 标题,当我推送一些这些标题时,所有进程(连接到服务器,解析,数组初始化,)必须重复。在didSelectedRowAtIndexPath中,我必须传输节ID(以便服务器向我发送正确的数据)。我怎么能正确地做到这一点?我在ViewDidLoad中建立连接,我怎么能再次调用它?

In my app I'm starting NSURLConnection, parsing XML, initialize array from this XML, and show it in the tableView. In ViewDidLoad I appeal to the server with a query parameter 0 , and it's returned for me string, after all conversion a have in tableView 4 rows - titles, and when i push on some of this titles, all process (connection to the server, parsing, arrays initialising, ) must be repeated. In didSelectedRowAtIndexPath I have to transmit section ID (so that the server sent me the correct data). How can I do it correctly? I'm establish connection in ViewDidLoad, how can I call it again?

我的.m文件:

#import "catalogViewController.h"
#import "XMLReader.h"
@interface catalogViewController () 
@end 


@implementation catalogViewController 

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

//-=-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-CONNECTIONS METHOD START-=-=-=-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
[_receivedData setLength:0];
}

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

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
[connection release]; 
[_receivedData release];
 NSString *errorString = [[NSString alloc] initWithFormat:@"Connection failed! Error - %@ %@ %@", [error localizedDescription], [error description], [[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]]; NSLog(@"%@",errorString);
[errorString release];
}

//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-GET FULL DATA HERE-=-=-=-=-=-=-=-=--=-=-=-=-=-=- 
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
 NSString *dataString = [[NSString alloc] initWithData:_receivedData encoding:NSUTF8StringEncoding]; 

//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-XMLPARSER PART START-=-=-=-=-=-=-=-=-=-=-=-=-=-=- //
NSString *testXMLString = [NSString stringWithContentsOfURL:myURL usedEncoding:nil error:nil];

// -=-=-=-=-=-=-=-=-=-=Parse the XML into a dictionary-=-=-=-=-=-=-=-=-=-=
NSError *parseError = nil; 
_xmlDictionary = [XMLReader dictionaryForXMLString:testXMLString error:&parseError];
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-XMLPARSER PART END-=-=-=-=-=-=-=
_titleArr = [[NSArray alloc] initWithArray:[[[_xmlDictionary objectForKey:@"result"] objectForKey:@"name"] valueForKey:@"text"]];
_IDArr = [[NSArray alloc] [[[_xmlDictionary objectForKey:@"result"] objectForKey:@"id"] valueForKey:@"text"]];
_priceArr= [[NSArray alloc][[[_xmlDictionary objectForKey:@"result"] objectForKey:@"price"] valueForKey:@"text"]]; 
_ImageURLArr=[[NSArray alloc][[[_xmlDictionary objectForKey:@"result"] objectForKey:@"img"] valueForKey:@"text"]]; 

 [connection release];
[_receivedData release];
[dataString release]; 

_didDataLoaded=TRUE;

[_myTableView reloadData]; // IBOutlet property 
[self.tableView reloadData]; //default

} 

//-=-=-=-=-=-=-=-=-=-=-Connection methods END-=-=-=-=-=-=-=-=-=-
- (void)viewDidLoad {
[super viewDidLoad]; 

_didDataLoaded=FALSE; 

//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-XMLPARSER PART START-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//-=-==-=-=-=-=-=-=-=-=-=-=--=-=START Shit with connection-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=
 NSString* params = @"request_params";
 NSURL* url = [NSURL URLWithString:@"my URL"];
 NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15.0];
[request addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; 
request.HTTPMethod = @"POST";
request.HTTPBody = [params dataUsingEncoding:NSUTF8StringEncoding]; 
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

if (connection) {
NSLog(@"Connecting...");
_receivedData = [[NSMutableData data] retain]; 
} else {
NSLog(@"Connecting error"); 
}
} 

//-=-==-=-=--=-==-=-=-=-=-=--=-==---=-=--==-=-=-=-=-TableView methods-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=--=-=-=-=-=-=-=
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (_didDataLoaded == FALSE) {
return 1;
} 
else return self.titleArr.count; 
} 

-(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView { return 1; }

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"creatures"]; 
UIImage *creatureImage = nil; 

if (_didDataLoaded == FALSE) {
cell.textLabel.text=@"Downloading...";
cell.detailTextLabel.text= @"downloading...";
} else {
 cell.textLabel.text = [self.titleArr objectAtIndex:indexPath.row]; 
cell.detailTextLabel.text= _IDArr[indexPath.row]; 
NSString *img = self.ImageURLArr[indexPath.row];
creatureImage =[[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:img]]]; cell.imageView.image = creatureImage; 
} 
return cell; 
}

 @end 


推荐答案

您可以将相关代码从viewDidLoad移动到特定方法,例如:

You can move the relevant code from viewDidLoad to a specific method, something like:

- (void)loadXMLData {
    // Initiate your loading/parsing 
}

在viewDidLoad中只需调用此方法:

In viewDidLoad just call this method:

- (void)viewDidLoad {
    [super viewDidLoad];
    [self loadXMLData];
}

这样你可以多次调用[self loadXMLData]。

This way you can call [self loadXMLData] multiple times.

但是......小心从UITableViewDelegate方法实现中调用[tableView reloadData],因为这将导致tableview调用(至少某些)委托方法,这可以导致递归循环或其他奇怪的行为。

However... be careful with calling [tableView reloadData] from inside a UITableViewDelegate method implementation, as this will cause the tableview to call (at least some of the) delegate methods, which can cause recursive loops or other odd behaviour.

这篇关于如何使用didSelectedRowAtIndexPath在tableView中重新加载数据并调用其中的方法组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆