Я использую календарь Кал .Для кода, показанного ниже, я имею в виду пример праздника.В этом примере распределение и инициализация Kal выполняется в applicationDidFinishLaunching
в AppDelegate
.Протокол UITableViewDelegate
(например, didSelectRowAtIndexPath
) также расположен в классе AppDelegate
.
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
Я не хочу помещать это вAppDelegate
, потому что может быть некоторый перекрывающийся код с другими представлениями.Это должен быть отдельный «компонент», который я могу вызвать и поместить в стек.
В моем проекте, основанном на навигации, у меня есть главное представление, RootViewController
.Оттуда я хочу поместить представление Kal в стек.В настоящее время я помещаю дополнительный ViewController
в стек.В методе viewWillAppear
из этого ViewController
я делаю вещи, показанные в коде выше.Появляются следующие проблемы:
- Навигация назад должна быть сделана два раза (одна для календаря Kal, другая для моего созданного представления)
- Переход к моему основному представлению больше невозможен
В данный момент я не знаю, куда поместить этот код.Поэтому вопрос в том, куда поместить методы выделения / инициализации, а также методы для протокола UITableViewDelegate
.
Решение:
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];