iOS-스위프트를 사용하여 프로그래밍 방식으로 말을하는 방법


185

Facebook SDK를 사용하여 사용자를 인증하는 앱을 만들고 있습니다. 페이스 북 논리를 별도의 클래스로 통합하려고합니다. 코드는 다음과 같습니다 (단순함을 위해 줄임).

import Foundation

class FBManager {
    class func fbSessionStateChane(fbSession:FBSession!, fbSessionState:FBSessionState, error:NSError?){
        //... handling all session states
        FBRequestConnection.startForMeWithCompletionHandler { (conn: FBRequestConnection!, result: AnyObject!, error: NSError!) -> Void in

            println("Logged in user: \n\(result)");

            let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
            let loggedInView: UserViewController = storyboard.instantiateViewControllerWithIdentifier("loggedInView") as UserViewController

            loggedInView.result = result;

            //todo: segue to the next view???
        }
    }
}

위의 클래스 방법을 사용하여 세션 상태 변경을 확인하고 정상적으로 작동합니다.

Q : 사용자 데이터가 확보되면이 사용자 정의 클래스에서 다음보기를 어떻게 확인할 수 있습니까?

편집 : 분명히하기 위해 스토리 보드에 식별자가있는 segue가 있으며 뷰 컨트롤러가 아닌 클래스에서 segue를 수행하는 방법을 찾으려고합니다.


2
처럼 performSegue:?
HAS

예,하지만 코드가 viewController에 없습니다. 어떻게 할 수 있습니까?
Shlomi Schwartz

이 경우 작업을 수행하는 객체의 작업 (segueing)을 뷰 컨트롤러에 완료 블록 또는 대리자 메서드를 통해 위임해야합니다.
HAS

non-nil 레이아웃 예외가 발생 함
Chris Hayes

답변:


340

두보기 사이에 segue 식별자가있는 스토리 보드에 segue가있는 경우 다음을 사용하여 프로그래밍 방식으로 호출 할 수 있습니다.

performSegue(withIdentifier: "mySegueID", sender: nil)

이전 버전의 경우 :

performSegueWithIdentifier("mySegueID", sender: nil)

당신은 또한 할 수 있습니다 :

presentViewController(nextViewController, animated: true, completion: nil)

또는 내비게이션 컨트롤러에있는 경우 :

self.navigationController?.pushViewController(nextViewController, animated: true)

7
답장을 보내 주셔서 감사합니다.보기가 아닌 사용자 정의 클래스에서 performSegueWithIdentifier를 어떻게 호출 할 수 있습니까?
Shlomi Schwartz

2
두 번째 방법을 사용한다면. 다음보기로 데이터를 전달하는 방법은 무엇입니까?
iamprem

2
func PreparingForSegue (segue : UIStoryboardSegue, sender : AnyObject?)를 사용하고 속성을 설정하십시오.
Lloyd Sargent

1
performSequeWithIdentifer ()를 호출 할 때, 호출 컨트롤러에서 PrepareForSeque ()의 구현이 호출되고 여기에서 다양한 데이터를 전달할 수 있습니다. 실제로, PreparingForSeque ()에서 수신 된 송신자 매개 변수는 단순히 송신자 매개 변수에 전달 된 것입니다. performSequeWithIdentifier ()
timbo

1
스토리 보드에 segue가 없으면 어떻게됩니까? 예를 들어 ViewController 자체에 segue를 만들려면?
scaryguy

20

NSNotification 을 사용할 수 있습니다

사용자 정의 클래스에 포스트 메소드를 추가하십시오.

NSNotificationCenter.defaultCenter().postNotificationName("NotificationIdentifier", object: nil)

ViewController에 관찰자를 추가하십시오.

NSNotificationCenter.defaultCenter().addObserver(self, selector: "methodOFReceivedNotication:", name:"NotificationIdentifier", object: nil)

ViewController에 함수를 추가하십시오.

func methodOFReceivedNotication(notification: NSNotification){
    self.performSegueWithIdentifier("yourIdentifierInStoryboard", sender: self)
}

1
이와 같은 알림을 남용하지 마십시오. 델리게이트를 사용하고 뷰 컨트롤러와 클래스를 명시 적으로 연결하십시오. 구독자가 여러 명있을 수 있으며 인스턴스는 마음대로 구독 / 구독 취소 할 수 있으므로 알림의 제어 흐름을 관찰하는 것은 거의 불가능합니다.
uliwitness

17

두 개의보기 사이에 segue 식별자가있는 스토리 보드에 segue가있는 경우 프로그래밍 방식으로 호출 할 수 있습니다.

self.performSegueWithIdentifier("yourIdentifierInStoryboard", sender: self)

내비게이션 컨트롤러에있는 경우

let viewController = YourViewController(nibName: "YourViewController", bundle: nil)        
self.navigationController?.pushViewController(viewController, animated: true)

내비게이션 컨트롤러를 사용하는 두 번째 방법을 추천합니다.


self.performSegue (withIdentifier : "yourIdentifierInStoryboard", 발신자 : self)
Rajneesh071

14

다음과 같이 segue를 사용할 수 있습니다.

self.performSegueWithIdentifier("push", sender: self)
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
    if segue.identifier == "push" {

    }
}

답장을 보내 주셔서 감사합니다.하지만 performSegueWithIdentifier는 viewController 메소드이며, 코드는 외부 클래스에서 실행됩니다
Shlomi Schwartz

13

스위프트 3 - SpriteKit 과도 작동

NSNotification 을 사용할 수 있습니다 .

예:

1.) 스토리 보드에서 segue를 만들고 식별자의 이름을 "segue"

2.) ViewController에서 함수를 생성하십시오.

func goToDifferentView() {

    self.performSegue(withIdentifier: "segue", sender: self)

}

3.) ViewController의 ViewDidLoad ()에서 관찰자를 생성하십시오.

NotificationCenter.default.addObserver(self, selector: #selector(goToDifferentView), name: "segue" as NSNotification.Name, object: nil)

업데이트 -마지막으로 이것을 사용했을 .addObserver때 오류를 침묵시키기 위해 다음 코드에 대한 호출을 변경해야했습니다 .

NotificationCenter.default.addObserver(self, selector: #selector(goToDifferentView), name: NSNotification.Name(rawValue: "segue"), object: nil)

4.) 사용하려는 ViewController 또는 Scene에서 segue를 트리거 할 위치에 Post Method를 추가하십시오.

NotificationCenter.default.post(name: "segue" as NSNotification.Name, object: nil)

업데이트 -마지막으로 이것을 사용했을 .post때 오류를 침묵시키기 위해 다음 코드에 대한 호출을 변경해야했습니다 .

NotificationCenter.default.post(NSNotification(name: NSNotification.Name(rawValue: "segue"), object: nil) as Notification)

스위프트 3 :NotificationCenter.default.addObserver(self, selector: #selector(goToDifferentView), name: NSNotification.Name(rawValue: "segue"), object: nil)
Michael Samoylov

3

당신이하고 싶은 것은 단위 테스트에 정말로 중요합니다. 기본적으로 뷰 컨트롤러에서 작은 로컬 함수를 만들어야합니다. 함수의 이름을 아무거나 지정하십시오 performSegueWithIndentifier.

func localFunc() {
    println("we asked you to do it")
    performSegueWithIdentifier("doIt", sender: self)
}

그런 다음 유틸리티 클래스 FBManager를 변경하여 함수의 인수를 사용하는 초기화 자와 segue를 수행하는 ViewController의 함수를 보유하는 변수를 포함하십시오.

public class UtilClass {

    var yourFunction : () -> ()

    init (someFunction: () -> ()) {
        self.yourFunction = someFunction
        println("initialized UtilClass")
    }

    public convenience init() {
        func dummyLog () -> () {
            println("no action passed")
        }
        self.init(dummyLog)
    }

    public func doThatThing() -> () {
        // the facebook login function
        println("now execute passed function")
        self.yourFunction()
        println("did that thing")
    }
}

편의상 init를 사용하면 segue를 실행하지 않고 단위 테스트에서 이것을 사용할 수 있습니다.

마지막으로, // todo : segue to next view ???가있는 곳 :

self.yourFunction()

단위 테스트에서 간단히 다음과 같이 호출 할 수 있습니다.

let f = UtilClass()
f.doThatThing()

여기서 doThatThing은 fbsessionstatechange이며 UtilClassFBManager입니다.

실제 코드의 경우 localFunc괄호없이 FBManager 클래스에 전달하십시오.


2

이것은 나를 위해 일했습니다.

먼저 스토리 보드의 뷰 컨트롤러에 ID 관리자 내부에 스토리 보드 ID를 제공하십시오. 그런 다음 다음 예제 코드를 사용하십시오 (클래스, 스토리 보드 이름 및 스토리 보드 ID가 사용중인 것과 일치하는지 확인).

let viewController:
UIViewController = UIStoryboard(
    name: "Main", bundle: nil
).instantiateViewControllerWithIdentifier("ViewController") as UIViewController
// .instantiatViewControllerWithIdentifier() returns AnyObject!
// this must be downcast to utilize it

self.presentViewController(viewController, animated: false, completion: nil)

자세한 내용은 http://sketchytech.blogspot.com/2012/11/instantiate-view-controller-using.html 희망 사항을 참조 하십시오


1

performSegueWithIdentifier기능을 사용하여이 작업을 수행 할 수 있습니다 .

스크린 샷

구문 :

func performSegueWithIdentifier(identifier: String, sender: AnyObject?)

예 :

 performSegueWithIdentifier("homeScreenVC", sender: nil)

1

또 다른 옵션은 모달 세구를 사용하는 것입니다

1 단계 : 스토리 보드로 이동하여 View Controller에 스토리 보드 ID를 제공하십시오 . 오른쪽의 Identity Inspector에서 스토리 보드 ID를 변경할 위치를 찾을 수 있습니다. 스토리 보드 ID를 호출 할 수 있습니다ModalViewController

2 단계 : '보낸 사람'보기 컨트롤러를 열고 (호출하자 ViewController)이 코드를 추가합니다

public class ViewController {
  override func viewDidLoad() {
    showModalView()
  }

  func showModalView() {
    if let mvc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ModalViewController") as? ModalViewController {
      self.present(mvc, animated: true, completion: nil)
    }
  }
}

우리가 열고 자하는 View Controller라고도합니다. ModalViewController

3 단계 : ModalViewController를 닫으려면 이것을 추가하십시오

public class ModalViewController {
   @IBAction func closeThisViewController(_ sender: Any?) {
      self.presentingViewController?.dismiss(animated: true, completion: nil)
   }
}

0

이것은 나를 위해 일했다 :

//Button method example
 @IBAction func LogOutPressed(_ sender: UIBarButtonItem) {

        do {
            try Auth.auth().signOut()
            navigationController?.popToRootViewController(animated: true)

        } catch let signOutError as NSError {
          print ("Error signing out: %@", signOutError)
        }


    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.