Intance Property
작성일
Passing data
- 1.intance property
intance property
- 클래스에 속해있는 변수를 넘겨주는 방법
@IBAction func 버튼의 이름(_ sender: Any) {
let detailVC = swift파일이름(nibName: [.xib파일이름], bundle: nil)
}
@IBAction func moveToDetail[버튼의 이름](_ sender: Any) {
let detailVC = DetailViewController(nibName: "DetailViewController", bundle: nil)
self.present(detailVC, animated: true, completion: nil)
}
DetialViewController를 인스턴스화 시켜야하하지만,
.xib기반으로 되어있기 때문에, nibName이라는 곳에 .xib파일이름을 넣어야한다.
그다음으로, 기본적으로 UIViewController가 가지고있는 기능중 하나인, present를 사용해야한다.
그다음에 인스턴스화 시킨 걸 넣어주고, animated는 true, completion은 nil로 지정해주면 된다.
하지만, 이건 화면만 옮겨준거지 데이터를 옮겨주는게 아니다.
옮겨주려면
class DetailViewController: UIViewController {
var someString = ""
@IBOutlet weak var someLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
someLabel.text = someString
}
}
이렇게 someString을 하나 만들고 화면에 someLabel을 가져온후,
viewDidLoad()에 someLabel.text에 someString을 넣어야한다.
그리고 난후,
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBAction func moveToDetail(_ sender: Any) {
let detailVC = DetailViewController(nibName: "DetailViewController", bundle: nil)
detailVC.someString = "aaa 스트링"
self.present(detailVC, animated: true, completion: nil)
}
}
이렇게 detailVC.someString에 값을 넣어주면 버튼을 눌렀을때 값도 같이 이동이 된다.
또 다른방법으로는 detailVC.someLabel이 있는데, 이거는 화면이랑 연동이 되어있는 property다.
특징은, viewDidLoad가 올라갈때 같이 올라간다. 즉 화면에 올리는 준비를하는 present라는 기능을 호출한 다음에,
넣어야 정상적으로 실행이 된다.
@IBAction func moveToDetail(_ sender: Any) {
let detailVC = DetailViewController(nibName: "DetailViewController", bundle: nil)
detailVC.someLabel.text = "bb"
self.present(detailVC, animated: true, completion: nil)
}
위에 처럼 정상적으로 작동하지 않는다, 그 이유는 화면을 올리기 전이기 떄문이다.
하지만,
@IBAction func moveToDetail(_ sender: Any) {
let detailVC = DetailViewController(nibName: "DetailViewController", bundle: nil)
self.present(detailVC, animated: true, completion: nil)
detailVC.someLabel.text = "bb"
}
이런식으로 present, 즉 화면을 올려주고 난후에 적으면 정상적으로 잘 작동이된다.
그 차이는,
class DetailViewController: UIViewController {
var someString = ""
@IBOutlet weak var someLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
someLabel.text = someString
}
}
에서 someString은 클래스가 생성되는 시점에서 무조건 생성되는 property이고,
IBOulet은 화면에 올라갈 준비가 됐을떄 생성되는 property이기 때문이다.
충돌을 방지하기 위해서, 클래스가 생성될때 같이 생성되는 somString같은 변수를 만들어 놓고,
다음에 그거를 viewDidLoad()시점에 그 레이블에 값을 넣어논다는 someLabel.text = someString 같은 코드르 넣어 놓는것이다.