Interface Builder:Xcodeでのビジュアルデザインとストーリーボード

著者: IT Sectr 公開日: 2026-02-12 読了時間: 15 分

Interface Builderは、iOSおよびmacOS開発用にXcodeに組み込まれたビジュアルインターフェースエディタです。ドラッグ&ドロップでのUI作成、Auto Layoutの設定、IBOutletとIBActionを介したコードの接続が可能です。IBの仕組み、StoryboardとXIBの違い、@IBDesignableが必要な理由を解説します。

重要なポイント

  • Interface Builder — レイアウトコードを書かずにUIKitインターフェースを作成するXcodeのビジュアルエディタ
  • Storyboardは複数の画面と画面間の遷移を記述し、XIBは1つのコンポーネントまたは画面を記述
  • Auto LayoutはIBのPin、Align、Resolve Issuesメニューで制約を設定
  • IBOutletIBActionはCtrl+ドラッグでSwiftコードをUI要素に接続
  • @IBDesignable@IBInspectableはカスタムビューをIBキャンバス上に直接表示

Interface Builderとは?

Interface Builderは、ユーザーインターフェースをビジュアルデザインするためのXcodeのコンポーネントです。IBの歴史は1988年のNeXTにまで遡り、iOSの登場よりずっと前のことです。Stefan PopeがNeXTSTEP(macOSとiOSの基盤となったオペレーティングシステム)向けに最初のバージョンを開発しました。1996年、AppleはNeXTを買収し、Interface BuilderをXcodeに統合しました。

現代のXcodeでは、Interface Builderは3つのファイル形式をサポートしています: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の微調整が必要な複雑なカスタムインターフェースの標準として残っています。

Interface BuilderがXcodeにどのようにして搭載されたか

Xcode 4より前は、Interface Builderはコードエディタと並行して起動する別のアプリケーションでした。Xcode 4(2011年)で、AppleはIBとコードエディタを単一のIDEに統合しました。これにより、ウィンドウを切り替えずにコードとレイアウトを切り替え、Attributes Inspectorパネルでリアルタイムにプロパティ変更を確認できるようになりました。

XcodeバージョンInterface Builderの変更点
Xcode 32008IB — 別アプリ、iOS 2.0対応
Xcode 42011IBがIDEに統合、Storyboardの登場
Xcode 52013制約メニュー付きAuto Layout、画面プレビュー
Xcode 62014Size Classes、@IBDesignable、Preview Assistant
Xcode 112019SwiftUI Canvas、IBはUIKit用に残る
Xcode 152023SwiftUI Previewが主要ツールに、IBはレガシーモード

2019年のSwiftUIの導入により、Appleは宣言的開発に焦点を移しましたが、Interface BuilderはUIKitプロジェクトをサポートするためにXcodeに組み込まれたままです。数千の既存アプリケーションがIBを使い続けており、Appleはその削除を発表していません。

StoryboardとXIB:IBファイル形式

Interface Builderは2つの主要な形式をサポートしています:Storyboard(.storyboard)とXIB(.xib)。これらの違いはスコープと使用ケースにあります。

Storyboardは、アプリケーションシーン全体を含むファイルです。複数の画面(UIViewController)、画面間の遷移(segues)、ナビゲーションコントローラー、タブバー、すべてのUI要素が含まれます。StoryboardはUIMainStoryboardFilek)キーを介してInfo.plistから起動時に1回だけ読み込まれます。これは画面フローの視覚化に便利ですが、アプリケーション全体のXML記述が1つのファイルに保存されるため、gitでのマージ競合に問題が生じます。

XIB(Xcode Interface Builderの略)は、単一のコンポーネント用のファイルです。個別のUIView、UITableViewCell、UICollectionViewCell、または1つのViewController用です。XIBはUINib(nibName:bundle:)k)またはBundle.loadNibNamedk)メソッドを介して必要に応じて読み込まれます。XIBファイルはマージが容易で、よりコンパクトで、アプリケーション全体の記述を含まないため読み込みが高速です。

基準StoryboardXIB
スコープ複数画面+遷移1画面またはコンポーネント
Segues対応(push、modal、unwind)非対応
Gitマージ困難(1つの大きなXML)簡単(多数の小ファイル)
読み込みアプリ起動時必要に応じて(遅延読み込み)
再利用性storyboard参照のみ高い(セル、ヘッダー、ビュー)
Appleの推奨大規模プロジェクトには非推奨コンポーネントに推奨

Xcode 11以降、Appleは個別のコンポーネントにはXIBを使用し、モノリシックなStoryboardを避けることを推奨しています。画面間のナビゲーションには、手動でのUIStoryboardSeguek)またはコーディネーターによるコードベースのナビゲーションが推奨されます。

IBファイルのXML構造

.storyboardファイルと.xibファイルはInterface Builder Cocoa Touch XIBdt)形式でXMLを保存します。簡略化された構造の例:

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>

各要素には一意のidan)があり、IBはこれによってXMLノードをランタイムオブジェクトにリンクします。コンパイル時に、XcodeはXMLをバイナリnib形式(.nib)に変換し、ファイルサイズを約40%削減します。

Interface BuilderのAuto LayoutとSize Classes

Auto Layoutは、数学的関係(制約)を通じて画面上の要素を配置するシステムです。Interface Builderは、コードを書かずに制約を作成、編集、デバッグするためのビジュアルインターフェースを提供します。各制約は依存関係を記述します:view.leading = superview.leading + 16k)またはview.width = 2 * otherView.heightk)。

IBでは、制約はPinメニュー(マージン、幅、高さの固定)とAlignメニュー(中央揃え、端、ベースライン)を介して作成されます。Size Inspectorパネルは、選択した要素のすべての制約、その優先度(required/high/low)を表示し、乗数と定数の編集を可能にします。

IBはUIStackViewもサポートしています。これは子ビューのレイアウトを自動管理するコンテナです。キャンバス上のスタックビューに要素を配置するだけで、IBが必要な制約を自動生成します。これにより、手動での制約配置と比較してレイアウトが大幅に高速化されます。

Size Classes:デバイスへの適応

Size Classesは、デバイスを画面の幅と高さでグループ化する抽象化です:CompactとRegular。組み合わせ(iPhone縦向きはwC hR、iPadはwR hR)により、シナリオに応じて異なる制約と要素レイアウトを指定できます。Interface Builderでsize classesを切り替えると、キャンバス上のアクティブな制約のセットが変更されます。

デバイス向きWidth ClassHeight Class
iPhone(Max/Plus除く)縦向きCompactRegular
iPhone(Max/Plus除く)横向きCompactCompact
iPhone Plus/Max横向きRegularCompact
iPad任意RegularRegular
iPad Split View1/3画面CompactRegular

Size Classバリエーション付き制約の例:

swift
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のデフォルト値を設定でき、コードは静的に記述できない動的なシナリオに使用されます。

IBOutlet、IBActionとコードとUIの接続

Interface BuilderのビジュアルインターフェースとSwift/Objective-Cコードの間の接続は、IBOutlet(Interface Builder Outlet)とIBAction(Interface Builder Action)の2つのメカニズムを介して行われます。どちらもIBキャンバスからコントローラーファイルへのCtrl+ドラッグで作成されます。

IBOutletは、UI要素への参照を宣言するアノテーションです。Xcodeは読み込み時にnibアーカイブ内の対応するオブジェクトに自動的に接続します。接続が切れると(要素名の変更など)、アプリケーションはNSUnknownKeyExceptionk)エラーでクラッシュします。IBOutletはweakk)としてマークされます。nibがオブジェクトを所有し、コントローラーは単なるオブザーバーだからです。

IBActionは、UI要素のイベント(ボタンタップ、テキスト変更、スイッチの切り替え)で呼び出されるメソッドです。IBはaddTarget:action:forControlEvents:k)を介してUIControlEventk)をメソッドに接続します。コードでは、IBActionは戻り値の型がIBActiondt)の通常のメソッドとして見えます。

swift
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は実行時にnilv)になり、アクセス時にクラッシュが発生します。そのため、IBOutletは暗黙的アンラップ付きのweak vark s)として宣言されます。

@IBDesignableと@IBInspectable:カスタムコンポーネント

@IBDesignableは、カスタムUIViewをInterface Builderキャンバス上にリアルタイムで直接表示できるようにするSwiftアノテーションです。開発者はアプリケーションを実行せずにコード変更を確認できます。@IBInspectableはプロパティ用のアノテーションで、IBのAttributes Inspectorパネルにプロパティを追加し、値をインタラクティブに変更できます。

これらのアノテーションは、UIコンポーネントライブラリ(カスタムボタン、マスク付き入力フィールド、アニメーションインジケーター)を作成する際に特に便利です。IBDesignableは、メインのアプリケーションバイナリに影響を与えずにビルドコードを個別にコンパイルするためにprepareForInterfaceBuilder()fn)を使用します。

swift
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プロパティstartColorv)、endColorv)、cornerRadiusv)を持つIBDesignableコンポーネントです。UIViewをIBキャンバスにドラッグし、Identity InspectorでクラスをGradientButtonに変更すると、キャンバス上にリアルタイムでグラデーションボタンが表示されます。すべてのIBInspectableプロパティが右側のAttributes Inspectorパネルに表示されます。

重要:@IBDesignableはIBでの表示用にコード全体をコンパイルするため、その内部でネットワークリクエストや長時間の操作を実行してはいけません。区別のために、#if TARGET_INTERFACE_BUILDERk)が使用されます。これはIB向けではないコードを除外する条件付きコンパイルです。

コンパイル時のIBファイルのライフサイクル

Interface Builderファイルのnib作成から画面表示までの変換プロセスには、いくつかの段階があります。このサイクルを理解することで、IB関連の問題を診断できます。

ビルド段階で、Xcodeはibtoolkfn)ツールを実行します。これは.storyboardと.xibファイルをバイナリnib形式にコンパイルするコマンドラインユーティリティです。ibtoolは検証も行います:制約の正確性、すべてのクラスの存在、IBOutlet/IBAction接続タイプのチェック。検証エラーはXcode Issue Navigatorに表示されます。

最終的な.nibアーカイブは、アプリケーションバンドルの.nibs)フォルダに配置されます。nibファイルのサイズは元のXMLよりも大幅に小さくなります。バイナリ形式では、文字列をトークンに置き換え、数値を圧縮する最適化された表現が使用されます。一般的な圧縮率は元のXMLサイズの50〜60%です。

実行時に、nibはUINib(nibName:bundle:)k)または自動的にUIStoryboard.instantiateViewController(withIdentifier:)k)を介して読み込まれます。読み込みプロセスには以下が含まれます:

  • デシリアライズ — バイナリnibからObjective-C/Swiftオブジェクトグラフへの変換
  • 作成 — アーカイブからのすべてのUI要素インスタンスの生成
  • 復元 — IBOutletとIBAction接続の復元(グループ用のoutletCollection)
  • 適用 — size classを考慮したアーカイブからのAuto Layout制約の適用
  • 呼び出し — 各オブジェクトのawakeFromNib()fn) — ロード後設定のエントリポイント

awakeFromNib()fn)メソッドは、すべてのIBOutletが設定された後、最初のlayoutSubviewsの前に呼び出されます。これは初期設定(角丸、影の追加、テキストのローカライズ)に便利です。ただし、awakeFromNibではすべてのIBOutletがnilでないことが保証されています。

Interface Builder vs SwiftUI Preview

2019年のSwiftUIのリリースにより、iOS開発者はInterface Builderに代わる選択肢を手に入れました。リアルタイムのCanvas Previewを備えた宣言的フレームワークです。2つのアプローチの主な違いを見てみましょう。

Interface Builderは、XML記述を生成し、それがnibにコンパイルされます。インターフェースは視覚的に作成され、コードはロジックのみを処理します。IBはプログラミングスキルのないデザイナーにとって参入障壁が低いですが、コードレビューが困難です(XMLの変更はdiffに表示されません)。

SwiftUI Previewは完全にコードベースの開発です。インターフェースはSwiftで記述され、保存のたびにプレビューが更新されます。XMLもnibもなく、IBOutlet接続が切れるリスクもありません。SwiftUI Previewは個別のファイルをコンパイルする必要がないため、IBよりも高速に動作します。

基準Interface Builder(UIKit)SwiftUI Preview
ファイル形式XML(.storyboard/.xib)→ バイナリnibSwiftコード(中間ファイルなし)
プレビュー複雑なビューでは遅延のあるIBキャンバスリアルタイムのCanvas Preview
iOSバージョン対応iOS 2.0+(全バージョン)iOS 13+
Gitマージ問題あり(1つのXMLファイル)簡単(通常のSwiftコード)
動的データIBOutlet + コード経由@Statek)、@Observablek
カスタムビュー@IBDesignable(コンパイル)PreviewProvider付きSwiftUI View
パフォーマンス高速なnib読み込み即時Swiftコンパイル

実際には、IBとSwiftUI Previewの選択はプロジェクトの要件に依存します。Interface Builderは、古いiOSバージョンをサポートするUIKitアプリケーションや、SwiftスキルのないデザイナーがXcodeで作業する商用プロジェクトに不可欠です。SwiftUIは、開発速度とリアクティビティが重要なiOS 17+をターゲットとする新規プロジェクトに適しています。

AppleはXcodeからInterface Builderを削除する予定はありません。さらに、Xcode 16では、IBキャンバスのパフォーマンスが改善され、UIViewRepresentable Bridgeを介したSwiftUIコンポーネントのサポートが追加されました。IBは少なくとも2030年までサポートされる見込みです。

Interface Builderを使用する際のベストプラクティス

長年のiOS開発経験により、商用プロジェクトでInterface Builderを使用する際の問題を減らすための一連の推奨事項が形成されました。

再利用可能なコンポーネントにはStoryboardではなくXIBを使用してください。カスタムテーブルセル、ヘッダー、フッターはそれぞれ個別のXIBに配置する必要があります。これによりマージが容易になり、読み込みが高速化され、Swift Package ManagerやCocoaPodsを介してプロジェクト間でコンポーネントを再利用できます。

大きなストーリーボードをモジュールに分割するには、Storyboard Referencesを設定します。100画面の1つのMain.storyboardの代わりに、モジュール(Auth、Profile、Feed)ごとにストーリーボードを作成し、Storyboard Referenceで接続します。これによりibtoolのコンパイル時間が短縮され、チーム作業が簡素化されます。

確認なしでFile's Ownerk)へのIBOutlet接続を行わないでください。各接続はweakk)かつオプショナルである必要があります(暗黙的アンラップ付きオプショナルはplaygroundでのみ優れています)。ビュー内のIBOutletの名前を変更すると、Xcodeは自動的に接続を更新しますが、手動でのXML編集は簡単にエラーを引き起こす可能性があります。

  • IBファイル編集後は常にShow Connection Panelk)を確認 — 赤いインジケーターは切断された接続を示します
  • User Defined Runtime Attributesk)を使用してコードなしでプロパティを設定:layer.cornerRadius、layer.borderWidth、tintColor
  • IBの制約を目的別にグループ化:サイズ用の制約、マージン用の制約、比率用の制約
  • Size Inspectorの各制約にIdentifierk)を割り当て — 競合のデバッグに役立ちます
  • awakeFromNibにビジネスロジックを配置しない — UI設定のみ。ロジックはviewDidLoadまたは個別のサービスに
swift
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ビューのベストプラクティスを示しています:静的メソッドinstantiateFromNibfn)はクラスと同じ名前のXIBからビューを読み込みます。awakeFromNibfn)メソッドはUI(角丸、フォント)を設定し、configure(with:)fn)メソッドは入力用のデータモデルを受け入れます。責任の分離により、テストと再利用が簡素化されます。

よくある質問

Interface BuilderとSwiftUI Previewの違いは何ですか?

Interface Builderは、Storyboard/XIB形式を使用したUIKit用のビジュアルエディタで、ドラッグ&ドロップで動作します。SwiftUI Previewは、インターフェースがSwiftコードで記述される宣言的なリアルタイムプレビューです。どちらのツールもXcodeに組み込まれていますが、IBはXMLを生成し、SwiftUIはSwiftを直接コンパイルします。IBはiOS 2.0+、SwiftUIはiOS 13+をサポートしています。

Interface BuilderをSwiftUIで使用できますか?

いいえ、Interface BuilderはSwiftUIと直接互換性がありません。SwiftUIは独自の宣言的構文とCanvas Previewを使用します。ただし、IBで作成されたUIKitプロジェクトはUIViewRepresentableを介してSwiftUIに統合でき、SwiftUIビューはUIHostingControllerを介してUIKitに埋め込むことができます。これにより、IBからSwiftUIへの段階的な移行が可能です。

@IBDesignableと@IBInspectableとは何ですか?

@IBDesignableは、アプリケーションを実行せずにカスタムUIViewをInterface Builderにリアルタイムで直接表示するSwiftアノテーションです。@IBInspectableはプロパティ用のアノテーションで、IBのAttributes Inspectorパネルにプロパティを追加します。両方のアノテーションはカスタムUIコンポーネントの開発を加速します:インスペクターでプロパティを変更するだけで、変更がすぐにキャンバスに表示されます。

Interface BuilderでAuto Layoutはどのように機能しますか?

Interface BuilderのAuto Layoutは、Pinメニュー(マージン、幅、高さ)とAlignメニュー(中央揃え、ベースライン)を介して制約を定義します。各制約はビュー間の数学的関係です。IBはエラーを赤い線で、競合を黄色い警告で表示します。IBのSize Classesを使用すると、コードを書かずにデバイスや向きに応じて異なる制約を指定できます。

IBOutletとIBActionを介してInterface Builderとコードを接続するには?

IBOutletは、コードからUI要素への参照のアノテーションです(例:@IBOutlet weak var label: UILabel!)。IBActionは、イベントで呼び出されるメソッドのアノテーションです(例:@IBAction func buttonTapped(_ sender: UIButton))。接続はIBキャンバスからコントローラーファイルへのCtrl+ドラッグで作成されます。マウスを離すと、Xcodeが自動的に接続コードを生成します。

まとめ

  • Interface Builder — 1988年(NeXTSTEP)からの歴史を持つUIKit用Xcodeビジュアルエディタ
  • Storyboardはプロトタイピングに、XIBは再利用可能なコンポーネントとプロダクションに適している
  • Auto LayoutSize ClassesはIBでコードなしのアダプティブインターフェースを可能にする
  • IBOutletIBActionはCtrl+ドラッグでコードをUIに接続し、Swiftプロパティを自動生成
  • @IBDesignable@IBInspectableはIBプレビューでのカスタムビュー開発を加速
  • SwiftUI Previewは新規プロジェクトでIBを置き換えつつあるが、IBはUIKitレガシーの標準
  • ベストプラクティス:StoryboardよりXIB、weak IBOutlet、制約の識別、awakeFromNibと設定の分離

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください