Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Empty State表示共通化の事例 / Case of empty state commo...
Search
kentaro
December 18, 2018
Technology
3.9k
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
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
11k
NDIAS CTF 2026 問題解説会資料
bata_24
0
180
デジタル・デザイン構想 by Sayaka Ishizuka
y150saya
0
200
キャリアの中で本を作る / Making a Book During Your Career
ak1210
0
120
20260702_生成AIはどこまで成長するのか_チャットだけじゃない世界
doradora09
PRO
0
110
どうして今サーバーサイドKotlinを選択したのか
nealle
0
210
SRE Lounge Hiroshimaへの招待
grimoh
0
410
Kotlin 開発のツラミを爆破した話! / Explode the difficulty of Kotlin dev!
eller86
0
150
AIペネトレーションテスト・ セキュリティ検証「AgenticSec」紹介資料
laysakura
2
8.1k
勉強会企画をアプリで構造化してみた 〜そこで見えた、AIとの付き合い方〜 / I've structured a study group plan using an app.
pauli
0
330
product engineering with qa
nealle
0
150
ヘルスケア領域における AI 活用と その安全性担保のための取り組み (Leveraging AI in Healthcare and Our Efforts to Ensure Its Safety) - Google I/O Extended Tokyo 2026, July 11, 2026
zettaittenani
0
180
Featured
See All Featured
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
220
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
How to Talk to Developers About Accessibility
jct
2
280
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
380
Bash Introduction
62gerente
615
220k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
67
56k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
890
How STYLIGHT went responsive
nonsquared
100
6.2k
Site-Speed That Sticks
csswizardry
13
1.2k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
260
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ͰָΛͯ͠ ྗΛೖΕΔ͖ͱ͜Ζʹ ྗͰ͖ΔΑ͏ʹͳΔͱϋοϐʔ