2011-08-06 130 views
0

在我的应用程序中,我有一个包含一些textField的nib文件(视图A)。在日期前的textField我已经把按钮按到日历视图。我使用的代码iPhone应用程序类视图问题

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

也就是说fine.It带我到日历视图和日历视图我已经写了代码,这样,当有人点击一个日期会自动移动到以前的观点,即鉴于A.然后,当有人按A中的一个按钮,它会带您确认视图(另一个类)。它清除textField中的所有数据。

我在想,而不是使用

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

} 
} 

从日历按任意时间后,我想填补文本框日返回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]; 

} 

的建议意味着协议和委托定义同样的方式我也做exactily相同。没有显示错误,但日期没有被选择,也没有被填充在formController的label.text中

回答

1
[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... 
} 

EDIT2

你需要更换:

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

我同意你的建议。好吧,它会呈现我的日历视图。但是当我在日历视图中选择我的日期时,我想回到原始视图。所以我应该怎么做在这种方法 – Mann

+0

我已经做了同样的建议,但现在我不能从我的日历视图中选择任何日期。它不允许我只是没有发生任何事情。当我选择日期时,它会自动填充textField数据n消失 – Mann

+0

正如我所说的,当您在日历视图中选择日期时,应该以模态方式解除视图控制器(请参阅上面我的答案中的最后一行代码)。关于填写文本字段...您需要填写您选择日期的前一个视图中的文本字段?你是否实施了某种委托方法或通知,还是你需要帮助? –

1

您可以使用UIActionSheet在UIActionSheet中显示日历视图或UIPickerView。这会占用一半的屏幕,并且可以使用

[myActionSheet showInView:self.view]; 

它添加到视图如果你不喜欢它,你可以只显示modalViewController并关闭它选择一个日期之后。

+0

好吧,我会看这两者的概念,但将它与我的日历以及工作。在日历课上的方法,在处理日期的录音和返回到前一个视图的方法? – Mann

+0

他有日历的自定义视图,所以UIPickerView(或更具体的UIDatePicker)不是一个真正的选项,并且UIActionSheet绝对不是一个选项。呈现该视图控制器模态地听起来像是唯一正确的方式,而不是将其推到导航控制器上。 –