2010-11-16 5 views
1

J'ai une application UITabBar, qui a trois onglets. Le premier onglet a un UIViewController avec un UIButton qui affiche un UIViewController modal pour permettre à l'utilisateur de sélectionner une date. Je rencontre des problèmes pour mettre à jour le libellé de l'UIButton lorsque l'utilisateur a sélectionné la date choisie.Comment mettre à jour une étiquette UIButton à partir d'un autre contrôleur de vue

Mon principal Voir contrôleur .h/.m

#import <UIKit/UIKit.h> 

@interface SearchViewController : UIViewController { 
    IBOutlet UIButton *butFromDate; 
} 

@property (nonatomic, retain) UIButton *butFromDate; 

- (IBAction)pickDate:(id)sender; 

@end 

//////////////////////////////////////////// 

#import "SearchViewController.h" 
#import "SearchDatePickerViewController.h" 

@implementation SearchViewController 

@synthesize butFromDate; 

- (IBAction)pickDate:(id)sender{ 
    SearchDatePickerViewController *sampleView = [[[SearchDatePickerViewController alloc] init] autorelease]; 

    [sampleView setModalTransitionStyle:UIModalTransitionStylePartialCurl]; 
    [self presentModalViewController:sampleView animated:YES]; 
} 

- (void)dealloc { 
    [butFromDate release]; 
    [super dealloc]; 
} 

@end 

Ensuite, ma fenêtre modale (avec un UIPicker, et un couple de UIBarButtons pour annuler ou enregistrer le choix de l'utilisateur) .h/.m ressemble à:

#import <UIKit/UIKit.h> 

@interface SearchDatePickerViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource> { 
    NSMutableArray *dates; 
    IBOutlet UIPickerView *picker; 
} 

@property (nonatomic, retain) NSMutableArray *dates; 
@property (nonatomic, retain) UIPickerView *picker; 

- (IBAction)cancelDatePick:(id)sender; 
- (IBAction)pickDate:(id)sender; 

@end 

//////////////////////////////////////////// 

#import "SearchDatePickerViewController.h" 
#import "SearchViewController.h" 
#import "AppDelegate.h" 
#import "Search.h" 

@implementation SearchDatePickerViewController 

@synthesize dates, picker; 

- (IBAction)cancelDatePick:(id)sender{ 
    [self dismissModalViewControllerAnimated:YES]; 
} 

- (IBAction)pickDate:(id)sender{ 
    HolidayCottagesAppDelegate *appDelegate = (HolidayCottagesAppDelegate *)[[UIApplication sharedApplication] delegate]; 
    SearchViewController *searchView = [SearchViewController alloc]; 
    appDelegate.currentSearch.fromDate = [dates objectAtIndex:[picker selectedRowInComponent:0]]; 

    [searchView.butFromDate setTitle:@"HELLO-TEST" forState:UIControlStateNormal]; 
    [self dismissModalViewControllerAnimated:YES]; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSDate* curDate = [NSDate date]; 
    NSCalendar* calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
    NSDateComponents* comps = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:curDate]; 
    NSTimeZone* gmt = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; 
    dates = [[NSMutableArray alloc] init]; 

    [comps setTimeZone:gmt]; 
    [comps setWeekday:7]; 

    int startCount = comps.week + 1; 
    int endCount = (((52 - startCount) + 52) + startCount); 

    for (startCount; startCount <= endCount; startCount++){ 
     NSDate *tDate = [calendar dateFromComponents:comps]; 
     [dates addObject:tDate]; 
     [comps setWeek:startCount]; 
    } 
} 

// OTHER SHIZZLE HERE BUT NOT REALLY NEEDED TO DISPLAY... 

Alors, quand je clique sur le bouton Enregistrer, il court - (void) pickDate: tous ok et rejette le point de vue modal, mais il ne sera pas mettre à jour l'étiquette UIButton de SearchViewController à « BONJOUR-TEST ». Je suis sûr qu'il me manque quelque chose de simple ici ...

S'il vous plaît aidez-moi !!

Merci :)

Répondre

3

Dans votre contrôleur principal de vue, vous devez passer une référence « auto » au contrôleur de vue sélecteur de date de recherche, puis mis en place un Ivar pour le contrôleur principal de la vue dans le sélecteur de date de recherche affichez et utilisez cette référence dans la méthode pickDate de la vue du sélecteur de date de recherche. S'il vous plaît vérifier une entrée de blog de mes depuis l'an dernier sur ce sujet précis:

http://www.dosomethinghere.com/2009/10/04/passing-values-and-messages-between-views-on-iphone/

+0

BP, vous êtes un rebord. J'ai utilisé votre blog pour résoudre ce problème. J'ai déclaré le contrôleur de vue principal à l'intérieur du contrôleur de vue secondaire - comme vous l'avez fait (et modifié mon code pour refléter cela). J'ai ensuite exécuté l'application, mais elle n'a pas mis à jour le texte (ou rien enregistré), j'ai donc revérifié votre code et remarqué que j'ai manqué la référence où vous avez déclaré le contrôleur de vue principal dans la vue secondaire. A fait, et bob est mon frère pères. Salutations :) – a1phanumeric

+0

Vous pouvez toujours cliquer sur la petite coche à côté de ma réponse pour le signaler comme réponse acceptée. ;) –

2

Si vous savez comment implémenter votre méthode de délégué personnalisé, il est très facile. Définissez simplement une méthode de délégation avec le paramètre que vous voulez (il suppose que vous déléguez à l'endroit où vous obtenez des valeurs) dans la vue sélecteur, puis dans votre UIViewController, définissez cette méthode et attribuez la valeur à partir du message de délégation. Si vous voulez un exemple, je peux vous en envoyer.

Questions connexes