1
여기

내가 위임 설정하고 첫 번째 VC입니다 :스토리 보드없이 ViewController를 만들고 다른 하나의 델리게이트로 설정하는 방법은 무엇입니까?

class DiscoverVC: UIViewController, SetLocationDelegate { 
    var name = "" 
    let loc = LocationVC() 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.loc.delegate = self 
    } 

     func getLocation(loc: String) { 
     self.name = loc 
     self.tableView.reloadData() 
    } 
} 

을 그리고 여기 대리인을 통해 데이터를 얻고있는 곳에서 두 번째보기 컨트롤러 :

protocol SetLocationDelegate: class { 
    func getLocation(loc: String) 
} 

class LocationVC: UIViewController { 

    weak var delegate: SetLocationDelegate? 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.delegate?.getLocation(loc: "Sam") 
    } 
} 

내가 통과하려고 할 때마다 데이터는 메서드를 호출하지 않고 대리자는 호출을받지 않습니다. 많은 도움이 필요합니다.

+0

In LocationVC 컨트롤러의 viewDidLoad() 메소드가 호출되는지 확인하십시오. –

+0

위임자의 '강력한'참조를 사용하면 현재 '약한 var 대리인 : SetLocationDelegate?'가 위임자를 약한 참조로 변경하여 'var delegate : SetLocationDelegate?'로 변경하고 작동하게됩니다. –

+2

@ NishantBhindi는 메모리 누수를 일으키는 유지주기를 생성합니다. 이러지 마. – shallowThought

답변

2

참고 : 이전 답변에서는 스토리 보드를 사용했습니다. 그러나 질문자가 스토리 보드를 사용하고 싶지 않았기 때문에 스토리 보드를 사용하지 않고 답변을 교체합니다. [이 대답은 https://stackoverflow.com/a/41095757/3549695에 의해 영감을 받았습니다.

먼저 Main.storyboard를 삭제하십시오. 그런 다음 프로젝트에서 -> 배포 정보는 -> 주요 인터페이스 AppDelegate.swift 함께 didFinishLaunching 수정에 enter image description here

다음 (대신 '홈페이지'의 LaunchScreen를 선택) 다음 사항을 DiscoverVC.swift은 다음과 같습니다

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

    window = UIWindow(frame: UIScreen.main.bounds) 
    let discoverVC = DiscoverVC() as UIViewController 
    let navigationController = UINavigationController(rootViewController: discoverVC) 
    navigationController.navigationBar.isTranslucent = false 
    self.window?.rootViewController = navigationController 
    self.window?.makeKeyAndVisible() 

    return true 
} 

을 :

import UIKit 

class DiscoverVC: UIViewController, SetLocationDelegate { 

    var name = "" 

    // to instantiate LocationVC once only for testing 
    var notVisted = true 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.view.backgroundColor = .yellow 
     loadLocationVCOnlyOnce() 
    } 

    func loadLocationVCOnlyOnce() { 
     // only visit one 
     guard notVisted else { return } 

     let locationVC = LocationVC() 
     locationVC.delegate = self 
     self.navigationController?.pushViewController(locationVC, animated: true) 

    } 

    func getLocation(loc: String) { 
     self.name = loc 
     print(name) 
    } 
} 

그리고 LocationVC은 다음과 같습니다

import UIKit 

protocol SetLocationDelegate: class { 
    func getLocation(loc: String) 
} 

class LocationVC: UIViewController { 

    weak var delegate: SetLocationDelegate? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.view.backgroundColor = .cyan 
     self.delegate?.getLocation(loc: "Sam") 


    } 

} 

시작할 때 자동으로 DiscoverVC (노란색 배경)에서 LocationVC (시안 색 배경)로 이동합니다.

상단의 '뒤로'버튼을 클릭하면 '샘'이 본체에 인쇄 된 것을 볼 수 있습니다. 그리고 귀하의 견해가 DiscoverVC (노란색 배경)로 돌아 왔습니다.

+0

스토리 보드를 사용하지 않습니다. 나는 프로그래밍 방식으로 모든 것을하는 것을 선호한다. 그것을 어떻게 할 수 있는가? –

+0

요청에 따라 스토리 보드를 사용하지 않고 위 내 대답을 업데이트했습니다. 그리고 대답이 만족 스럽다면 받아들이고 그것을 upvote하십시오. 다른 문제가 있으면 의견을 말하십시오. – Wismin