iOS 여러 개의 탄 상자 순서대로 팝 업 효과 구현
이 글 은 시스템 의 UIAlertController 를 예 로 들 것 입 니 다.물론 사용자 정의 라면 이 글 에서 여러 개의 팝 업 창 을 어떻게 처리 하 는 지 살 펴 봐 야 합 니 다.
우선,다음 과 같은 기본 표기 법 에 따른다 면:
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@" 1" message:@" " preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@" " style:UIAlertActionStyleCancel handler:nil]];
[self presentViewController:alert animated:YES completion:nil];
UIAlertController *alert2 = [UIAlertController alertControllerWithTitle:@" 2" message:@" " preferredStyle:UIAlertControllerStyleAlert];
[alert2 addAction:[UIAlertAction actionWithTitle:@" " style:UIAlertActionStyleCancel handler:nil]];
[self presentViewController:alert2 animated:YES completion:nil];
}
무슨 문제 가 있 을까요?콘 솔 조심 하 세 요.출력 이 분명 합 니 다.Warning: Attempt to present
그 러 니까 두 번 째 탄 자 는 볼 수 없 을 거 야.
다른 경우 사용자 정의 Alert 라면 add 를 window 의 하위 보기 로 하고 두 번 째 탄 상 자 를 첫 번 째 위 에 덮 습 니 다.만약 네가 털 유리 배경 을 사용 했다 면 효과 가 더욱 뚜렷 해 질 것 이다.안 어 울 릴 거 야.
그래서 정확 한 해결 방법 은 자 물 쇠 를 채 우 는 과정 과 비슷 하 다.첫 번 째 탄 틀 의 어떤 단 추 를 누 른 후에 두 번 째 탄 틀 을 꺼 내 서 서 류 를 말한다.
여기 서 나 는 신 호 량 으로 해결 하고 싶 지만 신 호 량 이 스 레 드 를 막 아서 메 인 스 레 드 에서 직접 사용 할 수 없다.그래서 우 리 는 하위 스 레 드 에서 신 호 량 을 제어 하고 메 인 스 레 드 에서 Alert 를 만 들 고 표시 하 며 코드 를 직접 올 려 야 합 니 다.
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
// , ,
dispatch_queue_t queue = dispatch_queue_create("com.se7en.alert", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
// 0
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
// ,UI ,
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@" 1" message:@" " preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@" " style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
// Alert , 。
dispatch_semaphore_signal(sema);
}]];
[self presentViewController:alert animated:YES completion:nil];
});
// , ,
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
// , Alert
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@" 2" message:@" " preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@" " style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
dispatch_semaphore_signal(sema);
}]];
[self presentViewController:alert animated:YES completion:nil];
});
// , Alert
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@" 3" message:@" " preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@" " style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
dispatch_semaphore_signal(sema);
}]];
[self presentViewController:alert animated:YES completion:nil];
});
});
}
이렇게 되면 우리 의 요 구 를 실현 할 수 있다.주의해 야 할 것 은 여기 서 왜 전역 병렬 대기 열 을 사용 하지 않 는 지 하 는 것 입 니 다.주로 신 호 량 이 스 레 드 를 막 을 수 있 고 우선 순위 가 매우 높 습 니 다.만약 에 이때 대기 열 에 임무 가 있다 면 신호 가 촉발 되 기 를 기다 릴 것 입 니 다.물론 일부러 그 러 는 사람 도 있다.'탄 틀 이 튀 어 나 오 는 시간 에는 다른 어떤 일 도 하지 마라'는 수요 가 적절 하 다.물론 우 리 는 절대 메 인 스 레 드 를 막 아 서 는 안 된다!
우 리 는 비동기 스 레 드 에서 신 호 를 기다 리 고 메 인 스 레 드 에서 신 호 를 보 내 면 두 스 레 드 의 동기 화 를 실현 할 수 있다.사실 신 호 량 은 일종 의 자물쇠 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
View의 레이아웃 방법을 AutoLayout에서 따뜻한 손 계산으로 하면 성능이 9.26배로 된 이야기이 기사는 의 15 일째 기사입니다. 어제는 에서 이었습니다. 손 계산을 권하는 의도는 없고, 특수한 상황하에서 계측한 내용입니다 화면 높이의 10 배 정도의 contentView가있는 UIScrollView 레이아...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.