Aiuto sono alle prime armi "Navigation Controller"

di il
6 risposte

Aiuto sono alle prime armi "Navigation Controller"

Ciao a tutti sono nuovo nel forum,
sono alle prime armi con - Xcode.
Vi spiego il mio problema,
Ho un Navigationcontroller con tre voci:
-Hotel
-Ristoranti
-Spiagge
Quando si preme la voce Hotel carica un Viewcontroller chiamato "HotelsViewController"
dove ho inserito una Table View cell che al suo interno a due label e un immagine,
per ora al interno del Cell ci sono 5 hotel, premendo un qualsiasi hotel
un esempio Hotel1, hotel2 o hotel3 porta a caricare
un ViewController che si chiama "HotelDescrizioneViewController" dove ci sono le descrizioni di ogni hotel, in questa descrizione si trovano sempre due label e un immagine,
che sono nome del Hotel, indirizzo e immagine del hotel.
Fino qui tutto funziona bene, pero volevo aggiungere ad ogni hotel delle voci,
ad esempio email, telefono, web e mappa.

Come devo fare per assegnare ad ogni hotel queste voci naturalmente che funzionino al suo click?

Ho fatto una cosa simile a questo tutoria
http://www.techotopia.com/index.php/Implementing_TableView_Navigation_using_Xcode_Storyboards

Ecco il codice:


#import "HotelsViewController.h"
#import "CellaHotel.h"
#import "HotelsDescrizioneViewController.h"

@interface HotelsViewController ()

@end

@implementation HotelsViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{ 
    [super viewDidLoad];
    
    
    	
   Hotels = [[NSMutableArray alloc] init];
    
    NSDictionary *hotel1 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"napoleon.jpg", @"Napoleon", @"****",@"via del c 33 06000 ", nil]
                                                       forKeys:[NSArray arrayWithObjects:@"imagine",@"nome",@"descrizione",@"indirizo",nil]];
    
    NSDictionary *hotel2 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"mediterranee.jpg",@"Mediterranee",@"***", nil]
                                                       forKeys:[NSArray arrayWithObjects:@"imagine",@"nome",@"descrizione",nil]];
    
    NSDictionary *hotel3 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"Victoria.jpg",@"Victoria",@"**", nil]
                                                       forKeys:[NSArray arrayWithObjects:@"imagine",@"nome",@"descrizione",nil]];
    
    NSDictionary *hotel4 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"riva.jpg",@"Riva",@"***", nil]
                                                       forKeys:[NSArray arrayWithObjects:@"imagine",@"nome",@"descrizione",nil]];
    
        
    
    
    
    [Hotels addObject:hotel1];
    [Hotels addObject:hotel2];
    [Hotels addObject:hotel3];
    [Hotels addObject:hotel4];
    



}





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


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

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


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [Hotels count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{
    
    
    
     CellaHotel *cell = [tableView dequeueReusableCellWithIdentifier:@"CellaHotel"];
    
    
    
    
    NSDictionary *hotel = [Hotels objectAtIndex:indexPath.row];
    
    
    cell.nomehotel.text = [hotel objectForKey:@"nome"];
    cell.descrizionehotel.text = [hotel objectForKey:@"descrizione"];
    cell.imaginehotel.image = [UIImage imageNamed:[hotel objectForKey:@"imagine"]];
    
    
    
    return  cell;
    
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    
    NSDictionary *hotel = [Hotels objectAtIndex:indexPath.row];
    
    
    HotelsDescrizioneViewController *HotelsVC = [self.storyboard instantiateViewControllerWithIdentifier:@"HotelsDescrizioneViewController"];
    [self.navigationController pushViewController:HotelsVC animated:YES];
    [HotelsVC.labelNome setText:[hotel objectForKey:@"nome"]];
    [HotelsVC.indirizo setText:[hotel objectForKey:@"indirizo"]];
    [HotelsVC.imaginehotel setImage:[UIImage imageNamed:[hotel objectForKey:@"imagine"]]];
    
    
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    return 60;
}


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




@end

________________________________________________________________________
Poco tempo fa ho fatto la mia prima app,
nella quale ho creato un viewcontroller chiamato "ContactViewcontroller"
dove avevo inserito una email , telefono etc.
avevo collegato dal "Contactviewcontroller" dello storyboard al file .h un esempio "telefono"
con l'Action
- (IBAction)callPhone:(id)sender;

e poi nel .m
-(IBAction)callPhone:(id)sender {
[[UIApplication sharedApplication] openURL: [NSURL URLWithString:@"tel:+123456789"]];
}
__________________________________________________________________________

Spero che mi sono spiegato bene,
Grazie a tutti

6 Risposte

  • Re: Aiuto sono alle prime armi "Navigation Controller"

    Ciao!
    per prima cosa ti invito a presentarti nell' apposita sezione del forum, se non lo hai già fatto.

    Innanzi tutto io ti consiglio di creare un bell' oggetto Hotel, con i relativi attributi, così lavori con quelli anzichè con i dictionary.

    Partiamo dal presupposto che hai un oggetto hotel con i seguenti parametri:

    nome (NSString)
    descrizione (NSString)
    nStelle (int)
    mail (NSString)
    telefono (NSString)
    coordinate (CLLocationCoordinate2D)

    NSDictionary *hotel1 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"napoleon.jpg", @"Napoleon", @"****",@"via del c 33 06000 ", nil]
                                                           forKeys:[NSArray arrayWithObjects:@"imagine",@"nome",@"descrizione",@"indirizo",nil]];
        
        NSDictionary *hotel2 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"mediterranee.jpg",@"Mediterranee",@"***", nil]
                                                           forKeys:[NSArray arrayWithObjects:@"imagine",@"nome",@"descrizione",nil]];
        
        NSDictionary *hotel3 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"Victoria.jpg",@"Victoria",@"**", nil]
                                                           forKeys:[NSArray arrayWithObjects:@"imagine",@"nome",@"descrizione",nil]];
        
        NSDictionary *hotel4 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"riva.jpg",@"Riva",@"***", nil]
                                                           forKeys:[NSArray arrayWithObjects:@"imagine",@"nome",@"descrizione",nil]];
        
    quando fai sta roba qui, anzichè lavorare di dictionary, andrai ad istanziare un oggetto Hotel e gli andrai a settare i vari attributi sopraelencati, in questo modo:
    
    NSMutableArray *arrayHotels =  [[NSMutableArray alloc] init];
    
    Hotel *h1 = [[Hotel alloc] init];
    h1.nome = "Hotel Letoh"
    h1.descrizione = "L'Hotel Letoh è una Romantica Villa ottocentesca, nel centro di Ortnec, situata in una tranquilla oasi verde, ai piedi di Piazzale Elazzaip";
    h1.nStelle = 4;
    h1.mail = "info@letoh.it";
    h1.telefono = "081 1800818";
    
    CLLocationCordinate2D coords1;
    coords1.latitude = 21,004352;
    coords1.longitude = 47,354962;
    h1.coordinate = coords1;
    
    [arrayHotels addObject:h1];
    
    Così hai aggiunto un oggetto. Ovviamente questo oggetto deve avere i getter e i setter di ogni attributo.

    Nel didSelectRow quando fai questo:
    [HotelsVC.labelNome setText:[hotel objectForKey:@"nome"]];
        [HotelsVC.indirizo setText:[hotel objectForKey:@"indirizo"]];
        [HotelsVC.imaginehotel setImage:[UIImage imageNamed:[hotel objectForKey:@"imagine"]]];
    Vai a settare anche gli altri attributi, sempre però lavorando con l oggetto Hotel, non più con le chiavi del dictionary, ad esempio:
    [HotelsVC.email setText:hotel.mail];
    Naturalmente nel tuo HotelsVC dovrai avere una UILabel che si chiama email.

    Per la mappa studiati l' MKMapView e vedrai come aggiungere delle Annotation fornendogli delle coordinate, appunto quelle che hai in hotel.coordinate.

    Nel didSelectRow farai una cosa del genere:
    Hotel *selectedHotel = [arrayHotels objectAtIndex:indexPath.row];
    [HotelsVC.email setText:selectedHotel.mail];
    Forse sono stato un pò troppo confusionale, in tal caso mi scuso e se hai perplessità provo a rispiegarlo in maniera più umana. Ti premetto però che non ho mai lavorato con gli storyboard, ma non dovrebbe essere un problema.

    Spero di esser stato utile.
    Ciao
  • Re: Aiuto sono alle prime armi "Navigation Controller"

    Ciao dOzer,
    grazie della tua risposta.
    Non sono resuscito a presentarmi perché non ho trovato quella voce,
    mi potresti dire dové così mi presento grazie.

    Proverò subito a fare le modifiche,
    ti faro sapere cosa sono resuscito a fare.

    Grazie della tua spiegazione
    sei stato molto gentile.
    Ciao
  • Re: Aiuto sono alle prime armi "Navigation Controller"

    Sezione Presentazioni

    Figurati. Provaci, se incontri problemi scrivi qui e vediamo come risolvere.

    Buona giornata e buon lavoro
  • Re: Aiuto sono alle prime armi "Navigation Controller"

    Ciao,
    Ho pensato che per ora tengo le tre voci che sono le due label e l'immagine, dopo quando ho risolto questo problema aggiungo il resto delle voci come email, telefono e mappa.
    Nel mio progetto ho creato 3 file:
    -1 Hotels viewController
    -2 CellaHotel
    -3 HoteldDescrizioneViewController


    - 1 Hotels viewController
    file .h
    
    @interface HotelsViewController : UIViewController
    {NSMutableArray *Hotels;}
    file .m sono i codici che ho scritto in precedenza.

    2- CellaHotel
    
    file.h
    @interface CellaHotel : UITableViewCell
    @property (nonatomic, retain) IBOutlet UILabel *nomehotel;
    @property (nonatomic, retain) IBOutlet UILabel *descrizionehotel;
    @property (nonatomic, retain) IBOutlet UIImageView *imaginehotel;
    
    
    fimle.m
    @implementation CellaHotel
    @synthesize nomehotel, descrizionehotel, imaginehotel;

    3-HoteldDescrizioneViewController
    
    @interface HotelsDescrizioneViewController : UIViewController
    @property (weak, nonatomic) IBOutlet UIImageView *imaginehotel;
    @property (weak, nonatomic) IBOutlet UILabel *labelNome;
    @property (weak, nonatomic) IBOutlet UILabel *indirizo;
    
    Adesso ho fatto le modifiche e mi da degli errori ecco il codice:
    
    #import "HotelsViewController.h"
    #import "CellaHotel.h"
    #import "HotelsDescrizioneViewController.h"
    
    @interface HotelsViewController ()
    
    @end
    
    @implementation HotelsViewController
    
    
    
    
    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    {
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self) {
            // Custom initialization
        }
        return self;
    }
    
    - (void)viewDidLoad
    { 
        [super viewDidLoad];
        
           
        NSMutableArray *arrayHotels =  [[NSMutableArray alloc] init];
        
        Hotel *h1 = [[Hotel alloc] init];
        h1.nome = "Hotel Letoh"
        h1.descrizione = "L'Hotel Letoh è una Romantica Villa ottocentesca, nel centro di Ortnec, situata in una tranquilla oasi verde, ai piedi di Piazzale Elazzaip";
        h1.imagine = [NSArray arrayWithObjects:@"napoleon.jpg", nil]
        
        
        [arrayHotels addObject:h1];
    
    }
    
    
    
    
    
    - (void)viewDidUnload
    {
        [super viewDidUnload];
        // Dispose of any resources that can be recreated.
    }
    
    
    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    
    {
        return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
    }
    
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
        return 1;
    }
    
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return [Hotels count];
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    
    {
        
        
        
         CellaHotel *cell = [tableView dequeueReusableCellWithIdentifier:@"CellaHotel"];
        
        
        
        
        NSDictionary *hotel = [Hotels objectAtIndex:indexPath.row];
        
        
        cell.nomehotel.text = [hotel objectForKey:@"nome"];
        cell.descrizionehotel.text = [hotel objectForKey:@"descrizione"];
        cell.imaginehotel.image = [UIImage imageNamed:[hotel objectForKey:@"imagine"]];
        
        
        
        return  cell;
        
    }
    
    
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        
        Hotel *selectedHotel = [arrayHotels objectAtIndex:indexPath.row];
        
        HotelsDescrizioneViewController *HotelsVC = [self.storyboard instantiateViewControllerWithIdentifier:@"HotelsDescrizioneViewController"];
        [self.navigationController pushViewController:HotelsVC animated:YES];
        
        [HotelsVC.labelNome setText:selectedHotel.nome];
        [HotelsVC.indirizo setText:selectedHotel.indirizo];
        [HotelsVC.imaginehotel setImage:[UIImage imageNamed:selectedHotel.imagine];
        
        
        
    }
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
        
        return 60;
    }
    
    
    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    
    
    
    @end
    
    

    ECCO GLI ERRORI:

    NSMutableArray *arrayHotels =  [[NSMutableArray alloc] init];
        
        Hotel *h1 = [[Hotel alloc] init];
        h1.nome = "Hotel Letoh"
        h1.descrizione = "L'Hotel Letoh è una Romantica...";
        h1.nStelle = 4;
        
        
        [arrayHotels addObject:h1];

    __________________________________________________________________________



    E poi:
     Hotel *selectedHotel = [arrayHotels objectAtIndex:indexPath.row];

    ____________________________________________________________________________



    La mia domanda é
    il nome del mio NSMutableArray e (Hotele) - perché mi hai dato il codice con NSMutableArray *arrayHotels?


    Sicuro che mi dimentico qualcosa, senza errori e troppo facile.
    Spero che si capisca.
    Grazie del vostro aiuto
  • Re: Aiuto sono alle prime armi "Navigation Controller"

    Allora il primo problema è che stai facendo confusione tra i tipi che ti occorrono. La tua struttura è la seguente:

    1) HotelListViewController
    2) HotelObject
    3) HotelDetailViewController

    1) L' HotelListViewController sarà il controller che avrà la UITableView con una cella per ogni hotel. Questo controller avrà di sicuro un NSMutableArray che conterrà tutti gli oggetti HotelObject, ognuno dei quali rappresenta un hotel da mostrare nella tabella.

    2) L' HotelObject è un oggetto che andiamo a definire con le informazioni che ci interessano. Qui secondo me fai confusione. Il tuo oggetto avrà gli attributi nome, descrizione, immagine, che (ATTENZIONE!) non sono UILabel ed UIImageView, ma sono i dati che vuoi mostrare. I tipi saranno dunque 3 NSString (Una per il nome, una per la descrizione e una per il nome dell immagine). Poi ovviamente nel tuo controller (e nelle singole celle della UITableView) che avrà le label e l' immagine andrà a prendere i valori che contiene l' HotelObject corrispondente.

    3) HotelDetailViewController sarà composto da un' UIImageView e due UILabel. A questo punto alle UILabel e all' UIImageView andrai a settargli i dati che contiene il tuo HotelObject.

    Fin qui ci sei? Questa è la prima cosa che devi afferrare, altrimenti fai una confusione assurda e non te ne esci più.

    Poi appena ho 2 minuti di calma ti spiego per bene come devi fare questa cosa, ora sto incasinato.
  • Re: Aiuto sono alle prime armi "Navigation Controller"

    Ciao dOzer
    dopo un po di malattia eccomi.
    Si fino qui ci sono.
    Ho riguardato tutto nuovamente,
    possiamo proseguire grazie!!!
Devi accedere o registrarti per scrivere nel forum
6 risposte