1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Ajuda Objective-C

Discussão em 'Programação' iniciada por john_5414, 5 de Fevereiro de 2013. (Respostas: 16; Visualizações: 1467)

  1. john_5414

    john_5414 Power Member

    Boas.

    Ando a ler um livro para aprender a programar para iOS, neste momento estou a fazer a segunda aplicação(aplicação de listas) mediante o livro e o Xcode diz que tenho um erro na implementação "CGViewController.m". A app é sobre uma lista de cidades onde o utilizador pode adicionar mais cidades e retirar as que já existem no inicio, e em cada uma ter uma imagem e uma pequena discrição da cidade em si.

    O meu código está assim:


    #import "CGViewController.h"
    #import "CGAppDelegate.h"
    #import "City.h"
    #import "CityController.h"


    @interface CGViewController ()


    @end


    @implementation CGViewController


    - (void)viewDidLoad
    {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.navigationItem.rightBarButtonItem = self.editButtonItem;
    self.title = @"City Guide";
    CGAppDelegate *delegate =
    (CGAppDelegate *)[[UIApplication sharedApplication] delegate];
    cities = delegate.cities;
    }


    - (void)didReceiveMemoryWarning
    {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
    }


    -(void)setEditing:(BOOL)editing animated:(BOOL) animated { //Tenho erro aqui onde tento criar o botão para edição de cada celula(cidade neste caso)
    [super setEditing:editing animated:animated];
    [tableView setEditing:editing animated:animated]; //Diz que não posso ter tableView
    [tableView reloadData]; //não conhece o método reloadData
    }




    #pragma mark UITableViewDataSource Methods


    - (UITableViewCell *)tableView:(UITableView *)tv
    cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:@"cell"];
    if( nil == cell ) {
    cell = [[[UITableViewCell alloc]
    initWithFrame:CGRectZero reuseIdentifier:@"cell"] autorelease]; //deu um warning a dizer que é depreciativo a utilização do "initWithFrame"
    }
    if (indexPath.row < cities.count ) {
    City *thisCity = [cities objectAtIndex:indexPath.row];
    cell.textLabel.text = thisCity.cityName; }
    else {
    cell.textLabel.text = @"Add New City...";
    cell.textLabel.textColor = [UIColor lightGrayColor];
    cell.editingAccessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
    return cell;


    }
    - (NSInteger)tableView:(UITableView *)tv numberOfRowsInSection:(NSInteger)section {
    NSInteger count = cities.count;
    if(self.editing){
    count = count + 1;
    }

    return count;


    }


    #pragma mark UITableViewDelegate Methods


    - (void)tableView:(UITableView *)tv
    didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    CGAppDelegate *delegate =
    (CGAppDelegate *)[[UIApplication sharedApplication] delegate];

    CityController *city = [[CityController alloc] initWithIndexPath:indexPath];
    [delegate.navController pushViewController:city animated:YES];

    [tv deselectRowAtIndexPath:indexPath animated:YES];
    }


    - (UITableViewCellEditingStyle)tableView:(UITableView *)tv
    editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row < cities.count ) {
    return UITableViewCellEditingStyleDelete;
    }
    else {
    return UITableViewCellEditingStyleInsert;
    }
    }


    @end
     
  2. RRoques

    RRoques Power Member

    Qual é o código do teu header (o ficheiro xxx.h) ?

    Quando utilizares código nos tópicos coloca entre as tags
    Código:
    ....[ /CODE] para ficar mais visivel :
    
    [CODE]
    @property (nonatomic) UITableView * tableView;
    
    Esses bonecos :( ficam ai a matar lol.
     
  3. john_5414

    john_5414 Power Member

    o meu ficheiro header é este

    Código:
    #import <UIKit/UIKit.h>
    
    
    @interface CGViewController : UIViewController <UITableViewDataSource, UITableViewDelegate> {
        
        NSMutableArray *cities;
    }
    @property (weak, nonatomic) IBOutlet UITableView *tableView;
    
    
    @end
    
    
    Não percebo mesmo como é que na implementação não me aceita o tableView, quando tenho o mesmo no ficheiro header...

    Verifiquei ainda se código estava de acordo com o do livro, ou seja, o livro tem algum erro, mas eu não o consigo perceber
     
    Última edição: 6 de Fevereiro de 2013
  4. paulo.correia

    paulo.correia Banido

    Mas qual o erro que te dá?
     
  5. john_5414

    john_5414 Power Member

    Nesta parte da implementação dá me erro (o erro está como comentário no código)

    Código:
    [COLOR=#EDEDED]-(void)setEditing[/COLOR]:([COLOR=#EDEDED]BOOL)editing animated[/COLOR]:([COLOR=#EDEDED]BOOL) animated { //Tenho erro aqui onde tento criar o botão para edição de cada celula(cidade neste caso)[/COLOR]
    [COLOR=#EDEDED][super setEditing:editing animated:animated]; [/COLOR]
    [COLOR=#EDEDED][tableView setEditing:editing animated:animated]; //Diz que não posso ter tableView[/COLOR]
    [COLOR=#EDEDED][tableView reloadData]; //não conhece o método reloadData[/COLOR]
    [COLOR=#EDEDED]}
    
    [/COLOR]
     
  6. paulo.correia

    paulo.correia Banido

    É um palpite, mas falta-te o @property da tableView

    http://www.cocoacast.com/cocoacast/?q=node/103
     
  7. john_5414

    john_5414 Power Member

    no ficheiro header eu tenho o @property da tableView, por isso é que estou a achar estranho
     
  8. paulo.correia

    paulo.correia Banido

    Não viste o link como deve ser pois não?

    Tens o @synthesize iVar; no .m?
     
  9. RRoques

    RRoques Power Member

    Boas,

    Estás em que versao do Xcode ?

    Troca o tableView por _tableView. Se não funcionar coloca o no inicio do ficheiro (a seguir ao @implement) @synthesize tableView;
     
  10. paulo.correia

    paulo.correia Banido

    A versão do XCode não tem nada a ver com o problema dele. E trocar o tableView por _tableView também não vai resolver... O problema, como está no link que indiquei ao op, é faltar o @synthesize........
     
  11. john_5414

    john_5414 Power Member

    Obrigado pela ajuda, já não me dá aquele erro :).

    Achei estranho foi o livro não ter referencia a ter que fazer o @synthetize.

    Bem, depois de este resolvido que no mesmo .m dá me um erro nesta parte do código

    Código:
    
    
    - (UITableViewCell *)tableView:(UITableView *)tv
        cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        
        UITableViewCell *cell =
        [tv dequeueReusableCellWithIdentifier:@"cell"];
        if( nil == cell ) {
            cell = [[[UITableViewCell alloc]
                initWithFrame:CGRectZero reuseIdentifier:@"cell"] autorelease]; //Erro de não poder utilizar o auto-release, que não está disponivel para utilização, e que o ARC proibe a mensagem de utilização de autorelease
        }
        if (indexPath.row < cities.count ) {
            City *thisCity = [cities objectAtIndex:indexPath.row];
            cell.textLabel.text = thisCity.cityName; }
        else {
                cell.textLabel.text = @"Add New City...";
                cell.textLabel.textColor = [UIColor lightGrayColor];
                cell.editingAccessoryType = UITableViewCellAccessoryDisclosureIndicator;
            }
        return cell;
    
    
    }
    
    
    Não percebo porque é que dá erro, se esta parte do código está igual à do livro
     
  12. RRoques

    RRoques Power Member

    Se não percebes do assunto pelo menos faz uma pesquisa no google sobre os asuntos.. A versão do Xcode interessa, isto porque a partir do Xcode 4.4 o @synthesize é feito de forma automática pelo Xcode e nesse caso o erro seria provocado pelo nome do tableView (o auto-synthesize coloca o _ antes do nome das variáveis). Podes ler sobre o assunto aqui : http://useyourloaf.com/blog/2012/08/01/property-synthesis-with-xcode-4-dot-4.html ou no próprio site da Apple Developer em developer.apple.com (Caso tenhas conta).
     
  13. RRoques

    RRoques Power Member

    Esse erro é bastante descritivo, basta removeres o autorelease e as chaves e fica a funcionar.
    Quando criaste o projecto deves ter selecionado o ARC, ou seja, não tens que te preocupar (tanto) com a gestão da memória como era realizado antes do ARC. Com o ARC nao podes utilizar comando como o release, o autorelease entre outras.

    Não te limites ao livro, tenta descobrir por ti próprio senão só a copiares o código não compreendes o que fazes.
     
  14. john_5414

    john_5414 Power Member

    Eu quando comecei as aplicações, antes fiz o download da ultima versão do Xcode.

    Sim, seleccionei o ARC...não sabia que não precisava do autorelease, achei estranho foi no livro dizerem para seleccionar o ARC e depois mais abaixo meterem o autorelease:confused:

    Eu depois deste livro ainda tenho uns tutoriais do site lynda e também tenho todas as aulas de Stanford na iTunes U para ver, penso começar a ver estas aulas na próxima semana.

    O que é que aconselhas para evoluir melhor? Já me disseram que o melhor era mesmo seguir as aulas de Stanford.

    É que gostava de aprender a fazer aplicações para iOS e visto que na Faculdade onde estou não existe nenhuma cadeira em que se aprenda a programar para Objective-C pensei em aprender com livros e aulas.
     
  15. RRoques

    RRoques Power Member

    Ya, o livro é bom para começares, mas não te limites a copiar tenta encontrar um problema e criar a solução por ti mesmo, é mais facil e isso força-te a pensar no assunto de outra força.

    Eu tambem já vi as aulas de Stanford e são muitos boas mesmo, já vi de 2 anos lectivos e estão mesmo bue acessiveis para quem está a começar. Acho que podes sempre compensar o livro com uns videos de Stanford.

    Mas tenta criar uma ideia que aches fixe e faz o projecto por ti mesmo, aprendes bue mais rápido.

    Já agora qual é que é o livro que estás a seguir?
     
  16. john_5414

    john_5414 Power Member

    Estou a ler este livro "Learning iOS Programming (2nd Edition)" e de vez em quando vejo videos tutoriais do site lynda.com .
     
  17. RRoques

    RRoques Power Member

    Ok, mas se tens conta no site lynda.com aproveita, os videos normalmente estão actualizados e tem várias "classes" para iniciantes.
    Mas não te esqueças, podes ler muito sobre obj-c, ver muitos videos sobre obj-c mas enquanto não começares a utilizar a sério o obj-c nunca vais entender a linguagem na totalidade ;).
     

Partilhar esta Página