[TIL] 트러블슈팅 기록

Eden·2024년 12월 9일
0

TIL

목록 보기
65/92
post-thumbnail

오류 1: SnapKit 관련 오류

  • 오류 메시지: Fatal error: Expected superview but found nil when attempting make constraint equalToSuperview.
원인
  1. addSubview를 호출하지 않고 SnapKit으로 제약을 설정한 경우.
    • 뷰 계층 구조에 추가되지 않은 뷰는 superview가 없으므로 제약 설정 시 오류가 발생.
  2. superview가 아직 초기화되지 않은 상태에서 제약을 설정하려 한 경우.
해결 방법
  • SnapKit으로 제약을 설정하기 전에 반드시 뷰를 addSubview로 추가해야 한다.
  • 뷰 계층 구조를 확인하고 올바른 순서로 코드 작성.
수정 코드
private func setupUI() {
    // 순서: addSubview -> 제약 설정
    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

원인
  1. addTarget 메서드 호출 시 self가 클래스 인스턴스가 아닌 클래스 자체를 참조.
  2. 버튼의 초기화와 addTarget 설정이 동시에 이루어져 self가 아직 초기화되지 않은 상태일 가능성.
  3. @objc 키워드 누락으로 인해 Selector가 올바르게 참조되지 못한 경우.
해결 방법
  1. addTarget 호출은 반드시 viewDidLoad 내에서 실행되도록 수정.
  2. @objc 키워드로 Selector 메서드를 선언.
수정 코드
override func viewDidLoad() {
    super.viewDidLoad()
    view.backgroundColor = .white
    setupUI()

    // addTarget 호출은 반드시 여기서 실행
    addButton.addTarget(self, action: #selector(addButtonTapped), for: .touchUpInside)
}

@objc private func addButtonTapped() {
    print("추가 버튼 클릭됨")
}

최종 코드 예시

import UIKit
import SnapKit

class MainViewController: UIViewController {
    // MARK: - UI Components
    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
    }()

    // MARK: - Life Cycle
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        setupUI()

        // addTarget 호출
        addButton.addTarget(self, action: #selector(addButtonTapped), for: .touchUpInside)
    }

    // MARK: - Setup Methods
    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()
        }
    }

    // MARK: - Actions
    @objc private func addButtonTapped() {
        print("추가 버튼 클릭됨")
        // TODO: Implement navigation to add new friend
    }
}
profile
Frontend🌐 and iOS

0개의 댓글