在我的应用程序中,我有一个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];
}