Vai al contenuto

TableView


Messaggi raccomandati

Ciao a tutti

ho bisogno di un aiuto, ho creato una tableview in cui ogni cella indica un anno se tocco la cella mi apre una altra view con una descrizione di quell'anno.

Ora ho inserito un search controller  per implementare la ricerca e funziona quasi tutto tranne che se digito  un anno mi apre la view di un altro anno.

Ho  guardato diversi tutorial ma sono uguali al mio

Qualcuno ha avuto problemi simili? come li ha risolti?

 

modifica: ho scoperto che qualsiasi anno io digiti nella searchbar mi apre la view del primo anno elencato nella Tableview

Link al commento
Condividi su altri siti

Perchè la view che apri come dettaglio non viene rimossa , quindi quando passi a questa view un altro anno non viene ricreata, in quanto esiste già. 

Nella view dettaglio:

 - (void)viewWillAppear:(BOOL)animated {

[super viewWillAppear:YES];

//aggiorna

}

Il nostro nome è sritto nella storia B.R.N.

Link al commento
Condividi su altri siti

 

Ho scritto questo:

 

// Override to support editing the table view.
 

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath


{


 //barra ricerca ------------------------------------------------------------------------------------------


 

 if (editingStyle == UITableViewCellEditingStyleDelete) {


 // rimuovo dalla lista originale


 [self rimuoviElemento:[filteredObjects objectAtIndex:indexPath.


 row]];


 // eliminiamo l’oggetto dalla lista


 [filteredObjects removeObjectAtIndex:indexPath.row];


 // eliminiamo la cella dalla tabella


 [tableView deleteRowsAtIndexPaths:[NSArray


 arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];


 }


 }

 

 

 - (void)filterContentForSearchText:(NSString*)searchText


 scope:(NSString*)scope{


 // rimuovi tutti gli elementi dalla lista


 [filteredObjects removeAllObjects];


 // controlliamo se elementi della lista se corrispondono alla serachbar


 NSString *elemento;


 for (elemento in listasbk){


 // eseguiamo il confronto


 NSComparisonResult result = [elemento compare:searchText


 options:NSCaseInsensitiveSearch range:NSMakeRange(0, [searchText length])];


 // controlliamo se corrisponde alla ricerca


 if (result == NSOrderedSame){


 [filteredObjects addObject:elemento];


 }


 }


 }


 - (BOOL)searchDisplayController:(UISearchDisplayController *)controller


 shouldReloadTableForSearchString:(NSString *)searchString{


 [self filterContentForSearchText:searchString scope:


 [[self.searchDisplayController.searchBar scopeButtonTitles]


 objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];


 // Ritorniamo YES per ricaricare la tabella


 return YES;


 }


 


 


 - (void)searchBarCancelButtonClicked:(UISearchBar *)saearchBar {


 [filteredObjects removeAllObjects];


 [filteredObjects addObjectsFromArray:listasbk];


 [self.tableView reloadData];


 }


 //--------------------------------------------------------------------------------


 


 //barra ricerca


 -(void)rimuoviElemento:(NSString *)item{


 for (int i= 0; i<[listasbk count]; i++) {


 NSString * elemento = [listasbk objectAtIndex:i];


 if ([elemento compare:item] == NSOrderedSame) {


 [listasbk removeObjectAtIndex:i];


 


 }


 }


 }


 

 


 

Link al commento
Condividi su altri siti

ok, ma è così perchè c'è un metodo (didSelectRow: atIndexPath) che al touch su una cella ti caricherà una view con (nel tuo caso) i dettagli sull'anno che è stato selezionato dalla table. Questa view viene inizializzata ed allocata solo una volta con l'anno che gli passi. Se torni indietro e selezioni un anno diverso la view non viene ricreata perché esiste già, ma ha ancora la "vecchia" selezione. Per questo nella view con i dettagli dell'anno ti consigliavo di usare il metodo che ti ho suggerito sopra, ma dove io ho scritto //aggiorna, dovrai mettere il codice tu che ti aggiorna i dati, ovvero che prende il nuovo anno selezionato e ripresenta i dati corretti. Se hai dei dubbi su come fare, metti il progetto da qualche parte, da poterlo vedere, e ti do una mano.

Il nostro nome è sritto nella storia B.R.N.

Link al commento
Condividi su altri siti

 

Grazie comunque del tuo aiuto ,dubbi tantissimi,  per il progetto non saprei è un po grande

 

intanto ti invio alcune parti   spero che possa aiutarmi

 

In questo file (UiTableViewController) che ho cosi impostato  ci sono le celle che portano alle viewì:

 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath


{


    //viste diverse ogni cella


    NSInteger section = [indexPath section];


    if (section == 0) {


     }


    NSInteger row = [indexPath row];


    if (row == 0) {


        Trezero *controller = [[Trezero alloc]initWithNibName:@"Trezero" bundle:nil];


        [self.navigationController pushViewController:controller animated:YES];


    }


    else if (row == 1){


        Trequattro *controller = [[Trequattro alloc]initWithNibName:@"Trequattro" bundle:nil];


        [self.navigationController pushViewController:controller animated:YES];


    }

 

 e in questo  (UIViewController) c' è una delle view con i dettagli dell'anno,  ho provato ad inserire quello che mi consigliavi  qui ma non va sicuramente è sbagliato 

(ogni row corrisponde ad una view)

 

 

 

 

@implementation Duediciotto


 


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil


{


    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];


    if (self) {


        // Custom initialization


    }


    return self;


}


 


- (void)viewDidLoad


{


    [super viewDidLoad];


    // Do any additional setup after loading the view from its nib.


    


    


    


    self.navigationItem.title = @"INFO";


    


        /*


    //metodo per creare Label da codice


    Label = [[uILabel alloc]initWithFrame:CGRectMake(30, 52, 265, 70)];


    Label.text = @"< Info >";


    Label.textAlignment = NSTextAlignmentCenter;


    Label.textColor = [uIColor blackColor];


    Label.font = [uIFont fontWithName:@"Noteworthy" size:27];


    Label.backgroundColor = [uIColor colorWithRed:255.0 green:255.0 blue:255.0 alpha:0.0];


    Label.numberOfLines = 2;


    [self.view addSubview:Label];


    */


    


    Labeluno =[[uILabel alloc]initWithFrame:CGRectMake(40, 135, 265, 50)];


    Labeluno.text = @"- year: 2018";


    Labeluno.textAlignment = NSTextAlignmentLeft;


    Labeluno.textColor = [uIColor redColor];


    Labeluno.font = [uIFont fontWithName:@"Noteworthy" size:13];


    Labeluno.backgroundColor = [uIColor colorWithRed:255.0 green:255.0 blue:255.0 alpha:0.0];


    Labeluno.numberOfLines = 1;


    [self.view addSubview:Labeluno];


    


    Labeldue =[[uILabel alloc]initWithFrame:CGRectMake(40, 184, 265, 50)];


    Labeldue.text = @"- place: RUSSIA";


    Labeldue.textAlignment = NSTextAlignmentLeft;


    Labeldue.textColor = [uIColor redColor];


    Labeldue.font = [uIFont fontWithName:@"Noteworthy" size:13];


    Labeldue.backgroundColor = [uIColor colorWithRed:255.0 green:255.0 blue:255.0 alpha:0.0];


    Labeldue.numberOfLines = 1;


    [self.view addSubview:Labeldue];


    


    Labeltre =[[uILabel alloc]initWithFrame:CGRectMake(40, 233, 265, 50)];


    Labeltre.text = @"- winner: ...";


    Labeltre.textAlignment = NSTextAlignmentLeft;


    Labeltre.textColor = [uIColor redColor];


    Labeltre.font = [uIFont fontWithName:@"Noteworthy" size:13];


    Labeltre.backgroundColor = [uIColor colorWithRed:255.0 green:255.0 blue:255.0 alpha:0.0];


    Labeltre.numberOfLines = 1;


    [self.view addSubview:Labeltre];


    


    Labelquattro =[[uILabel alloc]initWithFrame:CGRectMake(40, 267, 265, 80)];


    Labelquattro.text = @"- results: ...";


    Labelquattro.textAlignment = NSTextAlignmentLeft;


    Labelquattro.textColor = [uIColor redColor];


    Labelquattro.font = [uIFont fontWithName:@"Noteworthy" size:13];


    Labelquattro.backgroundColor = [uIColor colorWithRed:255.0 green:255.0 blue:255.0 alpha:0.0];


    Labelquattro.numberOfLines = 2;


    [self.view addSubview:Labelquattro];


}


 


 


- (void)didReceiveMemoryWarning


{


    [super didReceiveMemoryWarning];


    // Dispose of any resources that can be recreated.


}

Link al commento
Condividi su altri siti

ok, quindi se fai touch sulla row = 0 , viene pushato Trezero

 

 

NSInteger row = [indexPath row];


    if (row == 0) {


        Trezero *controller = [[Trezero alloc]initWithNibName:@"Trezero" bundle:nil];


        [self.navigationController pushViewController:controller animated:YES];


    }

 

come è fatto Trezero *controller ? Cosa deve visualizzare ? Cosa contengono le row della tua tabella ? Qual è il dataSource della table ?

Devi passare qualcosa a Trezero ? (risp. si) , cosa ? (risp. l'oggetto dell'array), come ? 

Il nostro nome è sritto nella storia B.R.N.

Link al commento
Condividi su altri siti

 

Trezero  Ã¨ un uiviewController che visualizza 4 Label che mostrano delle info

 

#import "Trezero.h"


 


@interface Trezero ()


 


@end


 


@implementation Trezero


 


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil


{


    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];


    if (self) {


        // Custom initialization


    }


    return self;


}


 


- (void)viewDidLoad


{


    [super viewDidLoad];


    // Do any additional setup after loading the view from its nib.


    self.navigationItem.title = @"INFO";


    


    /*


    //metodo per creare Label da codice


    Label = [[uILabel alloc]initWithFrame:CGRectMake(30, 52, 265, 70)];


    Label.text = @"< Info >";


    Label.textAlignment = NSTextAlignmentCenter;


    Label.textColor = [uIColor blackColor];


    Label.font = [uIFont fontWithName:@"Noteworthy" size:27];


    Label.backgroundColor = [uIColor colorWithRed:255.0 green:255.0 blue:255.0 alpha:0.0];


    Label.numberOfLines = 2;


    [self.view addSubview:Label];


    */


    


    Labeluno =[[UILabel alloc]initWithFrame:CGRectMake(40, 135, 265, 50)];


    Labeluno.text = @"- year: 1930";


    Labeluno.textAlignment = NSTextAlignmentLeft;


    Labeluno.textColor = [UIColor redColor];


    Labeluno.font = [UIFont fontWithName:@"Noteworthy" size:15];


    Labeluno.backgroundColor = [UIColor colorWithRed:255.0 green:255.0 blue:255.0 alpha:0.0];


    Labeluno.numberOfLines = 1;


    [self.view addSubview:Labeluno];


    


    Labeldue =[[UILabel alloc]initWithFrame:CGRectMake(40, 184, 265, 50)];


    Labeldue.text = @"- place: URUGUAY";


    Labeldue.textAlignment = NSTextAlignmentLeft;


    Labeldue.textColor = [UIColor redColor];


    Labeldue.font = [UIFont fontWithName:@"Noteworthy" size:15];


    Labeldue.backgroundColor = [UIColor colorWithRed:255.0 green:255.0 blue:255.0 alpha:0.0];


    Labeldue.numberOfLines = 1;


    [self.view addSubview:Labeldue];


    


    Labeltre =[[UILabel alloc]initWithFrame:CGRectMake(40, 233, 265, 50)];


    Labeltre.text = @"- winner: URUGUAY";


    Labeltre.textAlignment = NSTextAlignmentLeft;


    Labeltre.textColor = [UIColor redColor];


    Labeltre.font = [UIFont fontWithName:@"Noteworthy" size:15];


    Labeltre.backgroundColor = [UIColor colorWithRed:255.0 green:255.0 blue:255.0 alpha:0.0];


    Labeltre.numberOfLines = 1;


    [self.view addSubview:Labeltre];


    


    Labelquattro =[[UILabel alloc]initWithFrame:CGRectMake(40, 267, 265, 80)];


    Labelquattro.text = @"- results: Uruguay - Argentina: 4-2";


    Labelquattro.textAlignment = NSTextAlignmentLeft;


    Labelquattro.textColor = [UIColor redColor];


    Labelquattro.font = [UIFont fontWithName:@"Noteworthy" size:15];


    Labelquattro.backgroundColor = [UIColor colorWithRed:255.0 green:255.0 blue:255.0 alpha:0.0];


    Labelquattro.numberOfLines = 2;


    [self.view addSubview:Labelquattro];


    


}


 


- (void)didReceiveMemoryWarning


{


    [super didReceiveMemoryWarning];


    // Dispose of any resources that can be recreated.


}


 


@end

 

le row contengono le viste 

 a trezero  passo il controller che ho proveduto ad importare se è questo che intendi,

Link al commento
Condividi su altri siti

ma....scusa, non mi torna qualcosa. Mi sembra di intuire che hai dei valori anno, posto, vincitore, risultato. Per me questi sono oggetti myObj. I dati li posso inserire a mano, prendere da un plist o da un db non importa. Metto questi oggetti dentro un'array. Uso questo array come dataSource per una tabella. Diciamo che nella row visualizzo l'anno. Se la seleziono passo (con il push) a una nuovo viewController che avrà il suo nib. A questo viewController passo l'oggetto myObj selezionato attraverso la table, e ne prendo i relativi valori per anno, posto, vincitore e risultato e li do alle label per essere visualizzati. Un viewController solo indipendentemente dal numero di row e da quale di queste seleziono. In questo caso il viewControlller avrà una property myObj *oggetto, e prima di fare il push li imposti il valore corretto viewController.oggetto =..........

 

Nel tuo caso se selezionavo invece della prima riga (row 0) la seconda, ovvero row = 1 tu facevi partire questo:

Trequattro *controller = [[Trequattro alloc]initWithNibName:@"Trequattro" bundle:nil];

che è uguale a Trezero se non per il contenuto della label, e ti fai un viewController con relativo nib per ogni elemento della tabella. Se è così è un'errore di concetto.

Il nostro nome è sritto nella storia B.R.N.

Link al commento
Condividi su altri siti

In effetti é come dici tu e quindi non c' é modo di farla funzionare così come l'ho realizzata?
Per quanto riguarda il myObj sono completamente ignorante al riguardo in quanto è da poco che mi sono avvicinato ad xCode

 

Cosa mi consigli?

 

Riusciresti a spiegarmi come fare questa cosa ?: Metto questi oggetti dentro un'array. Uso questo array come dataSource per una tabella. Diciamo che nella row visualizzo l'anno. Se la seleziono passo (con il push) a una nuovo viewController che avrà il suo nib. A questo viewController passo l'oggetto myObj selezionato attraverso la table, e ne prendo i relativi valori per anno, posto, vincitore e risultato e li do alle label per essere visualizzati. Un viewController solo indipendentemente dal numero di row e da quale di queste seleziono. In questo caso il viewControlller avrà una property myObj *oggetto, e prima di fare il push li imposti il valore corretto viewController.oggetto =..........

 

Grazie comunque

Link al commento
Condividi su altri siti

Ciao, prova a vederla in questo modo. Creiamo un oggetto di nome "evento" (tanto per dare un nome) e supponiamo che questo oggetto ha delle caratteristiche che sono:anno, luogo, vincitore, risultato. I dati possono essere inseriti dall'interno dell'app, oppure possono trovarsi altrove (non ci interessa in questo momento). Immaginiamo di avere alcuni di questi oggetti (evento). Attraverso una tabella vogliamo visualizzare questi dati e toccando una riga della tabella vogliamo che si passi ad una nuova "schermata" che mostra tutte le info per l'evento che è stato toccato. La logica ci suggerisce di inserire questi oggetti all'interno di un array che sarà la sorgente dati per la nostra tabella, e di avere una seconda view (oltre a quella che conterrà la tabella) gestita da un viewController dove visualizzare i dettagli degli eventi.  Quindi facciamo una classe evento:

 

 

evento.h

#import <Foundation/Foundation.h>
@interface RCEvento : NSObject
@property (strong, nonatomic) NSString *anno;
@property (strong, nonatomic) NSString *luogo;
@property (strong, nonatomic) NSString *vincitore;
@property (strong, nonatomic) NSString *finale;
@end

Nel viewController.m importiamo evento e facciamo:

#import "RCViewController.h"
#import "RCEvento.h"

@interface RCViewController ()
@property (nonatomic, strong) NSArray *myArray;
@end

@implementation RCViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    RCEvento *evento1 = [RCEvento new];
    evento1.anno = @"2010";
    evento1.luogo = @"Roma";
    evento1.vincitore = @"Pippo";
    evento1.finale  = @"pippo - pluto";
    
    RCEvento *evento2 = [RCEvento new];
    evento2.anno = @"2011";
    evento2.luogo = @"Torino";
    evento2.vincitore = @"Paperino";
    evento2.finale = @"paperino - pippo";
    
    RCEvento *evento3 = [RCEvento new];
    evento3.anno = @"2013";
    evento3.luogo = @"Milano";
    evento3.vincitore = @"Topolino";
    evento3.finale = @"topolino - paperino";
    
    self.myArray = [NSArray arrayWithObjects:evento1, evento2, evento3, nil];
}

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

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.myArray.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *identifier = @"Cell";
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier];
    }
    RCEvento *evento = self.myArray[indexPath.row];
    cell.textLabel.text = evento.anno;
    cell.detailTextLabel.text = evento.vincitore;
    return cell;
}

@end

 

nel quale creo sul momento 3 oggetti evento (nel viewDidLoad (ovviamente sarebbero da prendere da un plist oppure averli salvati, ma non è il caso di affrontare adesso questo argomento)), e li metto dentro l'array. 

Nel file xib basta aggiungere una tabella e collegarne i relativi dataSource e Delegate (per ora il Delegate non serve ma servirà dopo). Inoltre accertati di aver "detto" a viewController.h di essere conforme a questi 2 protocolli con la dicitura:

#import <UIKit/UIKit.h>

@interface RCViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>

@end

 

...........

Il nostro nome è sritto nella storia B.R.N.

Link al commento
Condividi su altri siti

Mi sono collegato ora al Forum

Ti ringrazio tantissimo ora sono al lavoro ma stasera provo e poi ti faccio sapere

Grazie ancora

Una domanda dove è come hai imparato a sviluppare per xCode?

Personalmente ho preso alcuni libri che spiegano abbastanza bene ma non sono completi

Sai se esistono corsi al riguardo?

Ciao

Link al commento
Condividi su altri siti

i libri sono quasi tutti in inglese, se hai problemi con la lingua sono usciti anche un paio di testi in italiano ben fatti. I corsi li fanno, principalmente sono due i più conosciuti e c'era un discussione a riguardo proprio qui sul forum. Fammi sapere quando sei pronto per la seconda parte, non abbiamo mica finito, anzi.

Il nostro nome è sritto nella storia B.R.N.

Link al commento
Condividi su altri siti

ok, bene. Ora prova aiutandoti con la documentazione che trovi anche in xcode a realizzare il secondo viewController, quello che verrà invocato quando tocchi una cella della tabella (cerca UITableView e i suoi metodi delegati)... Per ogni dubbio, scrivi.....

Il nostro nome è sritto nella storia B.R.N.

Link al commento
Condividi su altri siti

... poi per rendere più corretto il codice bisognerebbe cambiare il tipo di oggetti, nel senso che anno è vero che possiamo usare una stringa di testo, ma trattandosi di un numero sarebbe meglio gestirlo come tale. Tra l'altro i tipi NSNumber vanno benissimo per essere inseriti negli array, oppure possiamo usare NSDate. Poi bisognerebbe togliere la parte del viewDidLoad (perchè i dati li avremo sicuramente archiviati da qualche altra parte) e caricarli solamente. Infine si potrebbe rendere la tabella editabile. Gestiremo anche la situazione in cui la nostra app andrà in background, faremo in modo che sia corretta sia per schemi da 3.5 che da 4", e poi perchè no, anche per iPad. Comunque facciamo una cosa alla volta. Aspetto tue....

Ciao.

Il nostro nome è sritto nella storia B.R.N.

Link al commento
Condividi su altri siti

 

Una domanda prima ma i codice che mi hai postato è normale che non parte nulla  con il simulatore non essendo completo oppure ho fatto un errore?

nel codice da tutto a posto ma quando parte il simulatore esce Thread 1:signal sigabrt

Link al commento
Condividi su altri siti

Nel simulatore funziona, ma devi fare attenzione ai collegamento con i file xib, gli #import e, l'appDelegate. 

Comunque ti suggerisco di scrivere tutto e non fare copi/incolla, che non servirebbe a nulla. Parti da un progetto nuovo (con ARC e senza storyboard) di tipo single view. Crea i file che ti servono, uno che eredita da NSObject, e l'altro (di tipo viewController che te lo ritrovi già dal templare) ma modificalo seguendo l'esempio che ti ho messo sopra.

Il nostro nome è sritto nella storia B.R.N.

Link al commento
Condividi su altri siti

Per aggiungere File->newFile->obiettive C -> subclass of UIViewController e dai un nome. Fagli creare direttamente il file xib e da IB lo incominci a popolare con tre label Anno - Finale - Vicitore e di fianco altre 3. Queste ultime saranno collegate (IBOutlet) nel file .h (o anche nel.m) tipo

@property (weak, nonatomic) IBOutlet UILabel *labelAnno etc...

Sarebbe opportuno inserire il tutto in un UINavigationController

Il nostro nome è sritto nella storia B.R.N.

Link al commento
Condividi su altri siti

 

Ciao, allora un nuovo controller sono riuscito a crearlo ed a popolarlo con le Label, il problema è che non riesco a farlo aprire dalle celle e  la stessa cosa vale per  il UINavigationController non ci capisco niente ( ho provato a cercare in rete ma non riesco)

 

Purtroppo non sono per niente ferrato  al riguardo  e mi dispiace farti perdere del tempo, perciò se vuoi lasciar perdere non preoccuparti.

Grazie comunque dei tuoi consigli  

Link al commento
Condividi su altri siti

Archiviato

Questa discussione è archiviata e chiusa a future risposte.

×
×
  • Crea Nuovo...