IT박스

모달보기 컨트롤러 표시 및 닫기

itboxs 2020. 11. 1. 17:28

모달보기 컨트롤러 표시 및 닫기


누구든지 먼저 모달 뷰 컨트롤러를 제시하는 데 사용할 수있는 예제 코드를 제공 한 다음 해제 할 수 있습니까? 이것이 내가 시도한 것입니다.

    NSLog (@ "% @", blue.modalViewController);
    [blue presentModalViewController : red animated : YES];
    NSLog (@ "% @", blue.modalViewController);
    [파란색 dismissModalViewControllerAnimated : YES];
    NSLog (@ "% @", blue.modalViewController);
이 코드는 viewDidLoad에 있습니다 ( "blue"및 "red"는 모두 UIViewController의 하위 클래스입니다). 빨간색보기를 표시 한 다음 일부 애니메이션을 사용하여 즉시 숨길 것으로 예상합니다. 그러나이 코드는 모달보기 만 표시하며이를 닫지 않습니다. 어떤 생각? 첫 번째 로그에는 "null"이 표시되고 다른 두 로그에는 <RedViewController : 0x3d21bf0>이 표시됩니다.
또 다른 요점은이 코드를 applicationDidFinishLaunching에 넣으면 빨간색보기가 전혀 나타나지 않고 모든 로그가 "null"이됩니다.


우선, 해당 코드를 applicationDidFinishLaunching에 넣을 때 Interface Builder에서 인스턴스화 된 컨트롤러가 아직 애플리케이션에 연결되지 않은 경우 일 수 있습니다 (따라서 "red"및 "blue"는 여전히 nil).

그러나 초기 질문에 답하기 위해 잘못하고있는 것은 dismissModalViewControllerAnimated:잘못된 컨트롤러를 호출하고 있다는 것입니다 ! 다음과 같아야합니다.

[blue presentModalViewController:red animated:YES];
[red dismissModalViewControllerAnimated:YES];

일반적으로 "빨간색"컨트롤러는 특정 시점 ( "취소"버튼을 클릭 할 때)에서 자신을 해제하기로 결정해야합니다. 그런 다음 "빨간색"컨트롤러는 다음에서 메서드를 호출 할 수 있습니다 self.

[self dismissModalViewControllerAnimated:YES];

그래도 작동하지 않는 경우 컨트롤러가 애니메이션 방식으로 표시된다는 사실과 관련이있을 수 있으므로 표시 한 직후 컨트롤러를 해제 할 수 없습니다.


xcode 4.52에서 피곤한 가장 쉬운 방법은 추가 뷰를 만들고 segue 모달을 사용하여 연결하는 것입니다 (컨트롤을 뷰 1에서 두 번째 뷰로 드래그하고 모달 선택). 그런 다음 버튼을 두 번째보기 또는 생성 한 모달보기로 드래그합니다. 이 버튼을 제어하고 헤더 파일로 드래그하고 액션 연결을 사용합니다. 그러면 controller.m 파일에 IBaction이 생성됩니다. 코드에서 버튼 동작 유형을 찾으십시오.

[self dismissViewControllerAnimated:YES completion:nil];

빠른

Swift 3 업데이트

여기에 이미지 설명 입력

스토리 보드

각각에 버튼이있는 두 개의 뷰 컨트롤러를 만듭니다. 두 번째보기 컨트롤러의 경우 클래스 이름을로 설정 SecondViewController하고 스토리 보드 ID를로 설정 secondVC합니다.

암호

ViewController.swift

import UIKit
class ViewController: UIViewController {

    @IBAction func presentButtonTapped(_ sender: UIButton) {

        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let myModalViewController = storyboard.instantiateViewController(withIdentifier: "secondVC")
        myModalViewController.modalPresentationStyle = UIModalPresentationStyle.fullScreen
        myModalViewController.modalTransitionStyle = UIModalTransitionStyle.coverVertical
        self.present(myModalViewController, animated: true, completion: nil)
    }
}

SecondViewController.swift

import UIKit
class SecondViewController: UIViewController {

    @IBAction func dismissButtonTapped(_ sender: UIButton) {
        self.dismiss(animated: true, completion: nil)
    }
}

출처:


presentModalViewController :

MainViewController *mainViewController=[[MainViewController alloc]init];
[self.navigationController presentModalViewController:mainViewController animated:YES];

dismissModalViewController :

[self dismissModalViewControllerAnimated:YES];

빠른

self.dismissViewControllerAnimated(true, completion: nil)


가장 쉬운 방법은 Storyboard와 Segue를 사용하는 것입니다.

TabBarController의 FirstViewController (내비게이션 컨트롤러가 아님)에서 로그인 UI를 사용하여 LoginViewController로 Segue를 만들고 이름을 "showLogin"으로 지정하면됩니다.

로그인 한 사용자 및 / 또는 세션이 유효한지 확인하기 위해 BOOL을 반환하는 메서드를 만듭니다. 가급적이면 AppDelegate에서. isSessionValid라고 부릅니다.

FirstViewController.m에서 다음과 같이 viewDidAppear 메소드를 재정의하십시오.

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    if([self isSessionValid]==NO){
        [self performSegueWithIdentifier:@"showLogin" sender:self];
    }
}

그런 다음 사용자가 성공적으로 로그인 한 경우 LoginViewController를 닫거나 팝업하여 탭을 표시합니다.

100 % 작동합니다!

도움이 되었기를 바랍니다.

참고 URL : https://stackoverflow.com/questions/1529632/present-and-dismiss-modal-view-controller