Приложение для iPhone Проблема с видом на класс - PullRequest
0 голосов
/ 07 августа 2011

В моем приложении у меня есть nib-файл (вид A), содержащий несколько текстовых полей.Перед датой textField я поместил нажатие кнопки, которое переходит в вид календаря.Я использовал код

-(IBAction)cal:(id)sender
{
    CalendarTestViewController *calander1=[[CalendarTestViewController alloc]initWithNibName:nil bundle:nil];
    [self.navigationController pushViewController:calander1 animated:NO ];
    [calander1 release];
}

Это нормально. Он переводит меня в режим просмотра календаря, и в режиме просмотра календаря я написал код так, что когда кто-то нажимает на дату, он автоматически переходит к предыдущему виду, то есть к виду А.Затем, когда кто-то нажимает кнопку в A, которая открывает вам представление подтверждения (другой класс). Оно сбрасывает все данные в textFields.

Мне было интересно, а не использовать

[self.navigationController pushViewController:calander1 animated:NO ];

, есть ли какой-нибудь другой способ выполнить это поведение.я хочу сохранить свои данные для просмотра с подтверждением.

Это мой календарь. Просмотреть метод мозаики касания.

- (void)calendarView:(KLCalendarView *)calendarView tappedTile:(KLTile *)aTile
{
    // NSLog(@"Date Selected is %@",[aTile date]);

    if (cat==nil) {
        cat=[[FormController alloc]initWithNibName:nil bundle:nil];
        NSString *st=[[NSString alloc] initWithFormat:@"%@",[aTile date]];
        cat.mas=st;

        [self.navigationController pushViewController:cat animated:YES];
        [cat release];

        [self dismissModalViewControllerAnimated:YES];

}
} 

после нажатия в любое время из календаря, я хочу заполнить дату в textField и вернуться кпредыдущее представление Я не хочу помещать это представление календаря в стек навигации.


После некоторых изменений: ниже приведен метод тайла моего файла CalendarTestViewController.m.

- (void)calendarView:(KLCalendarView *)calendarView tappedTile:(KLTile *)aTile
{
    // NSLog(@"Date Selected is %@",[aTile date]);

    if (cat==nil) {
        cat=[[FormController alloc]initWithNibName:nil bundle:nil];
        NSString *st=[[NSString alloc] initWithFormat:@"%@",[aTile date]];
        cat.mas=st;

        //[self.navigationController pushViewController:cat animated:YES];
        //[cat release];

        [self dismissModalViewControllerAnimated:YES];
}
}

FormController.m

- (void)calendarDidSelectDate:(NSDate *)selectedDate
{
    cali.text=mas;
    // set the selectedDate wherever it needs to be...
}


-(IBAction)cal:(id)sender
{
    CalendarTestViewController *calendar1=[[CalendarTestViewController alloc]initWithNibName:nil bundle:nil];

    calendar1.delegate = self;

    [self.navigationController presentModalViewController:calendar1 animated:YES];

}

Я сделал точно так же, как предложенные средства, протоколы и делегаты определены одинаково.ошибка не отображается, но дата не выбрана и не заполнена в label.text в formController

Ответы [ 2 ]

1 голос
/ 07 августа 2011
[self.navigationController presentModalViewController:calander1 animated:YES];

По умолчанию ваш календарь будет отображаться снизу.Если вы хотите, чтобы он постепенно затухал, вы можете установить:

calendar1.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;

или вы можете включить его, установив:

calendar1.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;

Вам необходимо вызвать этот установщик перед представлением контроллера видакстати.Кроме того, представление этого контроллера представления календаря модально означает, что вы должны отменить его модально, а не извлекать его из navigationController.

[self dismissModalViewControllerAnimated:YES];

Редактировать

Чтобы вернуть выбранную дату назадк вашему FormController вам нужно объявить протокол делегата внутри вашего CalendarTestViewController.h

@protocol CalendarTestViewControllerDelegate

- (void)calendarDidSelectDate:(NSDate *)selectedDate;

@end

Это говорит вашему компилятору, что делегату нужно будет реализовать метод с именем calendarDidSelectDate:

Затем вам нужноприсвойте своему CalendarTestViewController свойство делегата, также внутри .h, прямо перед последним @ end

@property (nonatomic, assign) id<CalendarTestViewControllerDelegate> delegate;

Это означает, что у вас есть свойство любого класса (это то, что обозначает id), которое соответствует объявленному вами протоколу CalendarTestViewControllerDelegateвыше, и это свойство называется делегатом.В вашем файле CalendarTestViewController.m прямо под строкой @impelementation вы должны поместить:

@synthetize delegate;

А теперь в вашем FormController.h в строке, которая говорит @interface FormController : UITableViewController, вам нужно добавить <CalendarTestViewControllerDelegate>, который сообщаетКомпилятор этого класса будет соответствовать этому протоколу.Теперь осталось только добавить в метод -(IBAction)cal:(id)sender метод calendar1.delegate = self; и реализовать метод делегата где-нибудь внутри FormController.m

- (void)calendarDidSelectDate:(NSDate *)selectedDate
{
    // set the selectedDate wherever it needs to be...
}

Edit2

Youнужно заменить:

- (void)calendarView:(KLCalendarView *)calendarView tappedTile:(KLTile *)aTile{
// NSLog(@"Date Selected is %@",[aTile date]);

if (cat==nil) {
    cat=[[FormController alloc]initWithNibName:nil bundle:nil];
      NSString *st=[[NSString alloc] initWithFormat:@"%@",[aTile date]];
    cat.mas=st;

  //  [self.navigationController pushViewController:cat animated:YES];
    //[cat release];

    [self dismissModalViewControllerAnimated:YES];

}

на что-то вроде:

- (void)calendarView:(KLCalendarView *)calendarView tappedTile:(KLTile *)aTile
{
    [self.delegate calendarDidSelectDate:[aTile date]];
    [self dismissModalViewControllerAnimated:YES];
}

и:

- (void)calendarDidSelectDate:(NSDate *)selectedDate
{
    cali.text=mas;
    // set the selectedDate wherever it needs to be...
}

на:

- (void)calendarDidSelectDate:(NSDate *)selectedDate
{
    cali.text = [NSString stringWithFormat:@"%@", selectedDate];
}
1 голос
/ 07 августа 2011

Вы можете использовать UIActionSheet для отображения календаря или UIPickerView внутри UIActionSheet. Это займет половину экрана, и вы можете добавить его к виду, используя

[myActionSheet showInView:self.view];

Если вам это не нравится, вы можете просто показать modalViewController и отклонить его после выбора даты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...