私のアプリケーションではUITableView
、特定の日の医師の予約を表示するためにを使用しています。2つのジェスチャ認識機能を使用して、テーブルビューをスワイプして、次の日(右から左にスワイプ)/前の日(左から右にスワイプ)を表示できます。
スワイプすると、データベースから予約が既にロードされているかどうかを確認し、ロードされていない場合は、ロードされているユーザーを示すアクティビティインジケーター付きのアラートビューを表示します。
ロードが完了したら、このアラートビューを閉じて、ビューを反転するアニメーション(UIViewAnimationTransitionFlipFromLeft
)を表示し、新しい日を表示します。
ここで問題となるのは、ビューを反転した後didSelectRowAtIndexPath:
、初めてセルをタップしたときに呼び出されないということです。しかし、もう一度タップすると、メソッドが起動します。「ビューをアクティブにする」には、最初にビューの任意の場所をタップする必要があるようです。アラートビューは、テーブルビューの上にまだ存在している可能性がありますか?
左から右へのスワイプを処理するコード:
-(void)handleSwipeR
{
//Disable user interaction.
[table setUserInteractionEnabled:NO];
[self.navigationController.navigationBar setUserInteractionEnabled:NO];
if (swipeEnabled == YES) {
swipeEnabled = NO;
//we use the curIndex to check if it is necessary to get new data.
if (curIndex > 0)
{
//Commit the animations and reload all the data.
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDelegate:self];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:table cache:NO];
[UIView setAnimationDuration:1];
[UIView setAnimationDidStopSelector: @selector(animationFinished:finished:context:)];
[UIView commitAnimations];
curIndex --;
[Database setCurDate:[keys objectAtIndex:curIndex]];
[table reloadData];
}else {
//We show a loading screen until the new reservation data is collected.
loading=[[UIAlertView alloc] initWithTitle:loadingText message:@"" delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
loadingInd=[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
[loadingInd startAnimating];
[loadingInd setFrame:CGRectMake(125, 60, 37, 37)];
[loading addSubview:loadingInd];
[loading show];
[Database setCurAlert:loading];
[Database setCurDate:[keys objectAtIndex:curIndex]];
//Set startdate and enddate and get the new reservations.
NSDate *startDate = [[Database curDate] dateByAddingTimeInterval:-60*60*24*15];
NSDate *endDate = [[Database curDate] dateByAddingTimeInterval:-60*60*24*1];
[Database getReservations:startDate endDate:endDate];
[self fillVariables];
[loading dismissWithClickedButtonIndex:0 animated:YES];
//You get a unique id each session. If you logged in at another location, the session id will change. So the first one is invalid. So we first check if the session id is still valid.
if (![Database sessionExpired]) {
//If there aren't found any reservations for the next two weeks. Show an Alertview.
if ([Database elementFound] == NO) {
reservationSearch = 2;
alertNoResMessage = [NSString stringWithFormat:[LanguageStrings resListNoResMessageSwipeR],reservationSearch];
//sleep(1);
alertNoRes= [[UIAlertView alloc]initWithTitle:alertNoResTitle message:alertNoResMessage delegate:self cancelButtonTitle:alertNoResButtonYes otherButtonTitles:alertNoResButtonNo, nil];
alertNoRes.tag = 201;
[alertNoRes show];
}else {
//Commit the animations and reload all the data.
curIndex = [keys indexOfObject:[Database curDate]];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDelegate:self];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:table cache:NO];
[UIView setAnimationDuration:1];
[UIView setAnimationDidStopSelector: @selector(animationFinished:finished:context:)];
[UIView commitAnimations];
curIndex --;
[Database setCurDate:[keys objectAtIndex:curIndex]];
[table reloadData];
}
}
}
swipeEnabled = YES;
}
}
//Enable all user interaction when the animation is finished.
- (void) animationFinished:(NSString *)animationID finished:(BOOL)finished context: (void *)context{
[table setUserInteractionEnabled:YES];
[self.navigationController.navigationBar setUserInteractionEnabled:YES];
swipeEnabled = YES;
}
しばらく調べていましたが、答えが見つからないようですので、よろしくお願いします。