iPhone 보기가 실행되지 않는 것으로 나타납니다.
나는 사람들이 문제를 가지고 있다는 수많은 게시물을 읽었습니다.viewWillAppear
보기 계층 구조를 제대로 작성하지 않은 경우.제 문제는 그게 무슨 뜻인지 이해할 수 없다는 거예요.
가 할경우를 ,RootViewController
와를 요.addSubView
해당 컨트롤러에 대해 추가된 보기가 연결되어 있을 것으로 예상됩니다.viewWillAppear
사건들
다음을 성공적으로 수신하는 복잡한 프로그램 보기 계층 구조의 예를 가진 사람이 있습니까?viewWillAppear
모든 수준의 이벤트?
Apple의 문서 상태:
경고: 보기 컨트롤러에 속한 보기가 보기 계층에 직접 추가되면 보기 컨트롤러는 이 메시지를 수신하지 않습니다.보기 계층에 보기를 삽입하거나 추가하고 보기 컨트롤러가 있는 경우 관련 보기 컨트롤러에 이 메시지를 직접 보내야 합니다.이 메시지를 뷰 컨트롤러로 보내지 않으면 관련 애니메이션이 표시되지 않습니다.
문제는 그들이 이것을 어떻게 하는지 설명하지 않는다는 것입니다."직접적"이란 무엇을 의미합니까?보기를 "간접적으로" 추가하는 방법은 무엇입니까?
저는 코코아와 아이폰에 익숙하지 않기 때문에 기본적인 헬로 월드 쓰레기 외에도 애플의 유용한 사례가 있으면 좋겠습니다.
탐색 컨트롤러를 사용하고 해당 대리자를 설정하면 {Will,Did}{Appear,Dispare} 메서드가 호출되지 않습니다.
대신 탐색 컨트롤러 위임 방법을 사용해야 합니다.
navigationController:willShowViewController:animated:
navigationController:didShowViewController:animated:
저도 같은 문제에 부딪힌 적이 있습니다. 그냥보기를 .viewWillAppear
메지를하보추전가기해에보표메다시니합시를 (뷰 컨트롤러에가 하나 (보기 컨트롤러에 표시되도록 애니메이션화되는지 여부를 알려주는 BOOL 매개변수가 하나 있습니다.)
[myViewController viewWillAppear:NO];
Metronome 예제에서 RootViewController.m을 확인합니다.
(저는 실제로 애플의 예시 프로젝트가 훌륭하다는 것을 알았습니다.헬로 월드보다 더 많은 것이 있습니다 ;)
저는 마침내 효과적인 해결책을 찾았습니다!
요지는 control의 뷰하고, 실행하는 합니다.UINavigationControllerDelegate
그리고 두 가지 방법입니다. 신나!저는 마침내 해결책을 발견하게 되어 매우 흥분됩니다!
iOS 13 감사합니다.
ViewWillDisappear
,ViewDidDisappear
,ViewWillAppear
그리고.ViewDidAppear
전체 화면을 가리지 않는 새로운 모달 프레젠테이션을 사용하는 iOS 13의 프레젠테이션 뷰 컨트롤러에서는 호출되지 않습니다.
크레딧은 아렉 홀코에게 갑니다.그는 정말로 나의 하루를 구했어요.
저도 방금 같은 문제가 있었습니다.제 애플리케이션에는 2개의 내비게이션 컨트롤러가 있으며 각각의 컨트롤러에서 동일한 뷰 컨트롤러를 밀어넣으면 한 케이스에서 작동하고 다른 케이스에서는 작동하지 않습니다.은 첫 내말첫 번 째 서 에 정 동 확 를 러 푸 시 할 때 롤 컨 트 뷰 한 은 일 히 ▁contro ▁the ▁view ▁pushing ▁i 할 시 때 ller ▁the ▁in ▁exact ▁same 푸 내 ▁first ▁when 를 말 ▁thatUINavigationController
,viewWillAppear
호출되었지만 두 번째 탐색 컨트롤러를 눌렀을 때는 호출되지 않았습니다.
그러던 중 이 게시물을 우연히 발견했습니다. UINavigation Controller가 viewWillAppear/viewWillDispare 메서드를 호출해야 합니다.
의 두 번째 를 했다는 것을 깨달았습니다.viewWillAppear
코드를 스크리닝한 결과 전화를 하지 않은 것으로 나타났습니다.
[super viewWillAppear:animated];
제가 추가를 했는데 효과가 있었어요!
설명서에는 다음과 같이 나와 있습니다.
이 메서드를 재정의하는 경우 구현의 특정 시점에서 super를 호출해야 합니다.
저는 내비게이션 컨트롤러를 사용해 왔습니다.다른 수준의 데이터로 이동하거나 사용자 정의 보기를 표시하려면 다음을 사용합니다.
[self.navigationController pushViewController:<view> animated:<BOOL>];
내가 이걸 할 때, 나는 정말로.viewWillAppear
사격 기능을 발휘합니다.저는 이것이 "간접적"으로 자격이 있다고 생각합니다. 왜냐하면 저는 실제 전화를 하지 않기 때문입니다.addSubView
나 자신의 방법.내비게이션 컨트롤러를 사용하고 있는지 알 수 없기 때문에 이것이 당신의 애플리케이션에 100% 적용 가능한지는 모르겠지만, 아마도 단서를 제공할 것입니다.
첫째, 탭 표시줄은 Apple 설명서에 명시된 대로 루트 수준, 즉 창에 추가되어야 합니다.올바른 동작을 위한 키입니다.
두 번째로, 당신은 사용할 수 있습니다.UITabBarDelegate
/UINavigationBarDelegate
을 수동으로 으로 호출하기만 되었습니다.
[tabBarController viewWillAppear:NO];
[tabBarController viewDidAppear:NO];
그리고.
[navBarController viewWillAppear:NO];
[navBarController viewDidAppear:NO];
해당 컨트롤러에 뷰 컨트롤러를 설정하기 전에 한 번만(할당 직후).그때부터 하위 뷰 컨트롤러에서 이러한 메서드를 올바르게 호출했습니다.
내 계층 구조는 다음과 같습니다.
window
UITabBarController (subclass of)
UIViewController (subclass of) // <-- manually calls [navController viewWill/DidAppear
UINavigationController (subclass of)
UIViewController (subclass of) // <-- still receives viewWill/Did..etc all the way down from a tab switch at the top of the chain without needing to use ANY delegate methods
탭/내비게이션 컨트롤러에서 언급된 메소드를 처음 호출하는 것만으로도 모든 이벤트가 올바르게 전달되었습니다.그것은 내가 그들에게 수동으로 전화하는 것을 멈추게 했습니다.UINavigationBarDelegate
/UITabBarControllerDelegate
방법들.
참고 사항:이상하게도, 그게 효과가 없을 때, 개인적인 방법은
- (void)transitionFromViewController:(UIViewController*)aFromViewController toViewController:(UIViewController*)aToViewController
작동 중인 구현의 콜 스택에서 볼 수 있는 것으로, 일반적으로 다음과 같이 부릅니다.viewWill/Did..
위의 작업을 수행할 때까지 수행하지 않았습니다(호출되었지만).
나는 그것이 매우 중요하다고 생각합니다.UITabBarController
하지만 창 레벨에 있고 문서가 이를 뒷받침하는 것으로 보입니다.
그것이 명확했기를 바랍니다, 추가 질문에 대답할 수 있어서 기쁩니다.
아무 대답도 받아들여지지 않고 사람들이 (나처럼) 여기에 도착하기 때문에 나는 나의 변화를 줍니다.비록 그것이 원래의 문제였는지는 확신할 수 없지만요.탐색 컨트롤러가 다른 보기에 하위 보기로 추가되면 다음과 같이 viewWillAppear/Disappear 등 메서드를 직접 호출해야 합니다.
- (void) viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[subNavCntlr viewWillAppear:animated];
}
- (void) viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[subNavCntlr viewWillDisappear:animated];
}
예문을 완성하기 위해서입니다.이 코드는 보기에 배치한 보기에 탐색 컨트롤러를 만들고 추가한 보기 컨트롤러에 나타납니다.
- (void)viewDidLoad {
// This is the root View Controller
rootTable *rootTableController = [[rootTable alloc]
initWithStyle:UITableViewStyleGrouped];
subNavCntlr = [[UINavigationController alloc]
initWithRootViewController:rootTableController];
[rootTableController release];
subNavCntlr.view.frame = subNavContainer.bounds;
[subNavContainer addSubview:subNavCntlr.view];
[super viewDidLoad];
}
.h는 이렇게 생겼습니다.
@interface navTestViewController : UIViewController <UINavigationControllerDelegate> {
IBOutlet UIView *subNavContainer;
UINavigationController *subNavCntlr;
}
@end
nib 파일에는 보기가 있고 이 보기 아래에는 이미지 레이블과 컨트롤러를 넣은 용기(다른 보기)가 있습니다.이것은 이렇게 보입니다.이것은 고객을 위한 일이기 때문에 저는 몇 가지 일을 서둘러야 했습니다.
는 호는출직통 "해접니" "추됩다가"를 하여 "됩니다.[view addSubview:subview]
보기는 하위 보기를 전환하는 탭 막대 또는 탐색 막대와 같은 방법에 의해 "간접적으로" 추가됩니다.
전화할 때마다[view addSubview:subviewController.view]
그면전화해합다니야를러에 전화해야 .[subviewController viewWillAppear:NO]
(또는 예).
게임에서 서브스크린에 대한 나만의 커스텀 루트 뷰 관리 시스템을 구현했을 때 이 문제가 발생했습니다.수동으로 viewWillAppear에 호출을 추가하면 문제가 해결됩니다.
올바른 방법은 UIViewController 억제 api를 사용하는 것입니다.
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
UIViewController *viewController = ...;
[self addChildViewController:viewController];
[self.view addSubview:viewController.view];
[viewController didMoveToParentViewController:self];
}
푸시 및 팝업 보기 컨트롤러에 사용하는 코드는 다음과 같습니다.
푸시:
[self.navigationController pushViewController:detaiViewController animated:YES];
[detailNewsViewController viewWillAppear:YES];
팝업:
[[self.navigationController popViewControllerAnimated:YES] viewWillAppear:YES];
저한테는 잘 맞습니다.
매우 일반적인 실수는 다음과 같습니다.당신은 하나의 견해를 가지고 있습니다.UIView* a
또 하나는, 또하나▁and.UIView* b
b를 하위 뷰로 추가합니다.를 호출하려고 되지 않습니다. viewWillApear의 입니다. 왜냐하면 그것은 a의 하위 뷰이기 때문입니다.
iOS 13은 거기서 내 앱의 엉덩이를 물었어요.iOS 13 이후의 행동 변화를 알아차린 경우, 푸시하기 전에 다음을 설정하십시오.
yourVC.modalPresentationStyle = UIModalPresentationFullScreen;
또한 속성 검사기의 .storyboard에서 프레젠테이션을 전체 화면으로 설정해야 할 수도 있습니다.
이것은 당신의 앱이 이전 버전의 iOS에서 했던 것처럼 작동하게 됩니다.
저는 확신할, 뷰를 추가하는 은 직접적으로 %를 호출하는 것을 의미한다고 합니다.-addSubview:
컨트롤러의에서 ( 컨롤의예보기러트뷰예)[viewController.view addSubview:anotherViewController.view]
새 뷰 컨트롤러를 탐색 컨트롤러의 스택에 밀어넣는 대신 사용할 수 있습니다.
서브뷰를 추가한다고 해서 반드시 뷰가 나타나는 것은 아니라고 생각하기 때문에 클래스 메소드에 서브뷰를 추가하는 자동 호출은 없습니다.
저는 그들이 "직접적으로" 의미하는 것은 애플리케이션 UI 창의 유일한 하위 뷰로 UINavigation Controller를 설정하는 xcode "Navigation Application" 템플릿과 동일한 방식으로 사물을 후크하는 것이라고 생각합니다.
이 템플릿을 사용하는 것이 UINavigationController에서 해당 컨트롤러를 푸시/팝업할 때 개체 ViewController에서 Will/Did/Appear/Disappear 메서드를 호출할 수 있는 유일한 방법입니다.여기에 나와 있는 답변의 다른 솔루션은 루트 컨트롤러에서 구현하고 (하위) 탐색 컨트롤러로 전달하는 것을 포함하여 제게 도움이 되지 않았습니다.최상위 VC, "로그인" 및 탐색을 표시/숨겼을 때만 루트 컨트롤러에서 이러한 기능(유효/실행/숨김/사라짐)이 호출되었습니다.내비게이션 컨트롤러의 하위 VC가 아닌 VC를 사용했기 때문에 Nav VC에 "통과"할 기회가 없었습니다.
저는 UINavigation Controller의 대리 기능을 사용하여 앱에서 후속 기능이 필요한 특정 전환을 찾았고, 이 전환은 작동하지만 사라짐 기능과 모양 기능을 모두 "모의"하기 위해서는 약간의 작업이 필요합니다.
또한 오늘 이 문제에 대해 몇 시간 동안 머리를 부딪친 후에 그것을 작동시키는 것이 원칙의 문제입니다.사용자 지정 루트 컨트롤러와 하위 탐색 VC를 사용하는 모든 작업 코드 스니펫은 매우 유용합니다.
이게 도움이 되는 사람이 있다면요.요.ViewWillAppear
에 대해 실행되지 않습니다.UITableViewController
많은 놀이를 한 후에, 저는 문제가 있다는 것을 깨달았습니다.UINavigationController
그것은 나를 통제하는 것입니다.UITableView
루트 보기에 없습니다.일단 제가 그것을 고치면, 그것은 이제 챔피언처럼 작동합니다.
저도 방금 이 문제를 해결하는 데 꼬박 3시간(그 중 2시간은 구글 검색)이 걸렸습니다.
기기/시뮬레이터에서 앱을 삭제하고 치료한 다음 다시 실행하는 것이 도움이 되었습니다.
도움이 되길 바랍니다.
[self.navigationController setDelegate:self];
대리자를 루트 뷰 컨트롤러로 설정합니다.
저의 경우 사용자 지정 전환 애니메이션에 문제가 있었습니다. 시 시정 설modalPresentationStyle = .custom
viewWillAppear
불리지 않음
방법이 합니다.beginAppearanceTransition
그리고.endAppearanceTransition
스위프트를 위해서.먼저 view에서 호출할 내용을 호출하는 프로토콜을 만듭니다. WillAppear
protocol MyViewWillAppearProtocol{func myViewWillAppear()}
둘째, 클래스를 만듭니다.
class ForceUpdateOnViewAppear: NSObject, UINavigationControllerDelegate {
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool){
if let updatedCntllr: MyViewWillAppearProtocol = viewController as? MyViewWillAppearProtocol{
updatedCntllr.myViewWillAppear()
}
}
}
셋째, ForceUpdateOnView의 인스턴스를 Navigation Controller에 대한 액세스 권한이 있고 Navigation Controller가 있는 한 존재하는 적절한 클래스의 멤버로 표시합니다.예를 들어 탐색 컨트롤러의 루트 뷰 컨트롤러 또는 탐색 컨트롤러를 만들거나 표시하는 클래스일 수 있습니다.그런 다음 가능한 빨리 ForceUpdateOnViewAppear 인스턴스를 Navigation Controller 대리자 속성에 할당합니다.
저의 경우, 그것은 ios 12.1 에뮬레이터의 이상한 버그에 불과했습니다.실제 장치에서 실행된 후 사라졌습니다.
저는 이 문제를 해결하는 수업을 만들었습니다.탐색 컨트롤러의 대리자로 설정하고 보기 컨트롤러에서 보기가 표시되려고 하거나 탐색 컨트롤러를 통해 표시되었을 때 호출되는 간단한 방법을 하나 또는 두 가지만 구현하면 됩니다.
ViewWillAppear는 UIViewController 클래스의 재정의 메서드이므로 subView를 추가하면 viewWillAppear가 호출되지 않지만 뷰 컨트롤러에서 push, pop, show 또는 setFrontOpToRootViewController를 표시하면 표시된 뷰 컨트롤러에 대한 ViewWillAppear가 호출됩니다.
제 문제는 segue에서 풀 때 willAppear 뷰가 호출되지 않았다는 것입니다.응답은 다시 호출하는 View 컨트롤러의 언윈드 세그먼트에 ViewWillApear(true)에 대한 호출을 넣는 것이었습니다.
@IBAction funcwind(unwindSegue용): UIStoryboardSegue, ViewController 후속 항목VC: 임의) {
viewWillAppear(true)
}
저는 이것이 제가 해결한 것과 같은 문제인지 확신할 수 없습니다.
"[self methodOne]"과 같이 일반적인 방법으로 메서드가 실행되지 않는 경우가 있습니다.
해라
- (void)viewWillAppear:(BOOL)animated
{
[self performSelector:@selector(methodOne)
withObject:nil afterDelay:0];
}
한 번에 하나의 UIView 컨트롤러만 활성화해야 합니다.조작하려는 모든 하위 뷰는 정확히 하위 뷰, 즉 하위 뷰여야 합니다.UI뷰.
저는 제 뷰 계층을 관리하기 위해 간단한 기술을 사용하지만 이런 방식으로 작업을 시작한 이후로 아직 문제에 부딪힌 적이 없습니다.두 가지 핵심 사항이 있습니다.
- 단일 UIViewController를 사용하여 앱의 "화면 가치"를 관리해야 합니다.
- 보기 변경에 UINavigation 컨트롤러 사용
"스크린의 가치"란 무엇을 의미합니까?의도적으로 약간 모호하지만 일반적으로 앱의 기능 또는 섹션입니다.배경 이미지는 같지만 오버레이/팝업 등이 다른 화면이 몇 개 있는 경우에는 1개의 보기 컨트롤러와 여러 개의 하위 보기가 있어야 합니다.두 개의 보기 컨트롤러로 작업하는 자신을 발견해서는 안 됩니다.화면의 특정 영역을 여러 뷰 컨트롤러에 표시하려면 한 뷰 컨트롤러에서 UIView를 인스턴스화하고 다른 뷰 컨트롤러의 하위 뷰로 추가할 수 있습니다.
UINavigation Controller에 관해서는 - 이 사람이 당신의 가장 친한 친구입니다!탐색 모음을 끄고 애니메이션에 대해 NO를 지정하면 필요에 따라 화면을 전환할 수 있습니다.계층에 있는 뷰 컨트롤러를 푸시 및 팝업할 수 있으며, 단일 VC를 포함하는 뷰 컨트롤러 배열을 준비하여 setViewControllers를 사용하여 뷰 스택으로 설정할 수 있습니다.이를 통해 VC를 완전히 자유롭게 변경할 수 있는 동시에 Apple의 예상 모델 내에서 작업하고 모든 이벤트를 적절하게 실행하는 등의 모든 이점을 얻을 수 있습니다.
앱을 시작할 때마다 수행하는 작업은 다음과 같습니다.
- 창 기반 앱에서 시작
- 창의 루트ViewController로 UINavigationController 추가
- 첫 번째 UIViewController를 navController의 루트ViewController로 추가합니다.
(창 기반에서 시작하는 노트는 개인적인 선호일 뿐입니다. 저는 물건을 직접 만드는 것을 좋아해서 어떻게 만들어지는지 정확히 알고 있습니다.뷰 기반 템플릿에서 올바르게 작동합니다.)
모든 사건들이 정확하게 발생하고 기본적으로 삶이 좋습니다.그런 다음 앱의 중요한 부분을 작성하는 데 모든 시간을 할애할 수 있으며, 보기 계층을 수동으로 해킹하여 모양을 만드는 데 방해가 되지 않습니다.
언급URL : https://stackoverflow.com/questions/131062/iphone-viewwillappear-not-firing
'programing' 카테고리의 다른 글
Objective-C가 NSString을 켤 수 있습니까? (0) | 2023.06.02 |
---|---|
rhc 설정 시 'no this file dl/import' 오류가 표시됨 (0) | 2023.06.02 |
투명한 iOS 탐색 모음 (0) | 2023.06.02 |
--no-ri --no-rdoc을 기본 forgem 설치로 만드는 방법은 무엇입니까? (0) | 2023.06.02 |
iTunes 유무에 관계없이 iPad에 .ipa 설치 (0) | 2023.06.02 |