오류 1: SnapKit 관련 오류
- 오류 메시지:
Fatal error: Expected superview but found nil when attempting make constraint equalToSuperview
.
원인
addSubview
를 호출하지 않고 SnapKit으로 제약을 설정한 경우.
- 뷰 계층 구조에 추가되지 않은 뷰는 superview가 없으므로 제약 설정 시 오류가 발생.
- superview가 아직 초기화되지 않은 상태에서 제약을 설정하려 한 경우.
해결 방법
- SnapKit으로 제약을 설정하기 전에 반드시 뷰를
addSubview
로 추가해야 한다.
- 뷰 계층 구조를 확인하고 올바른 순서로 코드 작성.
수정 코드
private func setupUI() {
view.addSubview(titleLabel)
view.addSubview(addButton)
view.addSubview(tableView)
titleLabel.snp.makeConstraints { make in
make.top.equalTo(view.safeAreaLayoutGuide.snp.top).offset(16)
make.centerX.equalToSuperview()
}
addButton.snp.makeConstraints { make in
make.centerY.equalTo(titleLabel)
make.trailing.equalToSuperview().offset(-16)
}
tableView.snp.makeConstraints { make in
make.top.equalTo(titleLabel.snp.bottom).offset(16)
make.leading.trailing.bottom.equalToSuperview()
}
}
오류 2: 'self' refers to the method 'MainViewController.self', which may be unexpected
원인
addTarget
메서드 호출 시 self
가 클래스 인스턴스가 아닌 클래스 자체를 참조.
- 버튼의 초기화와
addTarget
설정이 동시에 이루어져 self
가 아직 초기화되지 않은 상태일 가능성.
@objc
키워드 누락으로 인해 Selector가 올바르게 참조되지 못한 경우.
해결 방법
addTarget
호출은 반드시 viewDidLoad
내에서 실행되도록 수정.
@objc
키워드로 Selector 메서드를 선언.
수정 코드
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
setupUI()
addButton.addTarget(self, action: #selector(addButtonTapped), for: .touchUpInside)
}
@objc private func addButtonTapped() {
print("추가 버튼 클릭됨")
}
최종 코드 예시
import UIKit
import SnapKit
class MainViewController: UIViewController {
private let titleLabel: UILabel = {
let label = UILabel()
label.text = "친구 목록"
label.font = UIFont.boldSystemFont(ofSize: 24)
label.textAlignment = .left
return label
}()
private let addButton: UIButton = {
let button = UIButton(type: .system)
button.setTitle("추가", for: .normal)
button.titleLabel?.font = UIFont.systemFont(ofSize: 18, weight: .medium)
button.setTitleColor(.gray, for: .normal)
return button
}()
private let tableView: UITableView = {
let tableView = UITableView()
tableView.backgroundColor = .white
return tableView
}()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
setupUI()
addButton.addTarget(self, action: #selector(addButtonTapped), for: .touchUpInside)
}
private func setupUI() {
view.addSubview(titleLabel)
view.addSubview(addButton)
view.addSubview(tableView)
titleLabel.snp.makeConstraints { make in
make.top.equalTo(view.safeAreaLayoutGuide.snp.top).offset(16)
make.centerX.equalToSuperview()
}
addButton.snp.makeConstraints { make in
make.centerY.equalTo(titleLabel)
make.trailing.equalToSuperview().offset(-16)
}
tableView.snp.makeConstraints { make in
make.top.equalTo(titleLabel.snp.bottom).offset(16)
make.leading.trailing.bottom.equalToSuperview()
}
}
@objc private func addButtonTapped() {
print("추가 버튼 클릭됨")
}
}