Swift 데이터 넘겨주는방법

    1. property를 넘겨주는방법
let detailVC = IntanceDetailViewController(
  nibName: "IntanceDetailViewController", bundle: nil)
//xib를 쓰는 컨트롤러를 가져올 때 사용

 self.present(detailVC, animated: false, completion: nil) //메모리에 올리기
 detailVC.someLabel.text = "vv"//근데 이것보다는 DetailViewController에 변수를 하나 만들어서 거기에 할당하는게 나음
    1. xib없이 세그웨이로만 연결될때 데이너 텀겨주는방법
if segue.identifier == "segueDetail" { //세그웨이:(스토리보드간 컨트롤러 연결줄)
            if let detailVC = segue.destination as? SegueDetailViewController {
                //segue.destination 이 SegueDetailViewController로 타입캐스팅이 되느냐
//                detailVC.dataLabel.text = "abcd"////화면 나올준비가 되지않은상태에서 보냈기때문에 오류가난다
                detailVC.dataString = "abcd"//그래서 
                
            }
        }
    1. viewcontroller 전체를 넘겨주는방법
  let detailVC = IntanceDetailViewController(nibName: "IntanceDetailViewController", bundle: nil)//xib를 쓰는 컨트롤러를 가져올 때 사용
        
        //detailVC.mainVC 타입 = ViewController
        detailVC.mainVC = self //나자신(ViewController)을 넘겨주는것 so 나자신에 대한것 모두 접근 가능, 사용가능
        
        self.present(detailVC , animated: true, completion: nil)//화면이동
    1. delegate 로 넘기는방법(프로토콜을 사용해서 DelegateDetailViewController에서 프로토콜로 정의된 기능만 접근가능하게하기)
let detailVC = DelegateDetailViewController(nibName: "DelegateDetailViewController", bundle: nil)
        
        //ViewController가 DelegateDetailViewControllerDelegate를 준수 하기 때문에 오류가 없어짐
        //DelegateDetailViewControllerDelegate 프로토콜에 있는 passString만 접근 가능
        detailVC.delegate = self
        self.present(detailVC, animated: true, completion: nil)

#####################################################
//DelegateDetailViewController
protocol DelegateDetailViewControllerDelegate:AnyObject {
    func passString(string: String)
}
class DelegateDetailViewController: UIViewController {

    //viewcontroller에서 DelegateDetailViewControllerDelegate 프로토콜에 정의된것만 self 로 보낸다
    weak var delegate: DelegateDetailViewControllerDelegate?
      
     @IBAction func passDataToMainVC(_ sender: Any) {
    
        //delegate가 없는동안에는 nil이기 때문에 실행이 안댐
        delegate?.passString(string: "delegate pass Data")
        
    }
}
  1. 클로저를 이용해서 넘기는 방법
   let detailVC = closureDetailViewController(nibName: "closureDetailViewController", bundle: nil)
        
        //detailVC 안에있는 closurePassData 클릭하면
        
        //구현부
        //moveToClosure버튼을 처음 누르면 myClosure가 nil이기 때문에 실행 x
        detailVC.myClosure = { str in
            self.dataLabel.text = str
            print("ac")
            print(str + "a")
        }
        self.present(detailVC, animated: true, completion: nil)
    }
    
    @IBAction func movetoNoti(_ sender: Any) {
        let detailVC = NotiDetailViewController(nibName: "NotiDetailViewController", bundle: nil)
        self.present(detailVC, animated: true, completion: nil)
    }
###########################################
//closureDetailViewController
var myClosure: ((String) -> Void)?
@IBAction func closurePassData(_ sender: Any) {
        
    myClosure?("closure String")
    self.dismiss(animated: true, completion: nil)
    } 
  1. notification을 이용해서 넘기는 방법
override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        let notificationName = Notification.Name("sendSomeString")
        
        //notificationName이 호출이 되면 showSomeString이 실행되도록 구조가 잡힘
        NotificationCenter.default.addObserver(self, selector: #selector(showSomeString), name: notificationName, object: nil)
        
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
  	/키보드나 나타날때 notificationcenter이 알려준다
        
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardDidShow), name: UIResponder.keyboardDidShowNotification, object: nil)
        
        NotificationCenter.default.removeObserver(self, name: notificationName, object: nil)
        
    }
    @objc func showSomeString(notification: Notification){
        if let str = notification.userInfo?["str"] as? String {
            self.dataLabel.text = str
        }
    
    }

    @objc func keyboardWillShow(){
        print("will show")
    }
    @objc func keyboardDidShow(){
        print("Did show")
    }

###################################
//NotiDetailViewController
 let notificationName = Notification.Name("sendSomeString")

        //post: 호출
        NotificationCenter.default.post(name: notificationName, object: nil, userInfo:["str":"noti String"])
  • 틀린게 있을 수 있어요

좋은 웹페이지 즐겨찾기