2011-08-06 3 views
0

내 응용 프로그램에서 일부 textFields가 포함 된 nib 파일 (보기 A)이 있습니다. 날짜 텍스트 필드 앞에 나는 달력보기에 걸리는 단추 누르기를 넣었습니다. 나는 fine.It이보기를 달력으로 저를 받아 누군가가 날짜를 누를 때 자동으로 그런 경우 이전보기 즉,보기 A.로 이동합니다 있도록 달력보기에 내가 코드를 작성 한 것입니다 코드iPhone 응용 프로그램 클래스보기와 관련된 문제

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

} 
} 

달력에서 모든 시간을 누른 후 나는 텍스트 필드로 날짜를 기입 N 내가 탐색 스택이 달력보기를 넣어 싶지 않는 이전보기 으로 돌아가려면.


일부 변경 사항은 다음과 같습니다. 아래 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]; 

} 

나는 exactily 같은 했어요. 표시되는 오류는 없지만 날짜는 선택되지 않고 formController의 label.text에 채워지지 않습니다.

답변

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

이렇게하면 기본적으로 일정보기가 맨 아래에서 가져옵니다.

calendar1.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; 

또는 당신은 설정하여 플립 수 있습니다 : 당신이 원하는 경우에 설정할 수있는 크로스 페이드

calendar1.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 

당신은 BTW 뷰 컨트롤러를 발표하기 전에이 세터를 호출해야합니다. 또한이 캘린더보기 컨트롤러를 모달로 표시하면 navigationController에서 팝업 대신 모달 없애야 함을 의미합니다.

[self dismissModalViewControllerAnimated:YES]; 

편집

이 FormController에 다시 선택한 날짜를 제공하기 위해, 당신은 당신의 CalendarTestViewController 내부 위임 프로토콜을 선언해야합니다.

그런 다음 당신은 또한 .H 내부, 오른쪽 마지막 @end

하기 전에, 당신의 CalendarTestViewController에게 위임 속성을 줄 필요가 : 시간

@protocol CalendarTestViewControllerDelegate 

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

@end 

이 대리자 메서드의 이름 calendarDidSelectDate를 구현해야합니다 컴파일러를 알려줍니다

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

이것은 위에서 선언 한 CalendarTestViewControllerDelegate 프로토콜을 준수하는 모든 클래스 (id가 나타내는 것)의 속성을 갖고 있으며 해당 속성을 delegate라고합니다. 지금

@synthetize delegate; 

그리고 당신의 FormController.h에 @interface FormController : UITableViewController는이 클래스에 적합합니다 컴파일러를 알려줍니다 <CalendarTestViewControllerDelegate>를 추가 할 필요가 말한다 라인에서 : 바로 @impelementation 라인에서 당신의 CalendarTestViewController.m 파일에서 당신은 넣어 가지고 그 프로토콜. 이제 모두가

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

Edit2가 당신의 -(IBAction)cal:(id)sender 방법에 calendar1.delegate = self;를 추가하고 FormController.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]; 

} 

와 예 :

- (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을 표시 할 수 있습니다. 이 절반 화면을 차지합니다 그리고 당신은 당신이 그것을 좋아하지 않는 경우에 당신은 단지 modalViewController을 표시 할 수 있습니다

[myActionSheet showInView:self.view]; 

을 사용하여 뷰에 추가하고 날짜를 선택 후를 취소 할 수 있습니다.

+0

좋아 내가 개념을 모두 볼하지만 그것뿐만 아니라 내 캘린더와 함께 작동합니다. 날짜의 테이핑을 다루고 이전 뷰로 돌아가는 방법으로 캘린더 클래스의 의미? – Mann

+0

UIPickerView (또는보다 구체적으로 UIDatePicker)가 실제로 옵션이 아니며 UIActionSheet가 확실히 옵션이 아니기 때문에 그는 사용자 정의보기를 볼 수 있습니다. 해당 뷰 컨트롤러를 모달로 표시하는 것은 탐색 컨트롤러에 밀어 넣는 것 외의 다른 올바른 방법으로 들립니다. –