quinta-feira, abril 28, 2011

Convert NSString to DateTime

Para converter uma string em data basta passar o formato da data a ser convertida. No exemplo um formato de data padrão BR. Se caso mudar o formato de entrada não esqueça de mudar o formatador da data.

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"dd/MM/yyyy"];
NSDate *mydate = [dateFormat dateFromString:@"01/12/2010"];


segunda-feira, abril 25, 2011

WCF + Objective-C

Depois de muito tentar e procurar uma alternativa para fazer a conexão de um serviço WCF com minha aplicação, finalmente achei uma solução.

Bom primeiro devemos adicionar as variaveis no header da classe que irá conter a conexão.


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

NSXMLParser *xmlParser;
BOOL elementFound;


Depois na implementação o método que irá chamar o serviço.

NSString *SOAPEnvelope =
[NSString stringWithFormat:
@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<SOAP-ENV:Envelope \n"
"xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" \n"
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \n" 
"xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\" \n"
"SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" \n"
"xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\"> \n"
"<SOAP-ENV:Body> \n"
"<HelloWorld xmlns=\"http://tempuri.org/\">"
"</HelloWorld> \n"
"</SOAP-ENV:Body> \n"
"</SOAP-ENV:Envelope>"];

//Debug
NSLog(@"SOAP ENVELOPE %@", SOAPEnvelope);

NSURL *url = [NSURL URLWithString:@"http://SERVER/WCFServiceName/ServiceName.svc"];  
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

//Header  
NSString *SOAPEnvelopeLength = [NSString stringWithFormat:@"%d", [SOAPEnvelope length]];  
[request addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];  
[request addValue:@"http://tempuri.org/WCFServiceName/HelloWorld" forHTTPHeaderField:@"SOAPAction"];
[request addValue:SOAPEnvelopeLength forHTTPHeaderField:@"Content-Length"];

//Method & Body
[request setHTTPMethod:@"POST"];  
[request setHTTPBody:[SOAPEnvelope dataUsingEncoding:NSUTF8StringEncoding]];

// Connection
conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];

if (conn) {  
webData = [[NSMutableData data] retain];  
}

E depois adicione os métodos de comunicação com o serviço na mesma classe.

-(void) connection:(NSURLConnection *) connection
didReceiveResponse:(NSURLResponse *) response {
    [webData setLength: 0];
}

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

-(void) connection:(NSURLConnection *) connection
  didFailWithError:(NSError *) error {
    [webData release];
    [connection release];
}

-(void) connectionDidFinishLoading:(NSURLConnection *) connection {
    NSLog(@"DONE. Received Bytes: %d", [webData length]);
    NSString *theXML = [[NSString alloc]
            initWithBytes: [webData mutableBytes]
            length:[webData length]
            encoding:NSUTF8StringEncoding];
    //Debug
    NSLog(@"XML %@",theXML);
    [theXML release];

if (xmlParser) {
        [xmlParser release];
    }
    xmlParser = [[NSXMLParser alloc] initWithData: webData];
    [xmlParser setDelegate:self];
    [xmlParser setShouldResolveExternalEntities:YES];
    [xmlParser parse];
    [connection release];
    [webData release];
}

-(void) parser:(NSXMLParser *) parser
didStartElement:(NSString *) elementName
  namespaceURI:(NSString *) namespaceURI
 qualifiedName:(NSString *) qName
attributes:(NSDictionary *) attributeDict {
//Debug
NSLog(@"%@", elementName);
    if( [elementName isEqualToString:@"HelloWorldResult"]) {
        if (!soapResults) {
            soapResults = [[NSMutableString alloc] init];
        }
        elementFound = YES;
    }
}

-(void)parser:(NSXMLParser *) parser 
foundCharacters:(NSString *)string {
    if (elementFound) {
        [soapResults appendString: string];
    }
}

-(void)parser:(NSXMLParser *)parser
didEndElement:(NSString *)elementName
 namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName {
    NSLog(@"SOAP RESULT %@", soapResults);
    if ([elementName isEqualToString:@"HelloWorldResult"]) {

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Hello"    
            message:soapResults   
            delegate:self  
            cancelButtonTitle:@"OK"
            otherButtonTitles:nil];
        [alert show];
        [alert release];
        [soapResults setString:@""];
        elementFound = FALSE;
    }
}

quinta-feira, abril 07, 2011

Desenvolvimento IPhone sem o uso do Interface Builder

Bom, depois de ver mais de dez vezes os vídeos abaixo, resolvi criar um complemento deles. Senti falta de ter o código final ou em partes para poder a companhar o vídeo, então ae vai minha extensão para o aprendizado. Para ficar mais claro o uso desse complemento sugiro ver os vídeos e acompanhar o código aqui postado conforme a evolução.

O primeiro passo a ser seguido é ver o vídeo abaixo e apenas VER, pois no primeiro é criado uma aplicação do tipo View-Based App e no segundo uma Window-Based App.(tive problemas na primeira vez que vi o 2o video e utilizei o mesmo projeto 'o_o). Então fica a dica, presta atenção no vídeo e depois faz utilizando a Window-Based App.



A segunda parte está dividida em 3 seções, que explicam bem o funcionamento do Obj-C e do IPhone.

Abaixo alguns passos mostrados no vídeo.

apagar o arquivo XIB dentro da pasta resources.

apagar a property Main nib file base name do arquivo projeto-info.plist

adicionar o nome da AppDelegate na main.m

int main(int argc, char *argv[])
{    
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, @"NomeDoProjetoAppDelegate");
    [pool release];
    return retVal;
}

no arquivo da AppDelegate.h, apagar a referencia do IB(Interface Builder) IBOutlet

@property (nonatomic, retain) IBOutlet UIWindow *window;

criar uma instancia da window no arquivo AppDelegate.m

window = [[UIWindow alloc] init];

novamente no AppDelegate.h, criar o controle abaixo

UINavigationController *navController;

adicionar um ViewController ao projeto clicando em Classes>Add>New File...

importar a ViewController na AppDelegate.h e criar uma variavel do tipo ViewController, com isso o código deve estar parecido com o abaixo.




#import
#import "NomeDoProjetoViewController.h"

@interface NomeDoProjetoAppDelegate : NSObject {
    UIWindow *window;
    UINavigationController *navController;
    NomeDoProjetoViewController *vcNomeDoProjeto;
}

@property (nonatomic, retain) UIWindow *window;

@end


criar uma instancia do ViewController inicializar o navController passando a view como parametro e por final adicionar o navController na window, isso tudo no arquivo AppDelegate.m

vcNomeDoProjeto = [[NomeDoProjetoViewController alloc] init];
navController = [[UINavigationController alloc] initWithRootViewController: vcNomeDoProjeto];

re-escrever o metodo INIT da ViewController - nessa parte encerra o vídeo, então o código será re-escrito abaixo junto com o vídeo a seguir.


- (id)init {
if (self = [super init]) {
}
return self;
}




criar uma View na pasta Classes - para isso clique na pasta Add>New File...

importar a View na ViewController.m, com isso o código deve estar parecido com isso:
Note que no meu caso criei a View com o nome MainView!

#import "NomeDoProjetoViewController.h"
#import "mainView.h"

@implementation NomeDoProjetoViewController

- (id)init {
if (self = [super init]) {
mainView *v = [[mainView alloc] initWithFrame:CGRectMake(0, 20, 320, 460)];
self.view = v;
[v release];
}
return self;
}

Nesse ponto termina o processo para desvincular o IB do seu projeto, a partir daqui o vídeo mostra como criar outros componentes e seus funcionamentos. Aconselho ver todos os vídeos para adquirir mais conhecimento da plataforma. Para ver os demais vídeos entre no canal da ToucheMobile no youtube.