Interface Builder — isang visual na editor ng interface na naka-embed sa Xcode para sa iOS at macOS development. Nagbibigay-daan na lumikha ng UI sa pamamagitan ng drag-and-drop, i-configure ang Auto Layout, ikonekta ang code sa pamamagitan ng IBOutlet at IBAction. Susuriin natin kung paano gumagana ang IB, pagkakaiba ng Storyboard at XIB, at kung para saan ang @IBDesignable.
Mga Pangunahing Punto
Interface Builder — isang component ng Xcode na idinisenyo para sa visual na pagdisenyo ng mga user interface. Nagsimula ang kasaysayan ng IB noong 1988 sa kumpanyang NeXT, bago pa dumating ang iOS. Si Stefan Pope ang bumuo ng unang bersyon para sa NeXTSTEP — ang operating system na naging batayan ng macOS at iOS. Noong 1996, binili ng Apple ang NeXT at isinama ang Interface Builder sa Xcode.
Sa modernong Xcode, sinusuportahan ng Interface Builder ang tatlong format ng file: Storyboard, XIB (Xcode Interface Builder) at XIB file para sa mga table cell at custom views. Ang bawat isa sa mga format na ito ay nag-iimbak ng XML na paglalarawan ng hierarchy ng UI elements, kanilang mga property, constraints, at koneksyon sa code.
Gumagana ang IB sa antas ng UIKit: ang mga button, label, text field, table, koleksyon at constraints ay idin-drag gamit ang mouse papunta sa canvas. Kinokomple ng Xcode ang .storyboard at .xib file sa nib archives (compiled Interface Builder) sa yugto ng build, na nagpapaliit sa laki ng bundle at nagpapabilis ng pag-load.
Ayon sa Apple, higit sa 70% ng iOS projects sa UIKit ang gumagamit ng Interface Builder sa iba't ibang yugto ng development. Sa kabila ng paglago ng SwiftUI, nananatiling pamantayan ang IB para sa mga komersyal na application na sumusuporta sa iOS 12 pababa, gayundin para sa mga kumplikadong custom interface na nangangailangan ng fine-tuning ng Auto Layout.
Bago ang Xcode 4, ang Interface Builder ay isang hiwalay na application na tumatakbo kasabay ng code editor. Sa Xcode 4 (2011), pinagsama ng Apple ang IB at ang code editor sa iisang IDE. Ito ay nagbigay-daan sa paglipat sa pagitan ng code at layout nang hindi nagpapalit ng window, pati na rin ang pagtingin sa mga pagbabago ng property sa real-time sa pamamagitan ng panel ng Attributes Inspector.
| Xcode Version | Taon | Mga Pagbabago sa Interface Builder |
|---|---|---|
| Xcode 3 | 2008 | IB — hiwalay na app, suporta sa iOS 2.0 |
| Xcode 4 | 2011 | IB isinama sa IDE, lumitaw ang Storyboard |
| Xcode 5 | 2013 | Auto Layout na may constraint menu, preview ng screen |
| Xcode 6 | 2014 | Size Classes, @IBDesignable, Preview Assistant |
| Xcode 11 | 2019 | SwiftUI Canvas, nananatili ang IB para sa UIKit |
| Xcode 15 | 2023 | SwiftUI Preview bilang pangunahing tool, legacy mode ng IB |
Sa pagdating ng SwiftUI noong 2019, inilipat ng Apple ang pokus sa declarative development, gayunpaman ang Interface Builder ay nananatiling naka-embed sa Xcode para suportahan ang UIKit projects. Libu-libong umiiral na application ang patuloy na gumagamit ng IB, at hindi inanunsyo ng Apple ang pag-alis nito.
Sinusuportahan ng Interface Builder ang dalawang pangunahing format: Storyboard (.storyboard) at XIB (.xib). Ang pagkakaiba ay nasa saklaw at scenario ng paggamit.
Storyboard — isang file na naglalaman ng buong senaryo ng application: maraming screen (UIViewController), transition sa pagitan nila (segues), navigation controllers, tab bar at lahat ng UI elements. Ang Storyboard ay nilo-load nang isang beses sa pagsisimula mula sa Info.plist sa pamamagitan ng key na UIMainStoryboardFile (k). Ito ay maginhawa para sa visualization ng daloy ng screen, ngunit nagdudulot ng problema sa merge conflicts sa git dahil ang XML description ng buong application ay naka-imbak sa isang file.
XIB (daglat ng Xcode Interface Builder) — isang file para sa isang component: isang hiwalay na UIView, UITableViewCell, UICollectionViewCell o isang ViewController. Ang XIB ay nilo-load on demand sa pamamagitan ng UINib(nibName:bundle:) (k) o metodong Bundle.loadNibNamed (k). Ang XIB file ay mas madaling i-merge, mas compact at mas mabilis mag-load dahil hindi naglalaman ng description ng buong application.
| Pamantayan | Storyboard | XIB |
|---|---|---|
| Saklaw | Maraming screen + transition | Isang screen o component |
| Segues | Sinusuportahan (push, modal, unwind) | Hindi sinusuportahan |
| Merge sa git | Mahirap (isang malaking XML) | Simple (maraming maliliit na file) |
| Pag-load | Sa pagsisimula ng app | On demand (tamad) |
| Paggamit muli | Sa pamamagitan lang ng storyboard references | Mataas (cells, headers, views) |
| Rekomendasyon ng Apple | Hindi inirerekomenda para sa malalaking proyekto | Inirerekomenda para sa mga component |
Mula sa Xcode 11, inirerekomenda ng Apple ang paggamit ng XIB para sa mga indibidwal na component at pag-iwas sa mga monolithic Storyboard. Para sa navigation sa pagitan ng screen, mas gusto ang code navigation sa pamamagitan ng UIStoryboardSegue (k) nang manu-mano o mga coordinator.
Ang .storyboard at .xib file ay nag-iimbak ng XML sa format na Interface Builder Cocoa Touch XIB (dt). Halimbawa ng pinasimpleng istruktura:
<!-- XIB file na may UIView at 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="Pamagat"
textColor="darkTextColor"
fontDescription="title1"/>
</subviews>
</view>
</objects>
</document>Ang bawat elemento ay may natatanging id (an), kung saan ikinokonekta ng IB ang XML node sa runtime object. Sa compilation, ginagawang binary nib format (.nib) ng Xcode ang XML, binabawasan ang laki ng file ng humigit-kumulang 40%.
Auto Layout — isang sistema ng pagpoposisyon ng mga elemento sa screen sa pamamagitan ng mathematical relations (constraints). Ang Interface Builder ay nagbibigay ng visual na interface para sa paglikha, pag-edit at pag-debug ng constraints nang hindi nagsusulat ng code. Ang bawat constraint ay naglalarawan ng dependency: view.leading = superview.leading + 16 (k) o view.width = 2 * otherView.height (k).
Sa IB, ang constraints ay ginagawa sa pamamagitan ng menu na Pin(pag-aayos ng mga puwang, lapad, taas) at Align (pag-align sa gitna, mga gilid, baseline). Ang panel na Size Inspector ay nagpapakita ng lahat ng constraints ng napiling elemento, kanilang mga priyoridad (required/high/low) at nagbibigay-daan sa pag-edit ng mga multiplier at constant.
Sinusuportahan din ng IB ang UIStackView — isang container na awtomatikong namamahala sa pag-aayos ng child views. Sapat na ilagay ang mga elemento sa stack view sa canvas at awtomatikong bubuo ang IB ng kinakailangang constraints. Ito ay makabuluhang nagpapabilis ng layout kumpara sa manu-manong pag-setup ng constraints.
Size Classes — isang abstraction na nag-grupo ng mga device ayon sa lapad at taas ng screen: Compact at Regular. Ang mga kombinasyon (wC hR para sa iPhone portrait, wR hR para sa iPad) ay nagbibigay-daan sa pagtatakda ng iba't ibang constraints at pag-aayos ng elemento para sa iba't ibang scenario. Sa Interface Builder, ang paglipat sa pagitan ng size classes ay nagbabago sa set ng aktibong constraints sa canvas.
| Device | Orientasyon | Width Class | Height Class |
|---|---|---|---|
| iPhone (maliban sa Max/Plus) | Portrait | Compact | Regular |
| iPhone (maliban sa Max/Plus) | Landscape | Compact | Compact |
| iPhone Plus/Max | Landscape | Regular | Compact |
| iPad | Kahit ano | Regular | Regular |
| iPad Split View | 1/3 screen | Compact | Regular |
Halimbawa ng constraint na may variation ayon sa 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()
}
}
}Sa code sa itaas, ang traitCollectionDidChange ay tumutugon sa pagbabago ng size class, nag-a-update ng constraint at font. Ang Interface Builder ay nagbibigay-daan sa pagtatakda ng default values para sa bawat size class sa pamamagitan ng inspector, at ang code ay ginagamit para sa mga dynamic na scenario na hindi mailarawan nang static.
Ang ugnayan sa pagitan ng visual na interface sa Interface Builder at Swift/Objective-C code ay ginagawa sa pamamagitan ng dalawang mekanismo: IBOutlet (Interface Builder Outlet) at IBAction (Interface Builder Action). Pareho itong ginagawa sa pamamagitan ng pag-drag gamit ang Ctrl key mula sa IB canvas papunta sa controller file.
IBOutlet — isang annotation na nagdedeklara ng reference sa isang UI element. Awtomatiko itong ikinokonekta ng Xcode sa kaukulang object sa nib archive kapag nag-load. Kung maputol ang koneksyon (halimbawa, pinalitan ng pangalan ang elemento), babagsak ang app na may error na NSUnknownKeyException (k). Ang IBOutlet ay minamarkahan bilang weak (k), dahil ang nib ang may-ari ng object, at ang controller ay tagamasid lamang.
IBAction — isang method na tinatawag sa kaganapan ng UI element: pagpindot ng button, pagbabago ng text, pagpalit ng switch. Ikinokonekta ng IB ang UIControlEvent (k) sa method sa pamamagitan ng addTarget:action:forControlEvents: (k). Sa code, ang IBAction ay mukhang isang ordinaryong method na may return type na 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: "Punan ang lahat ng field")
return
}
loginButton.isEnabled = false
spinner.startAnimating()
performLogin(email: email, password: password)
}
private func performLogin(email: String, password: String) {
/// API call sa pamamagitan ng 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)
}
}Ang halimbawa ay nagpapakita ng karaniwang ugnayan: IBOutlet para sa text fields, button at spinner, IBAction para sa paghawak ng pagpindot. Lahat ng ugnayang ito ay itinatakda sa Interface Builder sa pamamagitan ng Ctrl+drag. Kung hindi na-configure ang koneksyon, ang IBOutlet ay magiging nil (v) sa runtime, na magdudulot ng crash kapag na-access — kaya ang IBOutlet ay idineklara bilang weak var (k s) na may implicit unwrap.
@IBDesignable — isang annotation ng Swift na nagbibigay-daan na magpakita ng custom UIView direkta sa Interface Builder canvas sa real-time. Nakikita ng developer ang resulta ng mga pagbabago sa code nang hindi pinapatakbo ang application. @IBInspectable — isang annotation para sa mga property na nagdaragdag sa kanila sa panel ng Attributes Inspector ng IB, kung saan maaaring baguhin ang mga value nang interactive.
Ang mga annotation na ito ay lalong kapaki-pakinabang sa paggawa ng mga library ng UI component: custom buttons, input field na may mask, animated indicator. Gumagamit ang IBDesignable ng prepareForInterfaceBuilder() (fn) para sa hiwalay na compilation ng build code na hindi nakakaapekto sa pangunahing binary ng application.
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()
}
}Sa code sa itaas, ang GradientButton ay isang IBDesignable component na may IBInspectable properties na startColor (v), endColor (v) at cornerRadius (v). Kapag nag-drag ng UIView sa IB canvas at pinalitan ang class sa GradientButton sa Identity Inspector, magpapakita ang canvas ng button na may gradient sa real-time. Lahat ng IBInspectable properties ay lalabas sa panel ng Attributes Inspector sa kanan.
Mahalaga: @IBDesignable ay kumokomple ng code nang buo para sa pagpapakita sa IB, kaya hindi dapat magsagawa ng network requests o mahabang operasyon sa loob nito. Para sa pagkakaiba, ginagamit ang #if TARGET_INTERFACE_BUILDER (k) — conditional compilation na nag-exclude ng code na hindi para sa IB.
Ang proseso ng pagbabago ng Interface Builder file mula sa paggawa ng nib hanggang sa pagpapakita sa screen ay may kasamang ilang yugto. Ang pag-unawa sa cycle na ito ay tumutulong sa pag-diagnose ng mga problema sa IB.
Sa yugto ng build, pinapatakbo ng Xcode ang tool na ibtool (k, fn) — isang command-line utility para sa pag-compile ng .storyboard at .xib file sa binary nib format. Ang ibtool ay nagsasagawa rin ng validation: sinusuri ang correctness ng constraints, pagkakaroon ng lahat ng klase, mga uri ng IBOutlet/IBAction connections. Ang mga error sa validation ay ipinapakita sa Issue Navigator ng Xcode.
Ang huling .nib archive ay inilalagay sa bundle ng application sa folder na .nib (s). Ang laki ng nib file ay makabuluhang mas maliit kaysa sa orihinal na XML: ang binary format ay gumagamit ng optimized representation na may pagpapalit ng mga string sa token at compression ng numeric values. Ang tipikal na compression ay 50–60% ng orihinal na laki ng XML.
Sa runtime, ang nib ay nilo-load sa pamamagitan ng UINib(nibName:bundle:) (k) o awtomatiko sa pamamagitan ng UIStoryboard.instantiateViewController(withIdentifier:) (k). Ang proseso ng pag-load ay kinabibilangan ng:
awakeFromNib() (fn) para sa bawat object — entry point para sa post-load configurationAng method na awakeFromNib() (fn) ay tinatawag pagkatapos ma-set ang lahat ng IBOutlet, ngunit bago ang unang layoutSubviews. Ito ay maginhawa para sa paunang configuration: pag-set ng rounding, pagdagdag ng shadow, pag-localize ng text. Gayunpaman, lahat ng IBOutlet ay garantisadong hindi nil sa awakeFromNib.
Sa paglabas ng SwiftUI noong 2019, nakatanggap ang iOS developers ng alternatibo sa Interface Builder — isang declarative framework na may Canvas Preview sa real-time. Susuriin natin ang mga pangunahing pagkakaiba ng dalawang approach.
Interface Builder ay gumagawa ng XML description na kino-compile sa nib. Ang interface ay ginagawa nang visual, ang code ay responsable lamang para sa logic. Ang IB ay nangangailangan ng mas mababang entry threshold para sa mga designer na walang programming skills, ngunit mahirap sa code review (hindi nakikita ang XML changes sa diff).
SwiftUI Preview — ganap na code-based development. Ang interface ay inilalarawan sa Swift, ang preview ay nag-a-update sa bawat pag-save. Walang XML, walang nib, walang panganib ng naputol na IBOutlet connections. Mas mabilis gumana ang SwiftUI Preview kaysa IB dahil hindi nangangailangan ng compilation ng hiwalay na file.
| Pamantayan | Interface Builder (UIKit) | SwiftUI Preview |
|---|---|---|
| Format ng file | XML (.storyboard / .xib) → binary nib | Swift code (walang intermediate file) |
| Preview | IB canvas na may delay sa mga complex view | Canvas Preview sa real-time |
| Suporta sa iOS version | iOS 2.0+ (lahat ng version) | iOS 13+ |
| Merge sa git | Problematic (isang XML file) | Simple (ordinaryong Swift code) |
| Dynamic na data | Sa pamamagitan ng IBOutlet + code | @State (k), @Observable (k) |
| Custom views | @IBDesignable (compilation) | SwiftUI View na may PreviewProvider |
| Performance | Mabilis na pag-load ng nib | Just-in-time compilation ng Swift |
Sa praktika, ang pagpili sa pagitan ng IB at SwiftUI Preview ay depende sa requirements ng proyekto. Interface Builder ay kailangang-kailangan para sa UIKit applications na sumusuporta sa lumang iOS, gayundin para sa mga komersyal na proyekto kung saan ang mga designer ay nagtatrabaho sa Xcode nang walang kaalaman sa Swift. Ang SwiftUI ay mas gusto para sa mga bagong proyekto na naka-target sa iOS 17+, kung saan mahalaga ang bilis ng development at reactivity.
Hindi pinaplano ng Apple na alisin ang Interface Builder mula sa Xcode. Higit pa rito, sa Xcode 16, pinabuti ng kumpanya ang performance ng IB canvas at nagdagdag ng suporta para sa SwiftUI components sa pamamagitan ng UIViewRepresentable Bridge. Inaasahan na ang IB ay susuportahan pa hanggang hindi bababa sa 2030.
Ang maraming taon na karanasan sa iOS development ay bumuo ng isang set ng rekomendasyon na nagbabawas ng bilang ng mga problema sa paggamit ng Interface Builder sa mga komersyal na proyekto.
Gamitin ang XIB sa halip na Storyboard para sa mga reusable component. Ang bawat custom table cell, header o footer ay dapat nasa hiwalay na XIB. Ito ay nagpapadali ng merge, nagpapabilis ng pag-load at nagbibigay-daan sa muling paggamit ng mga component sa pagitan ng proyekto sa pamamagitan ng Swift Package Manager o CocoaPods.
I-configure ang Storyboard References para sa paghahati ng malalaking storyboard sa mga module. Sa halip na isang Main.storyboard na may 100 screen, gumawa ng hiwalay na storyboard para sa bawat module (Auth, Profile, Feed) at ikonekta ang mga ito sa pamamagitan ng Storyboard Reference. Ito ay magbabawas ng compilation time ng ibtool at magpapasimple ng team work.
Iwasan ang IBOutlet connections sa File's Owner (k) nang walang check. Ang bawat connection ay dapat na weak (k) at opsyonal (ang implicitly unwrapped optional ay maganda lang sa playground). Kapag pinalitan ng pangalan ang IBOutlet sa isang view, awtomatikong ina-update ng Xcode ang connection, ngunit sa manual editing ng XML ay madaling magkamali.
Show Connection Panel (k) pagkatapos i-edit ang IB file — ang pulang indicator ay nagpapahiwatig ng naputol na connectionsUser Defined Runtime Attributes (k) para mag-set ng properties nang walang code: layer.cornerRadius, layer.borderWidth, tintColorIdentifier (k) sa bawat constraint sa Size Inspector — ito ay tumutulong sa debugging ng conflictsimport 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
/// Pag-load ng avatar sa pamamagitan ng SDWebImage o Kingfisher
}
static func instantiateFromNib() -> ProfileHeaderView {
let nib = UINib(nibName: String(describing: self), bundle: nil)
return nib.instantiate(withOwner: nil).first as! ProfileHeaderView
}
}Ang halimbawa ay nagpapakita ng best practice para sa XIB view: static method na instantiateFromNib (fn) ay naglo-load ng view mula sa XIB na may parehong pangalan ng klase. Ang method na awakeFromNib (fn) ay nag-configure ng UI (rounding, fonts), at ang method na configure(with:) (fn) ay tumatanggap ng data model para sa pagpuno. Ang paghihiwalay ng responsibilidad ay nagpapadali ng testing at muling paggamit.
Mga Madalas Itanong
Interface Builder — visual na editor para sa UIKit na may Storyboard/XIB format, gumagana sa pamamagitan ng drag-and-drop. SwiftUI Preview — declarative preview sa real-time, kung saan ang interface ay inilalarawan gamit ang Swift code. Parehong tool ay naka-embed sa Xcode, ngunit ang IB ay gumagawa ng XML, habang ang SwiftUI ay direktang kumokomple ng Swift. Sinusuportahan ng IB ang iOS 2.0+, SwiftUI — iOS 13+.
Hindi, ang Interface Builder ay hindi direktang compatible sa SwiftUI. Gumagamit ang SwiftUI ng sarili nitong declarative syntax at Canvas Preview. Gayunpaman, ang UIKit projects na ginawa sa pamamagitan ng IB ay maaaring isama sa SwiftUI sa pamamagitan ng UIViewRepresentable, at ang SwiftUI views ay maaaring i-embed sa UIKit sa pamamagitan ng UIHostingController. Ito ay nagbibigay-daan sa unti-unting paglipat mula IB patungong SwiftUI.
@IBDesignable — isang Swift annotation na nagpapakita ng custom UIView direkta sa Interface Builder sa real-time nang hindi pinapatakbo ang application. @IBInspectable — isang annotation para sa properties na nagdaragdag sa kanila sa Attributes Inspector panel ng IB. Ang parehong annotation ay nagpapabilis ng development ng custom UI components: baguhin lang ang property sa inspector — agad na makikita ang pagbabago sa canvas.
Ang Auto Layout sa Interface Builder ay nagtatakda ng constraints sa pamamagitan ng Pin menu (spacing, width, height) at Align (centering, baseline). Bawat constraint ay isang mathematical relation sa pagitan ng views. Ipinapakita ng IB ang errors na may pulang linya, conflicts na may dilaw na babala. Ang Size Classes sa IB ay nagbibigay-daan sa pagtatakda ng iba't ibang constraints para sa iba't ibang device at orientation nang hindi nagsusulat ng code.
IBOutlet — isang annotation para sa reference sa UI element mula sa code (halimbawa @IBOutlet weak var label: UILabel!). IBAction — isang annotation para sa method na tinatawag sa event (halimbawa @IBAction func buttonTapped(_ sender: UIButton)). Ang connection ay ginagawa sa pamamagitan ng Ctrl+drag mula sa IB canvas papunta sa controller file. Awtomatikong bumubuo ang Xcode ng connection code kapag nag-release ng mouse.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din