Interface Builder — iOS ve macOS geliştirme için Xcode'a entegre edilmiş görsel bir arayüz düzenleyicisidir. UI'yi drag-and-drop ile oluşturmayı, Auto Layout'u yapılandırmayı, kodu IBOutlet ve IBAction aracılığıyla bağlamayı sağlar. IB'nin nasıl çalıştığını, Storyboard ve XIB arasındaki farkları ve @IBDesignable'ın ne işe yaradığını inceleyelim.
Ana Noktalar
Interface Builder — kullanıcı arayüzlerinin görsel olarak tasarlanması için Xcode'un bir bileşenidir. IB'nin tarihi, iOS'tan çok önce, 1988 yılında NeXT şirketinde başladı. Stefan Pope, macOS ve iOS'un temelini oluşturan işletim sistemi NeXTSTEP için ilk sürümü geliştirdi. 1996 yılında Apple, NeXT'i satın aldı ve Interface Builder'ı Xcode'a entegre etti.
Modern Xcode'da Interface Builder üç dosya biçimini destekler: Storyboard, XIB (Xcode Interface Builder) ve tablo hücreleri ve özel view'lar için XIB dosyaları. Bu biçimlerin her biri, UI öğeleri hiyerarşisinin, özelliklerinin, constraint'lerinin ve kod bağlantılarının XML tanımını saklar.
IB, UIKit düzeyinde çalışır: düğmeler, etiketler, metin alanları, tablolar, koleksiyonlar ve constraint'ler fare ile tuval üzerine sürüklenir. Xcode, .storyboard ve .xib dosyalarını derleme aşamasında nib arşivlerine (compiled Interface Builder) dönüştürerek bundle boyutunu küçültür ve yüklemeyi hızlandırır.
Apple verilerine göre, UIKit üzerindeki iOS projelerinin %70'inden fazlası geliştirmenin çeşitli aşamalarında Interface Builder'ı kullanmaktadır. SwiftUI'nin yükselişine rağmen, IB, iOS 12 ve altını destekleyen ticari uygulamalar için ve Auto Layout'un ince ayarını gerektiren karmaşık özel arayüzler için standart olmaya devam etmektedir.
Xcode 4'ten önce Interface Builder, kod düzenleyiciye paralel olarak çalıştırılan ayrı bir uygulamaydı. Xcode 4'te (2011) Apple, IB ve kod düzenleyiciyi tek bir IDE'de birleştirdi. Bu, pencere değiştirmeden kod ve layout arasında geçiş yapmayı ve Attributes Inspector paneli aracılığıyla özellik değişikliklerini gerçek zamanlı olarak görmeyi sağladı.
| Xcode Sürümü | Yıl | Interface Builder'daki Değişiklikler |
|---|---|---|
| Xcode 3 | 2008 | IB — ayrı uygulama, iOS 2.0 desteği |
| Xcode 4 | 2011 | IB IDE'ye entegre edildi, Storyboard'lar geldi |
| Xcode 5 | 2013 | Constraint menülü Auto Layout, ekran önizlemesi |
| Xcode 6 | 2014 | Size Classes, @IBDesignable, Preview Assistant |
| Xcode 11 | 2019 | SwiftUI Canvas, IB UIKit için kalıyor |
| Xcode 15 | 2023 | SwiftUI Preview ana araç olarak, IB legacy modu |
2019'da SwiftUI'nin gelişiyle Apple, bildirimsel geliştirmeye odaklandı, ancak Interface Builder, UIKit projelerini desteklemek için Xcode'da yerleşik olarak kalmaya devam ediyor. Binlerce mevcut uygulama IB'yi kullanmaya devam ediyor ve Apple kaldırılacağını duyurmadı.
Interface Builder iki ana biçimi destekler: Storyboard (.storyboard) ve XIB (.xib). Aralarındaki fark, kapsam ve kullanım senaryosundadır.
Storyboard — uygulamanın tüm sahnesini içeren dosya: birden çok ekran (UIViewController), aralarındaki geçişler (segues), navigasyon denetleyicileri, sekmeli çubuklar ve tüm UI öğeleri. Storyboard, başlatma sırasında Info.plist'ten UIMainStoryboardFile (k) anahtarı aracılığıyla bir kez yüklenir. Ekran akışını görselleştirmek için kullanışlıdır, ancak tüm uygulamanın XML tanımı tek bir dosyada saklandığından git'te merge çakışmalarına neden olur.
XIB (Xcode Interface Builder'ın kısaltması) — tek bir bileşen için dosya: ayrı bir UIView, UITableViewCell, UICollectionViewCell veya tek bir ViewController. XIB, ihtiyaç halinde UINib(nibName:bundle:) (k) veya Bundle.loadNibNamed (k) yöntemi aracılığıyla yüklenir. XIB dosyalarını merge etmek daha kolaydır, daha kompakttır ve tüm uygulamanın tanımını içermedikleri için daha hızlı yüklenirler.
| Kriter | Storyboard | XIB |
|---|---|---|
| Kapsam | Birden çok ekran + geçişler | Tek ekran veya bileşen |
| Segues | Destekler (push, modal, unwind) | Desteklemez |
| Git'te Merge | Zor (tek büyük XML) | Basit (çok sayıda küçük dosya) |
| Yükleme | Uygulama başlangıcında | İhtiyaç halinde (tembel) |
| Yeniden Kullanım | Sadece storyboard referanslarıyla | Yüksek (hücreler, header'lar, view'lar) |
| Apple Tavsiyesi | Büyük projeler için önerilmez | Bileşenler için önerilir |
Xcode 11 sürümünden itibaren Apple, tek tek bileşenler için XIB kullanılmasını ve monolitik Storyboard'lardan kaçınılmasını önermektedir. Ekranlar arasında gezinme için UIStoryboardSegue (k) ile manuel kod tabanlı navigasyon veya koordinatörler tercih edilir.
.storyboard ve .xib dosyaları, XML'i Interface Builder Cocoa Touch XIB (dt) biçiminde saklar. Basitleştirilmiş yapı örneği:
<!-- UIView ve UILabel içeren XIB dosyası -->
<?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="Başlık"
textColor="darkTextColor"
fontDescription="title1"/>
</subviews>
</view>
</objects>
</document>Her öğenin, IB'nin XML düğümünü runtime nesnesine bağladığı benzersiz bir id'si (an) vardır. Derleme sırasında Xcode, XML'i ikili nib biçimine (.nib) dönüştürerek dosya boyutunu yaklaşık %40 oranında azaltır.
Auto Layout — öğeleri matematiksel ilişkiler (constraint'ler) aracılığıyla ekranda konumlandırma sistemidir. Interface Builder, kod yazmadan constraint'ler oluşturmak, düzenlemek ve hata ayıklamak için görsel bir arayüz sağlar. Her constraint bir bağımlılığı tanımlar: view.leading = superview.leading + 16 (k) veya view.width = 2 * otherView.height (k).
IB'de constraint'ler Pin (kenar boşlukları, genişlik, yükseklik sabitleme) ve Align (ortaya, kenarlara, baseline hizalama) menüleri aracılığıyla oluşturulur. Size Inspector paneli, seçili öğenin tüm constraint'lerini, önceliklerini (required/high/low) gösterir ve çarpanları ve sabitleri düzenlemeye olanak tanır.
IB ayrıca UIStackView'ı da destekler — alt view'ların yerleşimini otomatik olarak yöneten bir kapsayıcı. Öğeleri tuvalde bir stack view'e yerleştirmek yeterlidir; IB gerekli constraint'leri otomatik olarak oluşturacaktır. Bu, manuel constraint yerleştirmeye kıyasla layout'u önemli ölçüde hızlandırır.
Size Classes — cihazları ekran genişliği ve yüksekliğine göre gruplandıran bir soyutlama: Compact ve Regular. Kombinasyonlar (iPhone dikey için wC hR, iPad için wR hR), farklı senaryolar için farklı constraint'ler ve öğe düzenleri belirlemeye olanak tanır. Interface Builder'da size classes arasında geçiş yapmak, tuvaldeki aktif constraint'ler kümesini değiştirir.
| Cihaz | Yön | Width Class | Height Class |
|---|---|---|---|
| iPhone (Max/Plus hariç) | Dikey | Compact | Regular |
| iPhone (Max/Plus hariç) | Yatay | Compact | Compact |
| iPhone Plus/Max | Yatay | Regular | Compact |
| iPad | Herhangi | Regular | Regular |
| iPad Split View | 1/3 ekran | Compact | Regular |
Size class'a göre değişiklik içeren constraint örneği:
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()
}
}
}Yukarıdaki kodda traitCollectionDidChange, size class değişikliğine tepki vererek constraint'i ve yazı tipini günceller. Interface Builder, her size class için denetçi aracılığıyla varsayılan değerler ayarlamaya olanak tanır ve kod, statik olarak tanımlanamayan dinamik senaryolar için kullanılır.
Interface Builder'daki görsel arayüz ile Swift/Objective-C kodu arasındaki bağlantı iki mekanizma aracılığıyla gerçekleşir: IBOutlet (Interface Builder Outlet) ve IBAction (Interface Builder Action). Her ikisi de IB tuvalinden Ctrl tuşuna basılıyken denetleyici dosyasına sürükleyerek oluşturulur.
IBOutlet — bir UI öğesine referans bildiren ek açıklamadır. Xcode, yükleme sırasında onu nib arşivindeki ilgili nesneye otomatik olarak bağlar. Bağlantı koparsa (örneğin, öğe yeniden adlandırılırsa), uygulama NSUnknownKeyException (k) hatasıyla çöker. IBOutlet, weak (k) olarak işaretlenir, çünkü nib nesneye sahiptir ve denetleyici yalnızca bir gözlemcidir.
IBAction — bir UI öğesi olayında çağrılan yöntemdir: düğmeye basma, metin değiştirme, anahtar değiştirme. IB, UIControlEvent'i (k) yönteme addTarget:action:forControlEvents: (k) aracılığıyla bağlar. Kodda IBAction, dönüş türü IBAction (dt) olan normal bir yöntem olarak görünür.
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: "Tüm alanları doldurun")
return
}
loginButton.isEnabled = false
spinner.startAnimating()
performLogin(email: email, password: password)
}
private func performLogin(email: String, password: String) {
/// URLSession ile API çağrısı
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: "Hata",
message: message,
preferredStyle: .alert
)
alert.addAction(UIAlertAction(title: "OK", style: .default))
present(alert, animated: true)
}
}Örnekte standart bir bağlantı gösterilmektedir: metin alanları, düğme ve spinner için IBOutlet, düğmeye basmayı işlemek için IBAction. Tüm bu bağlantılar Interface Builder'da Ctrl+drag aracılığıyla kurulur. Bağlantı yapılandırılmamışsa, IBOutlet çalışma zamanında nil (v) olur ve erişimde çökmeye neden olur — bu nedenle IBOutlet, implicit unwrap ile weak var (k s) olarak bildirilir.
@IBDesignable — özel bir UIView'i gerçek zamanlı olarak doğrudan Interface Builder tuvalinde görüntülemeye olanak tanıyan Swift ek açıklamasıdır. Geliştirici, uygulamayı başlatmadan kod değişikliklerinin sonucunu görür. @IBInspectable — özellikleri IB'nin Attributes Inspector paneline ekleyen ve değerlerin etkileşimli olarak değiştirilmesine olanak tanıyan ek açıklamadır.
Bu ek açıklamalar, UI bileşen kitaplıkları oluştururken özellikle kullanışlıdır: özel düğmeler, maskeli giriş alanları, animasyonlu göstergeler. IBDesignable, uygulamanın ana ikili dosyasını etkilemeyen ayrı bir derleme için prepareForInterfaceBuilder() (fn) kullanır.
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()
}
}Yukarıdaki kodda GradientButton, startColor (v), endColor (v) ve cornerRadius (v) IBInspectable özelliklerine sahip bir IBDesignable bileşenidir. Tuvaldeki bir UIView'i sürükleyip Identity Inspector'da sınıfı GradientButton olarak değiştirdiğinizde, tuvalde gerçek zamanlı olarak gradyanlı bir düğme görüntülenecektir. Tüm IBInspectable özellikleri sağdaki Attributes Inspector panelinde görünecektir.
Önemli: @IBDesignable, IB'de görüntüleme için kodu tamamen derler, bu nedenle içinde ağ istekleri veya uzun işlemler yapılmamalıdır. Ayrım için #if TARGET_INTERFACE_BUILDER (k) kullanılır — IB için tasarlanmamış kodu hariç tutan koşullu derleme.
Interface Builder dosyalarının nib oluşturmadan ekranda görüntülemeye kadar dönüşüm süreci birkaç aşamadan oluşur. Bu döngüyü anlamak, IB ile ilgili sorunları teşhis etmeye yardımcı olur.
Derleme aşamasında Xcode, ibtool (k, fn) aracını çalıştırır — .storyboard ve .xib dosyalarını ikili nib biçimine derlemek için bir komut satırı yardımcı programı. ibtool ayrıca doğrulama da yapar: constraint'lerin doğruluğunu, tüm sınıfların varlığını, IBOutlet/IBAction bağlantı türlerini kontrol eder. Doğrulama hataları Xcode'un Issue Navigator'ında görüntülenir.
Son .nib arşivi, uygulama paketindeki .nib (s) klasörüne yerleştirilir. Nib dosyasının boyutu, orijinal XML'den önemli ölçüde daha küçüktür: ikili biçim, dizelerin token'larla değiştirilmesi ve sayısal değerlerin sıkıştırılmasıyla optimize edilmiş bir temsil kullanır. Tipik sıkıştırma, orijinal XML boyutunun %50-60'ı kadardır.
Çalışma zamanında nib, UINib(nibName:bundle:) (k) veya otomatik olarak UIStoryboard.instantiateViewController(withIdentifier:) (k) aracılığıyla yüklenir. Yükleme süreci şunları içerir:
awakeFromNib() (fn) yönteminin her nesne için çağrılmasıawakeFromNib() (fn) yöntemi, tüm IBOutlet'ler ayarlandıktan sonra ancak ilk layoutSubviews'tan önce çağrılır. Bu, yuvarlama ayarlama, gölge ekleme, metin yerelleştirme gibi ilk yapılandırma için kullanışlıdır. Ancak, awakeFromNib'de tüm IBOutlet'lerin nil olmaması garanti edilir.
2019'da SwiftUI'nin piyasaya sürülmesiyle iOS geliştiricileri Interface Builder'a bir alternatif elde etti: gerçek zamanlı Canvas Preview ile bildirimsel bir framework. İki yaklaşım arasındaki temel farkları inceleyelim.
Interface Builder, nib'de derlenen XML tanımını oluşturur. Arayüz görsel olarak oluşturulur, kod yalnızca mantıktan sorumludur. IB, programlama becerisi olmayan tasarımcılar için daha düşük bir giriş eşiği gerektirir, ancak kod incelemesinde karmaşıktır (XML değişiklikleri diff'te görünmez).
SwiftUI Preview — tamamen kod tabanlı geliştirme. Arayüz Swift ile tanımlanır, önizleme her kaydetmede güncellenir. XML yok, nib yok, IBOutlet bağlantılarının kopma riski yok. SwiftUI Preview, ayrı bir dosyanın derlenmesini gerektirmediği için IB'den daha hızlı çalışır.
| Kriter | Interface Builder (UIKit) | SwiftUI Preview |
|---|---|---|
| Dosya biçimi | XML (.storyboard / .xib) → ikili nib | Swift kodu (ara dosya yok) |
| Önizleme | Karmaşık view'larda gecikmeli IB tuvali | Gerçek zamanlı Canvas Preview |
| iOS sürüm desteği | iOS 2.0+ (tüm sürümler) | iOS 13+ |
| Git'te Merge | Sorunlu (tek XML dosyası) | Basit (normal Swift kodu) |
| Dinamik veriler | IBOutlet + kod aracılığıyla | @State (k), @Observable (k) |
| Özel view'lar | @IBDesignable (derleme) | PreviewProvider ile SwiftUI View |
| Performans | Hızlı nib yükleme | Anında Swift derleme |
Pratikte, IB ve SwiftUI Preview arasındaki seçim proje gereksinimlerine bağlıdır. Interface Builder, eski iOS'u destekleyen UIKit uygulamaları ve Swift becerisi olmayan tasarımcıların Xcode'da çalıştığı ticari projeler için vazgeçilmezdir. SwiftUI, geliştirme hızı ve tepkiselliğin önemli olduğu iOS 17+ odaklı yeni projeler için tercih edilir.
Apple, Interface Builder'ı Xcode'dan kaldırmayı planlamıyor. Üstelik Xcode 16'da şirket, IB tuvalinin performansını iyileştirdi ve UIViewRepresentable Bridge aracılığıyla SwiftUI bileşenleri için destek ekledi. IB'nin en az 2030 yılına kadar desteklenmesi bekleniyor.
Yıllar süren iOS geliştirme deneyimi, ticari projelerde Interface Builder kullanırken sorunları azaltan bir dizi öneri oluşturmuştur.
Yeniden kullanılabilir bileşenler için Storyboard yerine XIB kullanın. Her özel tablo hücresi, header veya footer ayrı bir XIB'de olmalıdır. Bu, merge'i kolaylaştırır, yüklemeyi hızlandırır ve bileşenlerin Swift Package Manager veya CocoaPods aracılığıyla projeler arasında yeniden kullanılmasını sağlar.
Büyük storyboard'ları modüllere bölmek için Storyboard References yapılandırın. 100 ekranlı tek bir Main.storyboard yerine her modül için (Auth, Profile, Feed) bir storyboard oluşturun ve bunları Storyboard Reference ile bağlayın. Bu, ibtool derleme süresini azaltacak ve ekip çalışmasını basitleştirecektir.
Kontrolsüz File's Owner'a (k) IBOutlet bağlantılarından kaçının. Her bağlantı weak (k) ve isteğe bağlı olmalıdır (implicitly unwrapped optional yalnızca playground'da iyidir). Bir IBOutlet'i view'da yeniden adlandırırken Xcode bağlantıyı otomatik olarak günceller, ancak XML'i manuel olarak düzenlerken hata yapmak kolaydır.
Show Connection Panel'i (k) kontrol edin — kırmızı göstergeler kopuk bağlantıları belirtirUser Defined Runtime Attributes'ı (k) kullanın: layer.cornerRadius, layer.borderWidth, tintColorIdentifier (k) atayın — çakışmalarda hata ayıklamaya yardımcı olurimport 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
/// SDWebImage veya Kingfisher ile avatar yükleme
}
static func instantiateFromNib() -> ProfileHeaderView {
let nib = UINib(nibName: String(describing: self), bundle: nil)
return nib.instantiate(withOwner: nil).first as! ProfileHeaderView
}
}Örnekte XIB view'ları için en iyi uygulama gösterilmektedir: statik yöntem instantiateFromNib (fn), view'ı sınıfla aynı ada sahip XIB'den yükler. awakeFromNib (fn) yöntemi UI'yi yapılandırır (yuvarlamalar, yazı tipleri) ve configure(with:) (fn) yöntemi doldurma için bir veri modeli alır. Sorumlulukların ayrılması, test etmeyi ve yeniden kullanmayı kolaylaştırır.
Sıkça Sorulan Sorular
Interface Builder — drag-and-drop ile çalışan Storyboard/XIB biçimli UIKit için görsel düzenleyici. SwiftUI Preview — arayüzün Swift koduyla tanımlandığı gerçek zamanlı bildirimsel önizleme. Her iki araç da Xcode'a entegredir, ancak IB XML oluştururken SwiftUI doğrudan Swift derler. IB, iOS 2.0+'ı, SwiftUI — iOS 13+'ı destekler.
Hayır, Interface Builder SwiftUI ile doğrudan uyumlu değildir. SwiftUI kendi bildirimsel sözdizimini ve Canvas Preview'ı kullanır. Ancak, IB aracılığıyla oluşturulan UIKit projeleri UIViewRepresentable aracılığıyla SwiftUI'ye entegre edilebilir ve SwiftUI view'ları UIHostingController aracılığıyla UIKit'e gömülebilir. Bu, IB'den SwiftUI'ye kademeli geçişe olanak tanır.
@IBDesignable — uygulamayı başlatmadan özel bir UIView'i gerçek zamanlı olarak doğrudan Interface Builder'da görüntüleyen Swift ek açıklamasıdır. @IBInspectable — özellikleri IB'nin Attributes Inspector paneline ekleyen ek açıklamadır. Her iki ek açıklama da özel UI bileşenlerinin geliştirilmesini hızlandırır: denetçide bir özelliği değiştirmeniz yeterlidir; değişiklik tuvalde hemen görünür.
Interface Builder'da Auto Layout, constraint'leri Pin (kenar boşlukları, genişlik, yükseklik) ve Align (ortala, baseline) menüleri aracılığıyla belirler. Her constraint, view'lar arasında matematiksel bir ilişkidir. IB hataları kırmızı çizgilerle, çakışmaları sarı uyarılarla gösterir. IB'deki Size Classes, kod yazmadan farklı cihazlar ve yönler için farklı constraint'ler belirlemeye olanak tanır.
IBOutlet — koddan bir UI öğesine referans için ek açıklamadır (örneğin, @IBOutlet weak var label: UILabel!). IBAction — bir olayda çağrılan yöntem için ek açıklamadır (örneğin, @IBAction func buttonTapped(_ sender: UIButton)). Bağlantı, IB tuvalinden Ctrl+drag ile denetleyici dosyasına oluşturulur. Xcode, fare bırakıldığında otomatik olarak bağlantı kodunu oluşturur.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun