-1

我不知道为什么这如此困难,但我无法让它发挥作用。这是我的简单问题:

我有一个UIViewController调用解析类类型的NSObject类来执行解析工作。

我只需要将解析后的数据值返回到那个ViewController.

任何人都可以为我提供一个简单的步骤或任何建议来做到这一点......我真的需要为我的项目解决这个问题,并且截止日期即将到来......

谢谢 这是我的代码:

视图控制器.m

@implementation ViewController
- (void)viewDidLoad
{
    [super viewDidLoad];
    wsClass *ws = [[wsClass alloc] init];
    [ws initParsing];
}

wsClass.h

@interface ProjListClass : NSObject

@property(nonatomic,strong) NSString * PROJECT_ID;
@property(nonatomic,strong) NSString * SHORT_DESCR;
@property(nonatomic,strong) NSString * LOCATION;
@end;

@interface wsClass : NSObject <NSXMLParserDelegate>{
ProjListClass *proj_obj;
ProjListClass *prj;

NSMutableData* webData;
NSMutableString *soapResults;
NSURLConnection *conn;

NSXMLParser *xmlParser;

}
@property(nonatomic,strong) NSMutableArray * arrHouses;
@property(nonatomic, strong)     NSXMLParser *xmlParser;

-(void) initParsing;
@end

wsClass.m

#import "wsClass.h"

@implementation ProjListClass
@synthesize PROJECT_ID, SHORT_DESCR, LOCATION;
@end

@implementation wsClass

@synthesize arrHouses, xmlParser;

-(void) initParsing{
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

    soapResults = [[NSMutableString alloc] init];
    arrHouses=[[NSMutableArray alloc]init];

    NSString *soapMessage = [NSString stringWithFormat:
                         @"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
                         "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n"
                         "<soap:Body>\n"
                         "<Projects_List xmlns=\"http://tempuri.org/\"/>\n"
                         "</soap:Body>\n"
                         "</soap:Envelope>\n"];
   NSURL *url = [NSURL URLWithString:@"http://192.168.0.10:8056/WServices.asmx"];
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url];
NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMessage length]];

[theRequest addValue: @"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[theRequest addValue: @"http://tempuri.org/Projects_List" forHTTPHeaderField:@"SOAPAction"];
[theRequest addValue: msgLength forHTTPHeaderField:@"Content-Length"];
[theRequest setHTTPMethod:@"POST"];
[theRequest setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]];

conn = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if( conn )
{
    webData = [NSMutableData data];
}
else
{
    NSLog(@"theConnection is NULL");
}   
}
....
....
....
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
   NSString *theXML = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding];
    if (xmlParser)
  {
    xmlParser=nil;
  }
  xmlParser = [[NSXMLParser alloc] initWithData: webData];
  [xmlParser setDelegate: self];
  [xmlParser setShouldResolveExternalEntities:YES];
  [xmlParser parse];
 }

 ....
 ....
 ....
 -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
 namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
.....
.....
.....
 else if([elementName isEqualToString:@"ProjectsListDetails"])
{
    [arrHouses addObject:proj_obj];
    proj_obj=nil;
}

soapResults = nil;
soapResults = [[NSMutableString alloc]init];
}
4

2 回答 2

1

见下文步骤会给你一些想法

1)在您的 NSOBject 类中说ParsingModel类,在您进行解析的解析类中创建协议。随便取名字。

   @protocol  WebServiceResponseDelegate <NSObject>

   @optional
  - (void)didRecieveResponseData:(NSMutableArray*)array;

  @end

像这样将此协议实现到解析类 @protocol WebServiceResponseDelegate;

在解析类中创建属性,以便可以设置Delegate从确认类..

      @property   (nonatomic, assign) id<WebServiceResponseDelegate>delegate;

并且只需将解析的数据发送到确认类,即从您创建解析对象的位置

   //say didRecieveResponse this is the method called when you completed parsing of data

 // - (void)didRecieveResponse
  // {   
  //  if([delegate respondsToSelector:@selector(didRecieveResponseData)])
 //    {
  //    //pass populated dataSource which would have the Parsed Data.

  //    [delegate didRecieveResponseData:parsedData];
 //    //  parsedData is the NUMtableArray or any other DataSource.

  //}

编辑:见下文是delegate您成功完成配对时调用的方法

  - (void)parserDidEndDocument:(NSXMLParser *)parser{
    //pass populated dataSource which would have the Parsed Data.  

    //before check whether that delegate method confirmed by the class.

    if([delegate respondsToSelector:@selector(didRecieveResponseData)])
     {
       [delegate didRecieveResponseData:parsedData];
     }

   //  parsedData is the NUMtableArray or any other DataSource.

   }
  // called when the parser has completed parsing. If this is encountered, the parse was successful.you need to call

2)并在确认类中,如您所说UIViewController,在您采用该协议DataViewController 中定义该委托方法,如下所示DataViewController.hDataViewController<WebServiceResponse>

Delegate从您创建解析模型类的位置开始设置,如下所示

  ParsingModel * paring = [ParsingModel alloc]init];
  [paring setWebServiceResponseDelegate:self];

 //definition of callback delegate method
 - (void)didRecieveResponseData:(NSMutableArray*)array
 {
 //here you would have the Parsed Data now you can use it as you want

 }

我希望一切都清楚。

于 2013-05-03T12:34:33.843 回答
0

您可以在 NSObject 类中创建一个协议,在所有解析操作完成后触发它,并将您的视图控制器设置为委托。

于 2013-05-03T12:09:27.417 回答