Upgrade to Pro — share decks privately, control downloads, hide ads and more …

UITableViewとのSwiftyな付き合い方を考えてみる

704056da9a4c4e075ad14479beaebab7?s=47 takasek
August 29, 2016

 UITableViewとのSwiftyな付き合い方を考えてみる

2016/8/29 AKIBA.swift×Swift愛好会 http://love-swift.connpass.com/event/37019/

にて発表した
「UITableViewとのSwiftyな付き合い方を考えてみる」
の登壇資料です。

デモプロジェクトはこちら
https://github.com/takasek/TableViewExample/

704056da9a4c4e075ad14479beaebab7?s=128

takasek

August 29, 2016
Tweet

Transcript

  1. UITableViewͱͷ Swiftyͳ ෇͖߹͍ํΛ ߟ͑ͯΈΔ by takasek 2016/8/29 AKIBA.swift×SwiftѪ޷ձ

  2. None
  3. None
  4. UITableViewΛ ੍͢Δऀ͸ iOSΛ੍͢

  5. ͱݴ͍͍ͬͯ΄ͲʹTableView͸ΞϓϦ։ൃͷ͋ ΒΏΔ৔໘ͰݱΕ·͢ ͔͠͠ɺ ౕ(TableView)͸ݹͷCocoaͷࢧ഑Լʹ͋Δ … ͳΜͱ͔Swiftyͳੈքʹ Ҿ͖ͣΓग़ͤͳ͍ͩΖ͏͔…!? ͱ͍͏࿩Λ͠·͢ɻ

  6. UITableViewͷ ࢖͍ํͷ͓͞Β͍

  7. 1. cellΛregister͢Δ reuseIdentifierʹɺCellͷΫϥεΛඥ෇͚Δ 4 registerClass Cell͕ίʔυͰ࡞੒͞Ε͍ͯΔ৔߹ 4 registerNib Cell͕xibͰ࡞੒͞Ε͍ͯΔ৔߹ ௚઀IBͰPrototype

    Cellsͱͯ͠σβΠϯͨ͠cell Ͱ͋Ε͹ɺ໌ࣔతͳregister͸ෆཁ
  8. 2. UITableViewDataSourceΛ࣮૷ 4 numberOfSectionsInTableView(tableView:) 4 tableView(tableView:numberOfRowsInSecti on:) 4 tableView(tableView:cellForRowAtIndexPa th

    indexPath:) 4 etc
  9. 3. ͋ͱ͸͓೚ͤ tableView͕ɺ 4 ηΫγϣϯͷ਺ΛٻΊɺ 4 ηΫγϣϯ಺ͷߦ਺ΛٻΊɺ 4 ֤CellΛΠϯελϯεԽ͋Δ͍͸࠶ར༻͠ɺ 4

    ద੾ʹϨΠΞ΢τ͠ɺ 4 දࣔʂ
  10. TableViewपΓͷ໾ׂΛ෼͚ͯߟ͑ Α͏ 4 σʔλιʔεͷத਎ͷ؅ཧ 4 indexPathͰಛఆ͞ΕΔ 4 ڵຯ͕͋Δͷ͸σʔλ 4 dequeue͢΂͖Cellͷ࣮ମͷ؅ཧ

    4 reuseIdentifierͰಛఆ͞ΕΔ 4 ڵຯ͕͋Δͷ͸දࣔ
  11. σʔλιʔεͷத਎ͷ؅ཧ (indexPathͰಛఆ)

  12. ૉͷ··ͩͱԿ͕ࠔΔ͔ let data = dataSource[indexPath.row] // AnyObject 4 σʔλͷܕ͕෼͔Βͳ͍ 4

    σʔλΛ໢ཏͰ͖ͳ͍ 4 σʔλΛArrayʹవΊΔऔ͔͔ͬΓ͕ͳ͍ 4 શͯͷܕΛڞ௨͢Δϓϩτίϧʹద߹ͤ͞ Δͱ͍͏ͷ΋ͳʔ… 4 ʮ͜ͷtableViewͰ࢖͏ܕʯΛ໢ཏ͍ͨ͠
  13. ໢ཏ͍ͨ͠ʁ

  14. ྻڍ͍ͨ͠ʂ

  15. Swiftyʹղܾ ஋͖ͭEnumͷArrayΛ࡞Δ

  16. enum CellViewModel { case Color(UIColor) case Switch(Bool) case Slider(Float) }

    let datasource: [CellViewModel] = [ .Color(.redColor()), .Switch(true), .Slider(1.0), ] func tableView( tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath ) -> UITableViewCell { switch datasource[indexPath.row] { case .Color(let color): ... case .Switch(let on): ... case .Slider(let value): ... } }
  17. ͜͏͢Ε͹ 4 ܕ͸ਖ਼֬ʹࢦఆͰ͖Δ 4 ͲΜͳछྨͷσʔλΛ࢖͏ͷ͔Ұ໨ྎવ 4 ໢ཏతʹॲཧΛهड़Ͱ͖Δ …ͱɺྑ͍͜ͱͣ͘ΊͰ͢ʂ

  18. දࣔ͢ΔCellͷ࣮ମͷ؅ཧ (reuseIdentifierͰಛఆ)

  19. ૉͷ··ͩͱԿ͕ࠔΔ͔ 4 reuseͯ͠ฦͬͯ͘Δͷ͸UITableViewCell 4 Cellͷܕ͕෼͔Βͳ͍ 4 ໌ࣔతʹμ΢ϯΩϟετ͢Δͷ͸ܕਪଌͷ Ըܙʹ͔͋ͣΕͣ൵͍͠ 4 identifierΛจࣈϦςϥϧͰࢦఆ͠ͳ͚Ε͹ͳ

    Βͳ͍ͷͰɺෆ҆
  20. Swiftyʹղܾ େମͷ৔߹͸identifierͱΫϥε໊͸ಉ͡ͰOK dequeueͷࡍʹ͸ɺidentifierͷ୅ΘΓʹ UITableViewCell.Type Λ౉ͯ͠ɺฦͬͯ͘Δܕ ͸ UITableViewCell ʹڧ੍Ωϟετ͢Δ

  21. func registerNib<Cell: UITableViewCell>( sameNibNameAndIdentifierAs cellClass: Cell.Type) { registerNib( UINib(nibName: "\(cellClass)",

    bundle: nil), forCellReuseIdentifier: "\(cellClass)") } func registerClass<Cell: UITableViewCell>( sameIdentifierAs cellClass: Cell.Type) { registerClass(cellClass, forCellReuseIdentifier: "\(cellClass)") } func dequeue<Cell: UITableViewCell>( sameIdentifierAs cellClass: Cell.Type, forIndexPath indexPath: NSIndexPath) -> Cell { return dequeueReusableCellWithIdentifier( "\(cellClass)", forIndexPath: indexPath ) as! Cell }
  22. ʮCell໊ͱidentifier͸ಉ͡ʹ͢Δʯ ͱϧʔϧΛܾΊΔ͚ͩͰɺ ϦςϥϧͰͷidentifier͕ ࢦఆෆཁʹʂ

  23. ʢ๫࿦ʣ

  24. ൓࿦1 func dequeue<Cell: UITableViewCell>( sameIdentifierAs cellClass: Cell.Type, forIndexPath indexPath: NSIndexPath

    ) -> Cell { let identifier = "\(cellClass)" return dequeueReusableCellWithIdentifier( identifier, forIndexPath: indexPath ) as! Cell } ʮ as! Cell ͸ཚ๫͗ͩ͢Ζ!?ʯ
  25. ʢਖ਼࿦ʣ

  26. ͔͠͠ɺ 4 identifier͕register͞Ε͍ͯͳ͚Ε͹ɺΩϟετ͢Δલʹ UIKit࣌఺ͰΫϥογϡ͢ΔʢiOS6Ҏ߱ʣ 4 register͞Εͨܕ͸identifierͱಉҰͩͱอূͰ͖Δ 4 identifier͸ಛఆͷCellͷܕʹඥ෇͍͍ͯΔ 4 identifier͕ผͷܕ͕ඥ෇͍͍ͯͨͱͨ͠ΒɺͦΕ͸

    identifierͷࢦఆ͕ෆຯ͍ ͱߟ͑Ε͹ɺ ! Ͱ໰୊͋Γ·ͤΜ dequeueReusableCellWithIdentifier( identifier: String, forIndexPath indexPath: NSIndexPath) -> UITableViewCell // newer dequeue method // guarantees a cell is returned and resized properly, // assuming identifier is registered
  27. ൓࿦2 let identifier = "\(cellClass)" ʮidentifier͕cellClassͱಉ͡ͱ͸ݶΒͳ͍ͩ Ζ!?ʯ

  28. …ͦ͏ͳΜͰ͢ΑͶʔ

  29. ࣮͸ɺCellͷΫϥεͱIdentifier͸1:1ؔ܎Ͱ͸ͳ͍ ಉ͡Hogeͱ͍͏ॲཧΛ͢Δ͕֎؍͕ҧ͏Cell͸͜ ͏͍ͨ͠ 4 RedHogeCell.xib 4 class: HogeCell 4 identifier:

    "RedHoge" 4 BlueHogeCell.xib 4 class: HogeCell 4 identifier: "BlueHoge"
  30. ਏ͍

  31. ؒʹstructΛט·ͤΔͱ͔ɺͦΕΛGenericʹ͠ ͯΈΔͱ͔ɺ৭ʑߟ͑ͯ͸Έ·ͨ͠ Ͱ΋ɺͪΐͬͱຊ࣭తͰ͸ͳ͍෦෼Ͱ࣮૷͕๲Β Έ͗͢ΔͷͰඍົͳײ͡ 4 ଟ͘ͷ৔߹͸Cellͱidentifier͕1:1ͰࡁΉ 4 ͦ͏Ͱͳ͍৔߹͸identifierΛϦςϥϧͰࢦఆ Ͱ͖ΔΑ͏OptionalͳҾ਺Λ࣋ͨͤɺటष͘ ख࡞ۀͰඥ෇͚Δ

    …ͱ͍͏ͷ͕མͱ͠ॴ͔ͳͱ
  32. ·ͱΊ ᶃTableView͕σʔλʹؔ৺͕͋Δέʔε ɹ= indexPathͰಛఆ 4 σʔλͷछྨΛ஋͖ͭEnumͰ໢ཏˍܕ҆શʹऔΓѻ͏ ᶄTableView͕Cellͷ࣮ମʹؔ৺͕͋Δέʔε ɹ= reuseIdentifierͰಛఆ 4

    reuseIdentifier = Class໊ ͱ͍͏ϧʔϧΛಋೖ͠ɺ ڧ੍ ΩϟετͰແཧ໼ཧܕ҆શʹऔΓѻ͏ 4 ࣮ࡍ͸reuseIdentifier:Class͸ଟର1ͳͷͰɺOptionalͰ identifierΛࢦఆՄೳʹ
  33. ͜ΕΒͷ࢓૊ΈΛऔΓೖΕͨ DEMO!