Slide 1

Slide 1 text

͓໾ཱͪςΫχοΫ࿈ൃ @yashigani Cocoaษڧձؔ੢ #61

Slide 2

Slide 2 text

yashigani id:yashigani_w @yashigani Mobile Application Engineer http://yashigani.hatenablog.com Hatena

Slide 3

Slide 3 text

એ఻

Slide 4

Slide 4 text

IUUQDPOOQBTTDPNFWFOU

Slide 5

Slide 5 text

IUUQDPOOQBTTDPNFWFOU

Slide 6

Slide 6 text

IUUQDPOOQBTTDPN FWFOU

Slide 7

Slide 7 text

ը໘αΠζʹ߹Θͤͯ 6*4DSPMM7JFXΛ ͍͍͔Μ͡ʹ͢Δ @yashigani Cocoaษڧձؔ੢ #61

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

͜Ε4ͩͱͲ͏ͳΔΜͰ͔͢ʁ ͏ʔΜɼεΫϩʔϧ͠·͢

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

ࠔͬͨ

Slide 14

Slide 14 text

ը໘αΠζຖʹϨΠΞ΢τ • ߴղ૾౓୺຤ • ը໘ϐολϦʹ޿͛ͯηϯλϦϯά͢Δ • ௿ղ૾౓୺຤ • ্Լʹద੾ͳϚʔδϯΛͱͬͯεΫϩʔϧ͢Δ

Slide 15

Slide 15 text

Ṝ͍ΑΔ஍ࠈ • UIScrollView + Auto Layout • ୭΋͕ϋϚΔϙΠϯτ • Mixed Approach or Pure Auto Layout Aploach • https://developer.apple.com/library/ios/ technotes/tn2154/_index.html • ઈରstoryboard͚ͩͰղܾ͍ͨ͠

Slide 16

Slide 16 text

ཱͪ͸͔ͩΔ2ͭͷ՝୊ • ը໘ʹೖΓ͖Βͳ͍ͱ͖͚ͩεΫϩʔϧ͍ͨ͠ • ্Լʹ࠷௿ݶͷϚʔδϯΛઃ͚͍͕ͨɼ༨༟͕͋Δ ৔߹͸ແࢹͯ͠ηϯλϦϯά͍ͨ͠

Slide 17

Slide 17 text

DPOUFOUTJ[F͸TVCWJFXͷ ੍໿ʹΑܾͬͯ·Δ

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

ηϯλϦϯάͰ͖ͨ

Slide 20

Slide 20 text

িಥ੍ͨ͠໿Λ ௥Ճ͢Δ

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

੍໿ʹ QSJPSJUZΛ͚ͭΔ

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

͜͏ͯ͠ ৺ʹฏԺ͕๚Εͨ

Slide 26

Slide 26 text

6*5BCMF7JFX%BUB4PVSDF ࣮૷ύλʔϯ @yashigani Cocoaษڧձؔ੢ #61

Slide 27

Slide 27 text

ͳͥ෼཭͢Δͷ͔ • ϙʔλϏϦςΟ • ςετ༰қੑ • storyboardʹஔ͚Δ • view controllerΛdata sourceʹґଘͤ͞Δ • prepareForSegueͰϓϦϛςΟϒͳσʔλΛ΍Γͱ Γͨ͘͠ͳ͍

Slide 28

Slide 28 text

TVCTDSJQUΛ࣮૷͢Δ

Slide 29

Slide 29 text

class DataSource: NSObject { var models: [Model] = [] subscript(indexPath: NSIndexPath) -> Model? { return models.isEmpty ? nil : models[indexPath.row] } } extension DataSource: UITableViewDataSource { func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { switch self[indexPath] { case .Some(let m): let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! ModelCell cell.configure(m) return cell default: abort() } } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return models.count } }

Slide 30

Slide 30 text

TFDUJPOΛ௥Ճ͢Δ

Slide 31

Slide 31 text

enum Section: Int { case SectionA = 0 case SectionB = 1 var title: String { switch self { case .SectionA: return "SectionA" case .SectionB: return "SectionB" default: return "" } } } class DataSource: NSObject { var sectionA: [Model] = [] var sectionB: [Model] = [] }

Slide 32

Slide 32 text

class DataSource: NSObject { subscript(section: Int) -> [Model]? { if let section = Section(rawValue: section) { let models: [Model] switch section { case .SectionA: models = sectionA case .SectionB: models = sectionB } return models } else { return nil } } subscript(indexPath: NSIndexPath) -> Model? { if let models = self[indexPath.section] { return models.isEmpty ? nil : models[indexPath.row] } else { return nil } } }

Slide 33

Slide 33 text

extension DataSource: UITableViewDataSource { func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { switch self[indexPath] { case .Some(let m): let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! ModelCell cell.configure(m) return cell default: abort() } } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self[section]?.count ?? 0 } }

Slide 34

Slide 34 text

ઃܭ΋Α͘ͳͬͨ͠ ܕ҆શʹͳͬͨ

Slide 35

Slide 35 text

8,8FC7JFXΛ γϡοͱ࢖͏།Ұͷํ๏ @yashigani Cocoaษڧձؔ੢ #61

Slide 36

Slide 36 text

͓ͳ΍ΈϙΠϯτ • WKUIDelegateͷ࣮૷ • ΞϥʔτΛॲཧ͢Δ͚ͩ • webView(_:createWebViewWithConfiguration:forNa vigationAction:windowFeatures:) -> WKWebView! • ΋͏KVO͸ॻ͖ͨ͘ͳ͍ • storyboard͔Β௥ՃͰ͖ͳ͍

Slide 37

Slide 37 text

8FC,JU1MVT IUUQTHJUIVCDPNZBTIJHBOJ8FC,JU1MVT

Slide 38

Slide 38 text

8,6*%FMFHBUF1MVT

Slide 39

Slide 39 text

• alert()ͷσϑΥϧτ࣮૷ • ຖ౓ಉ͡΋ͷΛ࣮૷͠ͳͯ͘΋͍͍ • target=“_blank”ͳϦϯΫ΋ϩʔυͰ͖Δ • ΋ͪΖΜ৔߹ʹΑͬͯ͸ผͷWKWebViewʹ • ࠩ͠ସ͑Δ͜ͱ΋Մೳ

Slide 40

Slide 40 text

lazy var UIDelegate = WKUIDelegatePlus(self) override public func viewDidLoad() { super.viewDidLoad() webView.UIDelegate = UIDelegate }

Slide 41

Slide 41 text

8FC7JFX0CTFSWFS

Slide 42

Slide 42 text

• WKWebView͸KVO compliantͳproperty͕ଟ͍ • ͔͠͠KVOͳͲॻ͖ͨ͘͸ͳ͍ • ؔ਺ͰobserveͰ͖ΔΑ͏ʹαϙʔτ

Slide 43

Slide 43 text

lazy var observer = WebViewObserver(self.webView) override public func viewDidLoad() { super.viewDidLoad() observer.onTitleChanged = { [weak self] in self?.title = $0 } observer.onProgressChanged = { [weak self] in self?.progressbar.progress = $0 } }

Slide 44

Slide 44 text

;FO8FC7JFX$POUSPMMFS

Slide 45

Slide 45 text

• Zen = “ષ” • viewͷ࠷Լ૚ʹWKWebViewΛࠩ͠ࠐΉ • WKWebViewૢ࡞ͷͨΊͷIBAction • goBack/goForward/reload/stopLoading • WKUIDelegatePlus, WebViewObserverΛ࣮૷ • storyboard͔Β࢖͑Δͧʂʂʂ

Slide 46

Slide 46 text

%FNP4JNQMF#SPXTFS

Slide 47

Slide 47 text

ͱʹ͔͘ ͍·͙͢࢖ͬͯ͘Ε

Slide 48

Slide 48 text

ࡶஊίʔφʔ @yashigani Cocoaษڧձؔ੢ #61

Slide 49

Slide 49 text

• AFNetworking͕CarthageରԠڋ൱ͬͯΔ • https://github.com/AFNetworking/ AFNetworking/pull/2552 • LlamaKit͕ResultʹऔΓࠐ·ΕΔͷͭΒ͍ • https://github.com/LlamaKit/LlamaKit • https://github.com/antitypical/Result • Xcode 6.3࠷ߴ͗͢Δ

Slide 50

Slide 50 text

͋Γ͕ͱ͏͍͟͝·ͨ͠