Interface Builder는 iOS 및 macOS 개발을 위해 Xcode에 내장된 비주얼 인터페이스 편집기입니다. 드래그 앤 드롭으로 UI를 만들고, Auto Layout을 구성하며, IBOutlet과 IBAction을 통해 코드를 연결할 수 있습니다. IB의 작동 방식, Storyboard와 XIB의 차이점, @IBDesignable이 필요한 이유를 살펴보겠습니다.
주요 포인트
Interface Builder는 사용자 인터페이스를 비주얼 디자인하기 위한 Xcode의 구성 요소입니다. IB의 역사는 1988년 NeXT에서 시작되었으며, iOS 등장보다 훨씬 이전입니다. Stefan Pope가 NeXTSTEP(macOS와 iOS의 기반이 된 운영 체제)용 첫 번째 버전을 개발했습니다. 1996년 Apple이 NeXT를 인수하고 Interface Builder를 Xcode에 통합했습니다.
최신 Xcode에서 Interface Builder는 Storyboard, XIB(Xcode Interface Builder), 테이블 셀용 XIB 파일 및 사용자 정의 뷰의 세 가지 파일 형식을 지원합니다. 각 형식은 UI 요소 계층 구조, 속성, 제약 조건 및 코드와의 연결에 대한 XML 설명을 저장합니다.
IB는 UIKit 수준에서 작동합니다. 버튼, 레이블, 텍스트 필드, 테이블, 컬렉션 및 제약 조건을 마우스로 캔버스에 드래그합니다. Xcode는 빌드 시 .storyboard 및 .xib 파일을 nib 아카이브(컴파일된 Interface Builder)로 컴파일하여 번들 크기를 줄이고 로딩 속도를 높입니다.
Apple에 따르면 UIKit 기반 iOS 프로젝트의 70% 이상이 다양한 개발 단계에서 Interface Builder를 사용합니다. SwiftUI의 성장에도 불구하고 IB는 iOS 12 이하를 지원하는 상용 애플리케이션과 Auto Layout의 미세 조정이 필요한 복잡한 사용자 정의 인터페이스의 표준으로 남아 있습니다.
Xcode 4 이전에는 Interface Builder가 코드 편집기와 별도로 실행되는 독립적인 애플리케이션이었습니다. Xcode 4(2011년)에서 Apple은 IB와 코드 편집기를 단일 IDE로 통합했습니다. 이를 통해 창 전환 없이 코드와 레이아웃 사이를 전환하고 Attributes Inspector 패널을 통해 실시간으로 속성 변경 사항을 확인할 수 있게 되었습니다.
| Xcode 버전 | 연도 | Interface Builder 변경 사항 |
|---|---|---|
| Xcode 3 | 2008 | IB — 별도 앱, iOS 2.0 지원 |
| Xcode 4 | 2011 | IB가 IDE에 통합, Storyboard 도입 |
| Xcode 5 | 2013 | 제약 조건 메뉴가 있는 Auto Layout, 화면 미리보기 |
| Xcode 6 | 2014 | Size Classes, @IBDesignable, Preview Assistant |
| Xcode 11 | 2019 | SwiftUI Canvas, IB는 UIKit용으로 유지 |
| Xcode 15 | 2023 | SwiftUI Preview가 주요 도구로, IB 레거시 모드 |
2019년 SwiftUI 도입으로 Apple은 선언적 개발에 초점을 전환했지만, Interface Builder는 UIKit 프로젝트를 지원하기 위해 Xcode에 계속 내장되어 있습니다. 수천 개의 기존 애플리케이션이 IB를 계속 사용하고 있으며, Apple은 제거를 발표하지 않았습니다.
Interface Builder는 Storyboard(.storyboard)와 XIB(.xib)의 두 가지 주요 형식을 지원합니다. 차이점은 범위와 사용 사례에 있습니다.
Storyboard는 전체 애플리케이션 장면을 포함하는 파일입니다. 여러 화면(UIViewController), 화면 간 전환(segues), 내비게이션 컨트롤러, 탭 바 및 모든 UI 요소를 포함합니다. Storyboard는 UIMainStoryboardFile(k) 키를 통해 Info.plist에서 시작 시 한 번 로드됩니다. 화면 흐름을 시각화하는 데 편리하지만, 전체 애플리케이션의 XML 설명이 단일 파일에 저장되므로 git에서 병합 충돌 문제가 발생합니다.
XIB(Xcode Interface Builder의 약자)는 단일 구성 요소를 위한 파일입니다. 개별 UIView, UITableViewCell, UICollectionViewCell 또는 하나의 ViewController용입니다. XIB는 UINib(nibName:bundle:)(k) 또는 Bundle.loadNibNamed(k) 메서드를 통해 필요 시 로드됩니다. XIB 파일은 병합이 더 쉽고, 더 작고, 전체 애플리케이션 설명을 포함하지 않으므로 로딩이 더 빠릅니다.
| 기준 | Storyboard | XIB |
|---|---|---|
| 범위 | 여러 화면 + 전환 | 하나의 화면 또는 구성 요소 |
| Segues | 지원(push, modal, unwind) | 지원 안 함 |
| Git 병합 | 어려움(하나의 큰 XML) | 쉬움(여러 작은 파일) |
| 로딩 | 앱 시작 시 | 필요 시(지연 로딩) |
| 재사용성 | storyboard 참조로만 가능 | 높음(셀, 헤더, 뷰) |
| Apple 권장 사항 | 대규모 프로젝트에 비권장 | 구성 요소에 권장 |
Xcode 11부터 Apple은 개별 구성 요소에는 XIB를 사용하고 단일 대형 Storyboard는 피할 것을 권장합니다. 화면 간 내비게이션은 수동으로 UIStoryboardSegue(k) 또는 코디네이터를 통한 코드 기반 내비게이션이 선호됩니다.
.storyboard 및 .xib 파일은 Interface Builder Cocoa Touch XIB(dt) 형식으로 XML을 저장합니다. 단순화된 구조의 예:
<!-- XIB file with UIView and UILabel -->
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB"
version="3.0">
<objects>
<view id="abc-123"
userLabel="CustomHeaderView"
contentMode="scaleToFill">
<subviews>
<label id="def-456"
text="Title"
textColor="darkTextColor"
fontDescription="title1"/>
</subviews>
</view>
</objects>
</document>각 요소에는 IB가 XML 노드를 런타임 객체에 연결하는 고유한 id(an)가 있습니다. 컴파일 중에 Xcode는 XML을 바이너리 nib 형식(.nib)으로 변환하여 파일 크기를 약 40% 줄입니다.
Auto Layout은 수학적 관계(제약 조건)를 통해 화면에 요소를 배치하는 시스템입니다. Interface Builder는 코드를 작성하지 않고 제약 조건을 생성, 편집 및 디버깅하기 위한 비주얼 인터페이스를 제공합니다. 각 제약 조건은 종속성을 설명합니다: view.leading = superview.leading + 16(k) 또는 view.width = 2 * otherView.height(k).
IB에서 제약 조건은 Pin 메뉴(여백, 너비, 높이 고정)와 Align 메뉴(가운데 맞춤, 가장자리, 기준선)를 통해 생성됩니다. Size Inspector 패널은 선택한 요소의 모든 제약 조건, 우선 순위(required/high/low)를 표시하고 배율 및 상수 편집을 허용합니다.
IB는 UIStackView도 지원합니다. 이는 자식 뷰의 레이아웃을 자동으로 관리하는 컨테이너입니다. 캔버스의 스택 뷰에 요소를 배치하기만 하면 IB가 필요한 제약 조건을 자동으로 생성합니다. 이는 수동 제약 조건 배치에 비해 레이아웃 속도를 크게 향상시킵니다.
Size Classes는 화면 너비와 높이별로 기기를 그룹화하는 추상화입니다: Compact 및 Regular. 조합(iPhone 세로는 wC hR, iPad는 wR hR)을 통해 다양한 시나리오에 대해 다른 제약 조건과 요소 레이아웃을 지정할 수 있습니다. Interface Builder에서 size classes 간 전환은 캔버스의 활성 제약 조건 집합을 변경합니다.
| 기기 | 방향 | Width Class | Height Class |
|---|---|---|---|
| iPhone(Max/Plus 제외) | 세로 | Compact | Regular |
| iPhone(Max/Plus 제외) | 가로 | Compact | Compact |
| iPhone Plus/Max | 가로 | Regular | Compact |
| iPad | 모든 방향 | Regular | Regular |
| iPad Split View | 1/3 화면 | Compact | Regular |
Size class 변형이 있는 제약 조건의 예:
import UIKit
class AdaptiveViewController: UIViewController {
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var leadingConstraint: NSLayoutConstraint!
private func updateConstraints() {
let isRegular = traitCollection.horizontalSizeClass == .regular
leadingConstraint.constant = isRegular ? 40 : 16
titleLabel.font = isRegular
? UIFont.preferredFont(forTextStyle: .largeTitle)
: UIFont.preferredFont(forTextStyle: .title1)
}
override func traitCollectionDidChange(
_ previousTraitCollection: UITraitCollection?
) {
super.traitCollectionDidChange(previousTraitCollection)
if traitCollection.horizontalSizeClass != previousTraitCollection?.horizontalSizeClass {
updateConstraints()
}
}
}위 코드에서 traitCollectionDidChange는 size class 변경에 반응하여 제약 조건과 글꼴을 업데이트합니다. Interface Builder는 인스펙터를 통해 각 size class의 기본값을 설정할 수 있으며, 코드는 정적으로 설명할 수 없는 동적 시나리오에 사용됩니다.
Interface Builder의 비주얼 인터페이스와 Swift/Objective-C 코드 간의 연결은 IBOutlet(Interface Builder Outlet)과 IBAction(Interface Builder Action)이라는 두 가지 메커니즘을 통해 이루어집니다. 둘 다 IB 캔버스에서 컨트롤러 파일로 Ctrl+드래그하여 생성됩니다.
IBOutlet은 UI 요소에 대한 참조를 선언하는 어노테이션입니다. Xcode는 로드 시 nib 아카이브의 해당 객체에 자동으로 연결합니다. 연결이 끊어지면(예: 요소 이름 변경) 애플리케이션이 NSUnknownKeyException(k) 오류와 함께 충돌합니다. IBOutlet은 weak(k)으로 표시됩니다. nib이 객체를 소유하고 컨트롤러는 단순한 관찰자이기 때문입니다.
IBAction은 UI 요소 이벤트(버튼 탭, 텍스트 변경, 스위치 토글)에서 호출되는 메서드입니다. IB는 addTarget:action:forControlEvents:(k)를 통해 UIControlEvent(k)를 메서드에 연결합니다. 코드에서 IBAction은 반환 타입이 IBAction(dt)인 일반 메서드처럼 보입니다.
import UIKit
final class LoginViewController: UIViewController {
@IBOutlet weak var emailTextField: UITextField!
@IBOutlet weak var passwordTextField: UITextField!
@IBOutlet weak var loginButton: UIButton!
@IBOutlet weak var spinner: UIActivityIndicatorView!
@IBAction private func loginButtonTapped(_ sender: UIButton) {
guard let email = emailTextField.text, !email.isEmpty,
let password = passwordTextField.text, !password.isEmpty
else {
showAlert(message: "Fill in all fields")
return
}
loginButton.isEnabled = false
spinner.startAnimating()
performLogin(email: email, password: password)
}
private func performLogin(email: String, password: String) {
/// API call via URLSession
let request = LoginRequest(email: email, password: password)
APIClient.shared.login(request) { [weak self] result in
DispatchQueue.main.async {
guard let self else { return }
self.spinner.stopAnimating()
self.loginButton.isEnabled = true
switch result {
case .success:
self.navigateToMainScreen()
case .failure(let error):
self.showAlert(message: error.localizedDescription)
}
}
}
}
private func showAlert(message: String) {
let alert = UIAlertController(
title: "Error",
message: message,
preferredStyle: .alert
)
alert.addAction(UIAlertAction(title: "OK", style: .default))
present(alert, animated: true)
}
}예제는 표준 설정을 보여줍니다: 텍스트 필드, 버튼 및 스피너용 IBOutlet, 탭 처리를 위한 IBAction. 이러한 모든 연결은 Interface Builder에서 Ctrl+드래그를 통해 설정됩니다. 연결이 구성되지 않은 경우 IBOutlet은 런타임에 nil(v)이 되어 액세스 시 충돌이 발생합니다. 따라서 IBOutlet은 암시적 언래핑과 함께 weak var(k s)로 선언됩니다.
@IBDesignable은 사용자 정의 UIView를 Interface Builder 캔버스에 실시간으로 직접 표시할 수 있는 Swift 어노테이션입니다. 개발자는 애플리케이션을 실행하지 않고 코드 변경 사항을 볼 수 있습니다. @IBInspectable은 속성용 어노테이션으로, IB의 Attributes Inspector 패널에 속성을 추가하여 값을 대화식으로 변경할 수 있습니다.
이러한 어노테이션은 UI 구성 요소 라이브러리(사용자 정의 버튼, 마스크된 입력 필드, 애니메이션 표시기)를 만들 때 특히 유용합니다. IBDesignable은 기본 애플리케이션 바이너리에 영향을 주지 않고 빌드 코드를 별도로 컴파일하기 위해 prepareForInterfaceBuilder()(fn)를 사용합니다.
import UIKit
@IBDesignable
final class GradientButton: UIButton {
@IBInspectable var startColor: UIColor = .systemBlue {
didSet { updateGradient() }
}
@IBInspectable var endColor: UIColor = .systemPurple {
didSet { updateGradient() }
}
@IBInspectable var cornerRadius: CGFloat = 12 {
didSet {
layer.cornerRadius = cornerRadius
layer.masksToBounds = true
}
}
private let gradientLayer = CAGradientLayer()
override init(frame: CGRect) {
super.init(frame: frame)
setupGradient()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
setupGradient()
}
override func layoutSubviews() {
super.layoutSubviews()
gradientLayer.frame = bounds
}
private func setupGradient() {
layer.insertSublayer(gradientLayer, at: 0)
updateGradient()
}
private func updateGradient() {
gradientLayer.colors = [startColor.cgColor, endColor.cgColor]
gradientLayer.startPoint = CGPoint(x: 0, y: 0.5)
gradientLayer.endPoint = CGPoint(x: 1, y: 0.5)
}
override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
setupGradient()
}
}위 코드에서 GradientButton은 IBInspectable 속성 startColor(v), endColor(v) 및 cornerRadius(v)가 있는 IBDesignable 구성 요소입니다. UIView를 IB 캔버스로 드래그하고 Identity Inspector에서 클래스를 GradientButton으로 변경하면 캔버스에 실시간으로 그라데이션 버튼이 표시됩니다. 모든 IBInspectable 속성이 오른쪽 Attributes Inspector 패널에 나타납니다.
중요: @IBDesignable은 IB 표시를 위해 전체 코드를 컴파일하므로 내부에서 네트워크 요청이나 긴 작업을 실행해서는 안 됩니다. 구분을 위해 #if TARGET_INTERFACE_BUILDER(k)가 사용됩니다. 이는 IB용이 아닌 코드를 제외하는 조건부 컴파일입니다.
Interface Builder 파일의 nib 생성부터 화면 표시까지의 변환 프로세스는 여러 단계를 포함합니다. 이 주기를 이해하면 IB 관련 문제를 진단하는 데 도움이 됩니다.
빌드 단계에서 Xcode는 ibtool(k, fn) 도구를 실행합니다. 이는 .storyboard 및 .xib 파일을 바이너리 nib 형식으로 컴파일하는 명령줄 유틸리티입니다. ibtool은 유효성 검사도 수행합니다: 제약 조건 정확성, 모든 클래스 존재, IBOutlet/IBAction 연결 유형 확인. 유효성 검사 오류는 Xcode Issue Navigator에 표시됩니다.
최종 .nib 아카이브는 .nib(s) 폴더의 애플리케이션 번들에 배치됩니다. nib 파일 크기는 원본 XML보다 훨씬 작습니다. 바이너리 형식은 문자열을 토큰으로 대체하고 숫자 값을 압축하는 최적화된 표현을 사용합니다. 일반적인 압축률은 원본 XML 크기의 50~60%입니다.
런타임에 nib는 UINib(nibName:bundle:)(k) 또는 자동으로 UIStoryboard.instantiateViewController(withIdentifier:)(k)를 통해 로드됩니다. 로딩 프로세스는 다음을 포함합니다:
awakeFromNib()(fn) — 로드 후 설정 진입점awakeFromNib()(fn) 메서드는 모든 IBOutlet이 설정된 후 첫 번째 layoutSubviews 전에 호출됩니다. 이는 초기 구성(모서리 둥글게, 그림자 추가, 텍스트 지역화)에 편리합니다. 그러나 awakeFromNib에서는 모든 IBOutlet이 nil이 아님이 보장됩니다.
2019년 SwiftUI 출시로 iOS 개발자는 Interface Builder의 대안인 실시간 Canvas Preview가 있는 선언적 프레임워크를 얻었습니다. 두 접근 방식의 주요 차이점을 살펴보겠습니다.
Interface Builder는 nib로 컴파일되는 XML 설명을 생성합니다. 인터페이스는 시각적으로 생성되고 코드는 로직만 처리합니다. IB는 프로그래밍 기술이 없는 디자이너에게 진입 장벽이 낮지만, 코드 리뷰가 어렵습니다(XML 변경 사항이 diff에 표시되지 않음).
SwiftUI Preview는 완전히 코드 기반 개발입니다. 인터페이스는 Swift로 설명되고 미리보기는 저장할 때마다 업데이트됩니다. XML, nib, 끊어진 IBOutlet 연결 위험이 없습니다. SwiftUI Preview는 별도의 파일을 컴파일할 필요가 없으므로 IB보다 빠르게 작동합니다.
| 기준 | Interface Builder(UIKit) | SwiftUI Preview |
|---|---|---|
| 파일 형식 | XML(.storyboard/.xib) → 바이너리 nib | Swift 코드(중간 파일 없음) |
| 미리보기 | 복잡한 뷰에서 지연이 있는 IB 캔버스 | 실시간 Canvas Preview |
| iOS 버전 지원 | iOS 2.0+(모든 버전) | iOS 13+ |
| Git 병합 | 문제 있음(하나의 XML 파일) | 쉬움(일반 Swift 코드) |
| 동적 데이터 | IBOutlet + 코드를 통해 | @State(k), @Observable(k) |
| 사용자 정의 뷰 | @IBDesignable(컴파일) | PreviewProvider가 있는 SwiftUI View |
| 성능 | 빠른 nib 로딩 | 즉시 Swift 컴파일 |
실제로 IB와 SwiftUI Preview 사이의 선택은 프로젝트 요구 사항에 따라 다릅니다. Interface Builder는 이전 iOS 버전을 지원하는 UIKit 애플리케이션과 Swift 기술이 없는 디자이너가 Xcode에서 작업하는 상용 프로젝트에 필수적입니다. SwiftUI는 개발 속도와 반응성이 중요한 iOS 17+를 대상으로 하는 새 프로젝트에 선호됩니다.
Apple은 Xcode에서 Interface Builder를 제거할 계획이 없습니다. 또한 Xcode 16에서 Apple은 IB 캔버스 성능을 개선하고 UIViewRepresentable Bridge를 통해 SwiftUI 구성 요소 지원을 추가했습니다. IB는 적어도 2030년까지 지원될 것으로 예상됩니다.
수년간의 iOS 개발 경험을 통해 상용 프로젝트에서 Interface Builder를 사용할 때 문제를 줄이는 일련의 권장 사항이 형성되었습니다.
재사용 가능한 구성 요소에는 Storyboard 대신 XIB를 사용하세요. 각 사용자 정의 테이블 셀, 헤더 또는 푸터는 별도의 XIB에 있어야 합니다. 이렇게 하면 병합이 쉬워지고, 로딩 속도가 빨라지며, Swift Package Manager 또는 CocoaPods를 통해 프로젝트 간에 구성 요소를 재사용할 수 있습니다.
큰 스토리보드를 모듈로 나누려면 Storyboard References를 구성하세요. 100개 화면의 하나의 Main.storyboard 대신 각 모듈(Auth, Profile, Feed)에 대한 스토리보드를 만들고 Storyboard Reference로 연결하세요. 이렇게 하면 ibtool 컴파일 시간이 줄어들고 팀 작업이 간소화됩니다.
확인 없이 File's Owner(k)에 IBOutlet 연결을 하지 마세요. 각 연결은 weak(k)이고 선택적이어야 합니다(암시적 언래핑 선택 사항은 playground에서만 훌륭합니다). 뷰에서 IBOutlet 이름을 변경하면 Xcode가 자동으로 연결을 업데이트하지만, 수동 XML 편집은 쉽게 오류를 유발할 수 있습니다.
Show Connection Panel(k) 확인 — 빨간색 표시기는 끊어진 연결을 나타냅니다User Defined Runtime Attributes(k)를 사용하여 코드 없이 속성 설정: layer.cornerRadius, layer.borderWidth, tintColorIdentifier(k) 할당 — 충돌 디버깅에 도움import UIKit
final class ProfileHeaderView: UIView {
@IBOutlet weak var avatarImageView: UIImageView!
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var bioLabel: UILabel!
@IBOutlet weak var editButton: UIButton!
override func awakeFromNib() {
super.awakeFromNib()
avatarImageView.layer.cornerRadius = avatarImageView.bounds.width / 2
avatarImageView.layer.masksToBounds = true
nameLabel.font = UIFont.preferredFont(forTextStyle: .headline)
bioLabel.font = UIFont.preferredFont(forTextStyle: .subheadline)
}
func configure(with profile: UserProfile) {
nameLabel.text = profile.fullName
bioLabel.text = profile.bio
/// Loading avatar via SDWebImage or Kingfisher
}
static func instantiateFromNib() -> ProfileHeaderView {
let nib = UINib(nibName: String(describing: self), bundle: nil)
return nib.instantiate(withOwner: nil).first as! ProfileHeaderView
}
}예제는 XIB 뷰의 모범 사례를 보여줍니다: 정적 메서드 instantiateFromNib(fn)는 클래스와 같은 이름의 XIB에서 뷰를 로드합니다. awakeFromNib(fn) 메서드는 UI를 구성하고(모서리 둥글게, 글꼴), configure(with:)(fn) 메서드는 채우기 위한 데이터 모델을 받습니다. 책임 분리는 테스트와 재사용을 단순화합니다.
자주 묻는 질문
Interface Builder는 Storyboard/XIB 형식의 UIKit용 비주얼 편집기로, 드래그 앤 드롭으로 작동합니다. SwiftUI Preview는 인터페이스가 Swift 코드로 설명되는 선언적 실시간 미리보기입니다. 두 도구 모두 Xcode에 내장되어 있지만, IB는 XML을 생성하고 SwiftUI는 Swift를 직접 컴파일합니다. IB는 iOS 2.0+, SwiftUI는 iOS 13+를 지원합니다.
아니요, Interface Builder는 SwiftUI와 직접 호환되지 않습니다. SwiftUI는 자체 선언적 구문과 Canvas Preview를 사용합니다. 그러나 IB를 통해 생성된 UIKit 프로젝트는 UIViewRepresentable을 통해 SwiftUI에 통합할 수 있고, SwiftUI 뷰는 UIHostingController를 통해 UIKit에 포함할 수 있습니다. 이를 통해 IB에서 SwiftUI로 점진적으로 마이그레이션할 수 있습니다.
@IBDesignable은 앱을 실행하지 않고 사용자 정의 UIView를 Interface Builder에 실시간으로 직접 표시하는 Swift 어노테이션입니다. @IBInspectable은 속성용 어노테이션으로, IB Attributes Inspector 패널에 속성을 추가합니다. 두 어노테이션 모두 사용자 정의 UI 구성 요소 개발을 가속화합니다: 인스펙터에서 속성을 변경하면 변경 사항이 즉시 캔버스에 표시됩니다.
Interface Builder의 Auto Layout은 Pin 메뉴(여백, 너비, 높이)와 Align 메뉴(가운데 맞춤, 기준선)를 통해 제약 조건을 정의합니다. 각 제약 조건은 뷰 간의 수학적 관계입니다. IB는 오류를 빨간색 선으로, 충돌을 노란색 경고로 표시합니다. IB의 Size Classes를 사용하면 코드 없이 기기와 방향에 따라 다른 제약 조건을 지정할 수 있습니다.
IBOutlet은 코드에서 UI 요소에 대한 참조를 위한 어노테이션입니다(예: @IBOutlet weak var label: UILabel!). IBAction은 이벤트에서 호출되는 메서드를 위한 어노테이션입니다(예: @IBAction func buttonTapped(_ sender: UIButton)). 연결은 IB 캔버스에서 컨트롤러 파일로 Ctrl+드래그하여 생성됩니다. 마우스를 놓으면 Xcode가 자동으로 연결 코드를 생성합니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.