Ajuda Objective-C

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
 
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.
 
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:
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]
 
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]


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

http://www.cocoacast.com/cocoacast/?q=node/103
 
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;
 
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;

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........
 
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
 
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........

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).
 
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.
 
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).

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

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.

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.
 
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?
 
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 ;).
 
Back
Topo