在我的应用程序中,我有一个nib文件(视图A),其中包含一些textFields。在日期textField的前面,我按下了按钮,进入日历视图。我用了代码

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


好的。我进入日历视图,并在日历视图中编写了代码,这样,当有人点击日期时,它将自动移至上一个视图,即视图A。然后当有人按下A中的按钮时,您需要确认view(另一个类)。它将刷新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 n上填写日期,返回上一个视图
我不想将此日历视图放在导航堆栈中。



进行一些更改之后:以下是我的CalendarTestViewController.m文件的Tap Tile方法。

- (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];

}


我所做的与建议的均值协议和委托定义的方式完全相同。未显示错误,但未选择日期且未在formController中填写label.text

最佳答案

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


默认情况下,这将从底部显示日历视图。如果希望它淡入淡出,可以设置:

calendar1.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;


或者您可以通过设置使其翻转:

calendar1.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;


在显示视图控制器btw之前,您需要调用此setter。同样,以模态显示此日历视图控制器意味着您必须以模态关闭它,而不是从navigationController中弹出它。

[self dismissModalViewControllerAnimated:YES];


编辑

要将选定的日期返回给FormController,您需要在CalendarTestViewController.h中声明一个委托协议

@protocol CalendarTestViewControllerDelegate

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

@end


这告诉您的编译器该委托将必须实现名为calendarDidSelectDate的方法:

然后,您需要为您的CalendarTestViewController提供一个委托属性,该属性也位于.h内,就在最后一个@end之前

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


这意味着您具有符合上面声明的CalendarTestViewControllerDelegate协议的任何类的属性(这是id代表的意思),该属性称为委托。在@impelementation行下的CalendarTestViewController.m文件中,您必须输入:

@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...
}


编辑2

您需要更换:

- (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];
}

09-25 16:16