2010-09-20 6 views
0

J'utilise le Kal calendar. Pour le code ci-dessous, je fais référence à l'exemple de vacances. Dans cet exemple, l'allocation et l'initialisation de Kal se font dans le applicationDidFinishLaunching dans le AppDelegate. Le protocole UITableViewDelegate (par exemple didSelectRowAtIndexPath) est également positionné dans la classe AppDelegate.Utiliser le calendrier Kal sans effectuer l'initialisation (et ainsi de suite) dans AppDelegate

Le AppDelegate:

#import "HolidayAppDelegate.h" 
#import "HolidaySqliteDataSource.h" 
#import "HolidaysDetailViewController.h" 
## Heading ###import "Kal.h" 

@implementation HolidayAppDelegate 

@synthesize window; 

- (void)applicationDidFinishLaunching:(UIApplication *)application 
{ 
    kal = [[KalViewController alloc] init]; 

    kal.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Today" style:UIBarButtonItemStyleBordered target:self action:@selector(showAndSelectToday)] autorelease]; 
    kal.delegate = self; 
    dataSource = [[HolidaySqliteDataSource alloc] init]; 
    kal.dataSource = dataSource; 

    // Setup the navigation stack and display it. 
    navController = [[UINavigationController alloc] initWithRootViewController:kal]; 
    [window addSubview:navController.view]; 
    [window makeKeyAndVisible]; 
} 

// Action handler for the navigation bar's right bar button item. 
- (void)showAndSelectToday 
{ 
    [kal showAndSelectDate:[NSDate date]]; 
} 

#pragma mark UITableViewDelegate protocol conformance 

// Display a details screen for the selected holiday/row. 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    Holiday *holiday = [dataSource holidayAtIndexPath:indexPath]; 
    HolidaysDetailViewController *vc = [[[HolidaysDetailViewController alloc] initWithHoliday:holiday] autorelease]; 
    [navController pushViewController:vc animated:YES]; 
} 

#pragma mark - 

- (void)dealloc 
{ 
    [kal release]; 
    [dataSource release]; 
    [window release]; 
    [navController release]; 
    [super dealloc]; 
} 

@end 

Je ne veux pas mettre cela dans le AppDelegate, car il pourrait y avoir un code de chevauchement avec d'autres vues. Ce devrait être un "composant" séparé que je peux appeler et mettre sur la pile. Dans mon projet de navigation j'ai une vue principale, le RootViewController. De là, je veux pousser la vue Kal sur la pile. Actuellement, je pousse un ViewController supplémentaire sur la pile. Dans la méthode viewWillAppear à partir de ce ViewController je fais les choses montrées dans le code ci-dessus. apparaissent les problèmes suivants:

  • Navigation a de nouveau à faire deux fois (une fois pour le calendrier Kal, un pour moi créé)
  • Navigation à mon point de vue principal ne peut plus

En ce moment je ne sais pas où mettre ce code. La question est donc de savoir où placer les méthodes d'allocation/initialisation ainsi que les méthodes pour le protocole UITableViewDelegate.

Solution:

if (kal == nil) { 
    kal = [[KalViewController alloc] init]; 
    kal.navigationItem.title = NSLocalizedString(@"Timetable",@""); 
    kal.delegate = self; 
    self.dataSource = [[[MyDataSource alloc] init] autorelease]; 
    kal.dataSource = dataSource; 
} 
[[self navigationController] pushViewController:kal animated:YES]; 

Répondre

0

je l'ai fait l'initialisation dans mon RootViewController. Ce n'est pas la meilleure solution, mais je n'en ai pas trouvé une autre.

0

Suggère de lire l'exemple SimpleEKDemo d'Apple.

+0

Quelle est la ligne de fond? – testing

+0

Il doit être porté vers un autre contrôleur autre que AppDelegate en suivant la logique de l'exemple. Pour l'application iPhone, le portage vers RootViewController est bon. Pour l'application iPad avec UISplitViewController, il peut être porté sur masterViewController ou sur DetailViewController. Acclamation. – RoIT

Questions connexes