.NET에서 이상한 동작이 발생 presentViewController:animated:completion
합니다. 제가 만드는 것은 본질적으로 추측 게임입니다.
나는이 UIViewController
(frequencyViewController)를 포함하는 UITableView
(frequencyTableView을). 사용자가 정답이 포함 된 questionTableView의 행을 탭하면 뷰 (correctViewController)가 인스턴스화되고 해당 뷰가 모달 뷰로 화면 하단에서 위로 이동해야합니다. 이것은 사용자에게 정답이 있음을 알리고 다음 질문에 대한 준비가 된 frequencyViewController를 재설정합니다. 다음 질문을 표시하기 위해 버튼을 누를 때 correctViewController가 닫힙니다.
이 모든 것은 매번 올바르게 작동하며 올바른 ViewController의 뷰 presentViewController:animated:completion
는 animated:NO
.
내가 설정 animated:YES
하면 correctViewController가 초기화되고 viewDidLoad
. 그러나 viewWillAppear
, viewDidAppear
및의 완료 블록은 presentViewController:animated:completion
호출되지 않습니다. 두 번째 탭을 할 때까지 앱은 여전히 frequencyViewController를 표시하고 있습니다. 이제 viewWillAppear, viewDidAppear 및 완료 블록이 호출됩니다.
나는 조금 더 조사했고, 그것이 계속되게하는 것은 단지 또 다른 탭이 아니다. iPhone을 기울이거나 흔들면 viewWillLoad 등을 트리거 할 수도 있습니다. 진행되기 전에 다른 사용자 입력을 기다리는 것과 같습니다. 이것은 실제 iPhone과 시뮬레이터에서 발생하며, 진동 명령을 시뮬레이터에 전송하여 증명했습니다.
이 문제에 대해 어떻게해야할지 모르겠습니다. 누구든지 도와 줄 수있는 어떤 도움이라도 정말 감사하겠습니다.
감사
여기 내 코드가 있습니다. 아주 간단합니다 ...
이것은 questionTableView에 대한 대리자 역할을하는 questionViewController의 코드입니다.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row != [self.frequencyModel currentFrequencyIndex])
{
// If guess was wrong, then mark the selection as incorrect
NSLog(@"Incorrect Guess: %@", [self.frequencyModel frequencyLabelAtIndex:(int)indexPath.row]);
UITableViewCell *cell = [self.frequencyTableView cellForRowAtIndexPath:indexPath];
[cell setBackgroundColor:[UIColor colorWithRed:240/255.0f green:110/255.0f blue:103/255.0f alpha:1.0f]];
}
else
{
// If guess was correct, show correct view
NSLog(@"Correct Guess: %@", [self.frequencyModel frequencyLabelAtIndex:(int)indexPath.row]);
self.correctViewController = [[HFBCorrectViewController alloc] init];
self.correctViewController.delegate = self;
[self presentViewController:self.correctViewController animated:YES completion:^(void){
NSLog(@"Completed Presenting correctViewController");
[self setUpViewForNextQuestion];
}];
}
}
이것은 correctViewController의 전체입니다.
@implementation HFBCorrectViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self)
{
// Custom initialization
NSLog(@"[HFBCorrectViewController initWithNibName:bundle:]");
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
NSLog(@"[HFBCorrectViewController viewDidLoad]");
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
NSLog(@"[HFBCorrectViewController viewDidAppear]");
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)close:(id)sender
{
NSLog(@"[HFBCorrectViewController close:sender:]");
[self.delegate didDismissCorrectViewController];
}
@end
편집하다:
이전에이 질문을 찾았습니다. UITableView 및 presentViewController가 표시하는 데 2 번의 클릭이 필요합니다.
제 didSelectRow
코드를 이것으로 변경하면 애니메이션과 함께 매우 시간이 걸립니다. 그러나 그것은 지저분하고 왜 처음부터 작동하지 않는지 이해가되지 않습니다. 그래서 저는 그것을 대답으로 간주하지 않습니다 ...
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row != [self.frequencyModel currentFrequencyIndex])
{
// If guess was wrong, then mark the selection as incorrect
NSLog(@"Incorrect Guess: %@", [self.frequencyModel frequencyLabelAtIndex:(int)indexPath.row]);
UITableViewCell *cell = [self.frequencyTableView cellForRowAtIndexPath:indexPath];
[cell setBackgroundColor:[UIColor colorWithRed:240/255.0f green:110/255.0f blue:103/255.0f alpha:1.0f]];
// [cell setAccessoryType:(UITableViewCellAccessoryType)]
}
else
{
// If guess was correct, show correct view
NSLog(@"Correct Guess: %@", [self.frequencyModel frequencyLabelAtIndex:(int)indexPath.row]);
////////////////////////////
// BELOW HERE ARE THE CHANGES
[self performSelector:@selector(showCorrectViewController:) withObject:nil afterDelay:0];
}
}
-(void)showCorrectViewController:(id)sender
{
self.correctViewController = [[HFBCorrectViewController alloc] init];
self.correctViewController.delegate = self;
self.correctViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self presentViewController:self.correctViewController animated:YES completion:^(void){
NSLog(@"Completed Presenting correctViewController");
[self setUpViewForNextQuestion];
}];
}
presentViewController:
트리거해야하는 애니메이션이 큰 지연으로 시작되는 것 같습니다. 이것은 iOS 7의 버그로 보이며 Apple Dev Forums에서도 논의됩니다.