Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Empty State表示共通化の事例 / Case of empty state commo...
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
kentaro
December 18, 2018
Technology
4k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Empty State表示共通化の事例 / Case of empty state commonization
potatotips #57の資料です。
https://potatotips.connpass.com/event/109263/
kentaro
December 18, 2018
Other Decks in Technology
See All in Technology
外国人エンジニアがVueプロトタイプで仕様を合わせている話 / Vue Fes Japan 2026 LT
eluwing
0
300
Microsoft のサポート ライフサイクルを理解する
murachiakira
PRO
0
230
How we choose session proposals
kawaguti
PRO
1
190
reInvent2026stby LT00 "Change your life!"
shinichirokawano
1
450
AI駆動開発におけるハーネスエンジニアリングの勘所
tsukuboshi
1
860
スクラム祭り2026福井トラック_閉じたループから価値のスパイラルへ
kc_nakanishi
0
200
契約で守るコンパウンドプロダクトのデザインシステム
yug1224
1
1.6k
クラウドエージェントの先駆け Devin。今も最先端を走る、他との違い
kinopeee
1
510
Claude Code on Bedrock で統制をかける小ネタ集/claude-code-bedrock-governance-tips
emiki
1
13k
AIエージェント時代、Kaggleにどう取り組むか
takanao
2
390
2拠点SRE活動始めてみた | sogaoh's LT @ ホンマでっかSRE勉強会 #3
sogaoh
PRO
0
160
AWS Continuum for Penetration Testing に Deep Dive してみる
asanoharuki
2
1.4k
Featured
See All Featured
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
1
290
The Spectacular Lies of Maps
axbom
PRO
1
1.1k
Making Projects Easy
brettharned
120
6.8k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
2
2.2k
For a Future-Friendly Web
brad_frost
184
11k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
430
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
560
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
590
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
From π to Pie charts
rasagy
1
420
Transcript
&NQUZ4UBUFදࣔڞ௨Խͷࣄྫ QPUBUPUJQT,FOUBSP5BHVDIJ !LFOLFOLFO@
֓ཁ ϧʔϧܾΊ ࣮ʹ͍ͭͯ Ξ δ Σ ϯ
μ
֓ཁ
&NQUZ4UBUFͷදࣔΛ౷Ұͨ͠ Կ Λ ͠ ͨ ͷ ͔
ը໘࡞࣌ʹσβΠϯɾ࣮͞Ε͍ͯͨ ը໘ʹΑͬͯද͕ࣔόϥόϥ σβΠϯɾ࣮Λʮߟ͑Δʯ͕ൃੜ ͳ ͥ ͬ ͨ ͷ ͔
C F G P S F
B G U F S
w ΞϓϦͷ&NQUZ4UBUFද͕ࣔ౷Ұ͞Εͨ w ίετݮʢاըɾσβΠϯɾ࣮ʣ Կ ͕ ಘ Β Ε ͨ
ͷ ͔
ϧʔϧܾΊ
σβΠφʔͱ૬ஊ ༷ɾσβΠϯͷϧʔϧΛܾΊͨ ֓ ཁ
จݴΛදࣔ͢Δ͚ͩʢ࠶ݕࡧͷػೳ͚ͭͳ͍ʣ $73Λ͍ͬͯͳ͍ γϯϓϧͳ༷Ͱ0, ༷
දࣔ͢ΔཁૉʹରԠͨ͠จݴΛఆΊΔ ༧ใ ʮ༧ใ͋Γ·ͤΜʯ จ ݴ
w ϑΥϯτͷαΠζɾΧϥʔΛ౷Ұ w 7JFXͷதԝʹϥϕϧΛஔ σ β Π ϯ
ϧʔϧFTBʹ·ͱΊͯνʔϜʹڞ༗ ʢશࣾһӾཡՄೳʣ ʢΤϯδχΞ͚ʹJ04࣮·ͱΊهࡌʣ υ Ω ϡ ϝ ϯ τ Խ
࣮
protocolͱenumΛͬͯ ൚༻తʹར༻Ͱ͖ΔΑ͏ʹ࣮͢Δ ํ
FOVNͰදࣔཁૉΛදݱ ରԠ͢Δจݴఆٛ จ ݴ
/// empty stateΛఆٛ͢Δenum enum EmptyState { /// ༧ case reservation
/// ςʔϒϧ case table // ʢଞলུʣ /// λΠτϧ var title: String { switch self { case .reservation: return NSLocalizedString("key_of_reservation", comment: "") case .table: return NSLocalizedString("key_of_table", comment: “") // ʢଞলུʣ } } }
QSJWBUFͰ࣮ ֎͔Β༨ܭͳૢ࡞ͤ͞ͳ͍ ݟ͕ͨ౷Ұ͞ΕΔ W J F X
/// empty state༻ͷView private final class EmptyStateView: UIView { ///
λΠτϧϥϕϧ private let titleLabel: UILabel = { let titleLabel = UILabel() // ϥϕϧͷઃఆ return titleLabel }() init(_ state: EmptyState) { super.init(frame: .zero) setup(with: state) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } /// ηοτΞοϓΛ͢Δ private func setup(with state: EmptyState) { titleLabel.text = state.title addSubview(titleLabel) titleLabel.edges(equalTo: self) } }
֎͔Β͍ͭ͜Λ͍͡Δ &NQUZ4UBUF7JFXͱಉ͡ϑΝΠϧʹ࣮ ) P M E F S
/// empty stateΛදࣔ͢ΔViewͷϗϧμʔ final class EmptyStateHolder { /// ຊϓϩύςΟܦ༝ͰviewͷisHiddenΛ֎͔Βηοτ͢Δ var
isHidden = false { didSet { view.isHidden = isHidden } } /// empty stateΛදࣔ͢ΔView /// /// fileprivateʹͯ͠༨ܭͳPropertyΛϑΝΠϧ֎͔Βૢ࡞ͤ͞ͳ͍ /// ͱ͢Δ͜ͱͰݟ͕ͨΞϓϦͰ౷Ұ͞ΕΔ͜ͱΛ୲อ fileprivate let view: EmptyStateView /// state͔ΒࣗΛੜ͢Δ /// 1ՕॴͰෳλΠϓͷEmptyStateΛग़͢ཁ͕݅ͳ͍લఏͷ࣮ /// /// - Parameter state: EmptyState init(_ state: EmptyState) { view = EmptyStateView(state) } }
ԼهΛࢀߟʹ&EHFʹର੍ͯ͠Λ͚ͭΔ 6*7JFXͷFYUFOTJPOΛ࣮ IUUQTTQFBLFSEFDLDPNLBNFJLFGBSFXFMMTOBQLJU ิ ɿ 7 J F X
ͷ F Y U F O T J P O
extension UIView { /// ࣗͷEdgeʹର੍ͯ͠Λ͚ͭΔ /// /// - Parameters: ///
- view: ੍ͷج४ͱͳΔview /// - offset: ੍ (σϑΥϧτ: .zero ) func edges(equalTo view: UIView, offset: UIEdgeInsets = .zero) { translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ topAnchor.constraint(equalTo: view.topAnchor, constant: offset.top), bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -offset.bottom), leftAnchor.constraint(equalTo: view.leftAnchor, constant: offset.left), rightAnchor.constraint(equalTo: view.rightAnchor, constant: -offset.right) ]) } }
ڞ௨Խ༻ͷQSPUPDPMΛ࡞ Q S P U P D P M
// MARK: - ڞ௨Խ༻ϓϩτίϧ /// empty stateදࣔϓϩτίϧ protocol EmptyStateDisplayable where
Self: UIResponder { /// empty stateΛදࣔ͢ΔViewͷϗϧμʔ var emptyStateHolder: EmptyStateHolder { get } /// emptyStateViewΛadd͢Δ func addEmptyStateView() }
6*7JFX$POUSPMMFSɾ6*7JFX ͦΕͧΕσϑΥϧτ࣮ΛՃ ʢجຊˢΛݺͿ͚ͩʣ Q S P U P D P
M F Y U F O T J P O
// MARK: - UIViewControllerͷ߹ extension EmptyStateDisplayable where Self: UIViewController {
/// emptyStateViewΛviewʹaddSubview͢Δ func addEmptyStateView() { view.addSubview(emptyStateHolder.view) emptyStateHolder.view.edges(equalTo: view) } } // MARK: - UIViewͷ߹ extension EmptyStateDisplayable where Self: UIView { /// emptyStateViewΛࣗʹaddSubview͢Δ func addEmptyStateView() { addSubview(emptyStateHolder.view) emptyStateHolder.view.edges(equalTo: self) } }
/// ར༻ଆͷ࣮ྫ /// EmptyStateDisplayableʹ४ڌͤ͞Δ final class SampleViewController: UIViewController, EmptyStateDisplayable {
/// EmptyStateDisplayableͷϓϩύςΟ /// ରԠ͢ΔEmptyState(enum)͔ΒॳظԽ let emptyStateHolder = EmptyStateHolder(.reservation) override func viewDidLoad() { super.viewDidLoad() // EmptyStateDisplayableͷϝιουΛݺEmptyStateView͕addSubView͞ΕΔ addEmptyStateView() // EmptyStateΛදࣔ͢Δ݅ʹ߹ΘͤͯemptyStateHolder.isHiddenʹΛηοτ emptyStateHolder.isHidden = false } }
&NQUZ4UBUFͰָΛͯ͠ ྗΛೖΕΔ͖ͱ͜Ζʹ ྗͰ͖ΔΑ͏ʹͳΔͱϋοϐʔ