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

macOSでもっとアプリを作ろう - iOSDC Japan 2018

malt03
August 31, 2018

macOSでもっとアプリを作ろう - iOSDC Japan 2018

malt03

August 31, 2018
Tweet

More Decks by malt03

Other Decks in Technology

Transcript

  1. NBD04Ͱ
    ΋ͬͱΞϓϦΛ࡞Ζ͏
    J04%$+BQBO
    %F/"!NBMU
    ଜాߛ࢘

    View Slide

  2. !NBMU

    View Slide

  3. !NBMU
    w 0NJBJͰ݁ࠗʢ೥ʣ

    View Slide

  4. !NBMU
    w גࣜձࣾσΟʔɾΤψɾΤʔ
    w ৽نࣄۀ։ൃ
    w ୅ද࡞ɿ-B⒎Z
    w ҟಈͯ͠ۀ຿ఏܞઌͱͷ͓࢓ࣄ
    w ("&HPͱ͔͕ଟ͍

    View Slide

  5. !NBMU
    w 4XJGUେ޷͖
    w J04େ޷͖

    View Slide

  6. !NBMU

    View Slide

  7. ࠓ೔͸
    ϓϥΠϕʔτͰ࡞͍ͬͯΔ
    NBDΞϓϦͰͷ͓࿩Ͱ͢

    View Slide

  8. Ξϯέʔτ
    NBDΞϓϦΛ࡞ͬͨ͜ͱ͸
    ͋Γ·͔͢ʁ

    View Slide

  9. Ξϯέʔτ
    ωΠςΟϒͰ࡞Γ·͔ͨ͠ʁ

    View Slide

  10. "OOBZ

    View Slide

  11. "OOBZ
    w ࡞͍ͬͯΔཧ༝
    w ࣗ෼ʹඞཁͳཁ݅Λ

    ຬͨ͢ΞϓϦ͕ͳ͔ͬͨ

    View Slide

  12. ϝϞΞϓϦʹٻΊΔཁ݅
    w ϚʔΫμ΢ϯͰॻ͚Δ
    w ϫʔΫεϖʔε͕࡞ΕΔ
    w ϑΥϧμͱͯ͠อଘ͞ΕΔ
    w J04Ͱ΋ฤूͰ͖Δ
    w
    w ϚʔΫμ΢ϯͰॻ͚Δ
    w ϫʔΫεϖʔε͕࡞ΕΔ
    w ϑΥϧμͱͯ͠อଘ͞ΕΔ
    w J04Ͱ΋ฤूͰ͖Δ
    w ωΠςΟϒͰ͋Δ

    View Slide

  13. ͳͥωΠςΟϒͳͷ͔
    w ಈ͖͕ܰշͰ͋Δ
    w ࢖͍΍͍͢6*

    View Slide

  14. ͳͥωΠςΟϒͳͷ͔
    w ಈ͖͕ܰշͰ͋Δ
    w ࢖͍΍͍͢6* ಛʹͬͪ͜

    View Slide

  15. ࢖͍΍͍͢6*ͱ͸Կ͔
    w Ϣʔβ͕࢖͍׳Εͨ6*
    w Ϣʔβ͕ڍಈΛ૝૾͠΍͍͢6*

    View Slide

  16. ࢖͍΍͍͢6*ͱ͸Կ͔
    Ϣʔβ͸

    ͦΕͧΕͷΞϓϦΛ

    ʮNBD04ͷͳ͔Ͱʯ

    ࢖͍ͬͯΔ

    View Slide

  17. ࢖͍΍͍͢6*ͱ͸Կ͔
    NBD04Β͍͠6*

    View Slide

  18. NBDΒ͍͠6*ͱ͸

    View Slide

  19. w "QQ,JUΛར༻ͨ͠$PDPB"QQσεΫτοϓΞϓϦ
    w 8FC7JFX &MFDUSPO 'MBTI +BWBͳͲͷٕज़Ͱߏங͠ͳ͍
    w )*(ΛकΔʗ"QQMF७ਖ਼ΞϓϦΛϦεϖΫτ͢Δ
    w 8JOEPXTͷ6*Λج४ʹ͠ͳ͍
    w υϥοάΞϯυυϩοϓͳͲػೳతʹ΋.BD04ͷ࢓૊Έʹै͏
    w ಠࣗ6*ͰԚછ͗͢͠ͳ͍
    w .BD04Β͍͠৭࢖͍
    w .BD04Β͍͠ΞχϝʔγϣϯʗΠϯλϥΫγϣϯ
    w .BD04Β͍͠ݴޠදݱʢྫ͑͹ʮ΢Πϯυ΢ʯʮ؀ڥઃఆʜʯͳͲʣ
    w .BD04Β͍͠ϑΥϯτʢ4BO'SBODJTDP )FMWFUJDB/FVF -VDJEB(SBOEF
    )JSBHJOP4BOT .FOMP .POBDPʜʣ
    w ඪ४తͳϝχϡʔόʔ͓ΑͼΩʔϘʔυγϣʔτΧοτ
    VTBHJNBSV͞Μʮ6*͕Τϩ͍.BD"QQूʯΑΓ
    NBDΒ͍͠6*ͱ͸

    View Slide

  20. NBDΒ͘͠ͳ͍ͱʁ
    w ׳ΕΔ·ͰڍಈΛ૝૾Ͱ͖ͳ͍
    w ׳Εͯ΋ΞϓϦΛ੾Γସ͑Δͱ͖ʹ

    ίϯςΩετεΠον͕ൃੜ͢Δ
    w %PDLʹฒ΂ͨ͘ͳ͍

    View Slide

  21. ྫ͑͹ʜ

    View Slide

  22. ྫ͑͹ʜ

    View Slide

  23. NBD04OBUJWF
    IUUQTNBDPTOBUJWFHJUIVCJP
    ৄ͘͠͸ͪ͜Β

    View Slide

  24. NBD04OBUJWF
    w ωΠςΟϒΞϓϦΛѪͯ͠

    ΍·ͳ͍ਓ͕ू͏ڰؾͷษڧձ
    w ͓ͱͱ͍ୈҰճ͕։࠵
    w ୈೋճ΋ʢͨͿΜʣ΍ΔΒ͍͠
    w σβΠϯ໘ؚΊͯ௒ษڧʹͳͬͨ
    IUUQTNBDPTOBUJWFHJUIVCJP

    View Slide

  25. ωΠςΟϒͰ͋Δҙຯ͸
    ͝ཧղ͍͚͔ͨͩͨͱ
    ࢥ͍·͢

    View Slide

  26. ͨͩʜ
    w ωΠςΟϒΞϓϦͬͯ௒গͳ͍
    w اۀ͕NBDΞϓϦΛ࡞Δͷ͸೉͍͠
    w NBDϢʔβ͸฼਺͕গͳ͍

    View Slide

  27. ͡Ό͋Ͳ͏͢Δ͔

    View Slide

  28. ͋ͳ͕ͨ
    ϓϥΠϕʔτͰ
    ࡞͍ͬͯͩ͘͞

    View Slide

  29. ϓϥΠϕʔτͳΒ
    ݄ԁºਓͰ΋
    ݄ສԁͷച্ʂ

    View Slide

  30. σβΠϯͷ࢓ํ͕
    Θ͔Βͳ͍ʁ

    View Slide

  31. ωΠςΟϒͳΒେৎ෉

    ࡞Γ΍͍͢Α͏ʹ࡞Ε͹
    ࣗવͱNBDΒ͘͠ͳΓ·͢ʂ

    View Slide

  32. Ҏ্ʂ

    View Slide

  33. ͔͜͜Β͸
    ΤϯδχΞͱͯ͠ͷ͓࿩

    View Slide

  34. NBDΞϓϦ։ൃ͸
    ਏ͍Ͱ͢

    View Slide

  35. NBDΞϓϦ։ൃͷਏΈ
    υΩϡϝϯτ͕ͻͲ͍

    View Slide

  36. NBDΞϓϦ։ൃͷ৺ಘ
    w Πϯλʔωοτ͸ӕͩΒ͚
    w ϓϩάϥϛϯάΨΠυ΋ӕ
    w ϦϑΝϨϯε͸ϛεϦʔυ

    View Slide

  37. Πϯλʔωοτ͸ӕͩΒ͚
    w /45BCMF7JFX
    w "SSBZ$POUSPMMFSΛ࢖͏ͱྑ͍
    w ɹ
    w ɹ


    View Slide

  38. Πϯλʔωοτ͸ӕͩΒ͚
    w /45BCMF7JFX
    w "SSBZ$POUSPMMFSΛ࢖͏ͱྑ͍
    w ˠӕ
    w 4XJGUͰ࢖͓͏ͱ͢Δͱ

    Ϋϥογϡͷཛྷ

    View Slide

  39. Πϯλʔωοτ͸ӕͩΒ͚
    w ಠࣗϑΝΠϧͷઃఆ
    w %PDVNFOU5ZQFTͷΈͰ΍Δ
    w ɹ
    w ɹ
    w

    View Slide

  40. Πϯλʔωοτ͸ӕͩΒ͚
    w ಠࣗϑΝΠϧͷઃఆ
    w %PDVNFOU5ZQFTͷΈͰ΍Δ
    w ˠӕ
    w େ෼ݹ͍΍Γํ
    w ࠓͳΒ&YQPSUFE65*TΛซ༻

    View Slide

  41. ϓϩάϥϛϯάΨΠυ΋ӕ
    w *OUSPEVDUJPOUP%SBHBOE%SPQ
    w ࠷ऴߋ৽͸
    w

    View Slide

  42. ϓϩάϥϛϯάΨΠυ΋ӕ
    w *OUSPEVDUJPOUP%SBHBOE%SPQ
    w ࠷ऴߋ৽͸
    w ೥ʹେ͖ͳΞοϓσʔτ͋Γ

    View Slide

  43. ϦϑΝϨϯε͸ϛεϦʔυ
    ಠࣗϑΝΠϧͷઃఆ΋
    υϥοάΞϯυυϩοϓͷ࣮૷΋
    ݹ͍΍Γํ͕EFQSFDBUFEʹ͢Β
    ͳ͍ͬͯͳ͍

    View Slide

  44. ͦͷΘΓʹ
    w ࣮૷͸݁ߏߋ৽͞Ε͍ͯΔ
    w ຖ೥8IBU`T/FXJO$PDPB

    ͷϏσΦ͕ଘࡏ͢Δ
    w υΩϡϝϯτ͕௥͍͔ͭͳ͍

    View Slide

  45. NBDΞϓϦ։ൃͷ৺ಘ
    88%$ͷಈը͕ਖ਼ٛʂ

    View Slide

  46. NBDΞϓϦ։ൃͷ৺ಘ
    w ϋϚͬͨͱ͖ͷಈ͖
    w ϑϨʔϜϫʔΫͷରԠNBD04ͷ

    όʔδϣϯΛ֬ೝ
    w όʔδϣϯͷϦϦʔε೥Λ֬ೝ
    w ͦͷ೥ͷ88%$Λࢹௌ

    View Slide

  47. NBDΞϓϦ։ൃͷ৺ಘ
    w %SBHBOE%SPQͳΒɾɾɾ
    w /4'JMF1SPNJTF1SPWJEFS
    w NBD04
    w ೥ϦϦʔε
    w IUUQTEFWFMPQFSBQQMFDPN
    WJEFPTQMBZXXED

    View Slide

  48. ͍΍͍΍͆

    ͱࢥ͍ͬͯΔ͋ͳͨ

    View Slide

  49. ϚδͰ͢

    View Slide

  50. ΍ͬͯΒΕΜʂ
    ͱࢥͬͨํ͸
    !NBMU
    ·Ͱ࣭໰ͯ͠Լ͍͞ɻ
    େ఍ͷϋϚΓͲ͜Ζ͸ϋϚͬͨؾ͕͠·͢ɻ

    View Slide

  51. ࠷ޙʹ
    ϋϚͬͨͱ͜ΖΛ঺հ

    View Slide

  52. ಠࣗϑΝΠϧͷઃఆ
    w 6OJGPSN5ZQF*EFOUJpFS
    w σʔλλΠϓΛҰҙʹಛఆ͢Δ

    ࣝผࢠ


    View Slide

  53. ࣝผࢠ ܧঝݩ ֦ுࢠ
    QVCMJDQMBJOUFYU QVCMJDUFYU UYU
    QVCMJDTPVSDFDPEF QVCMJDQMBJOUFYU
    QVCMJDDTPVSDF QVCMJDTPVSDFDPEF D
    DPNBQQMFQBDLBHF QVCMJDEJSFDUPSZ
    DPNBQQMFBQQMJDBUJPO QVCMJDFYFDVUBCMF
    DPNBQQMFBQQMJDBUJPOCVOEMF
    DPNBQQMFQBDLBHF
    DPNBQQMFCVOEMF
    DPNBQQMFBQQMJDBUJPO
    BQQ

    View Slide

  54. ಠࣗϑΝΠϧͷઃఆ
    ࣝผࢠ ܧঝݩ ֦ுࢠ
    PSHBOOBZXPSLTQBDF DPNBQQMFQBDLBHF BOOBZ

    View Slide

  55. ಠࣗϑΝΠϧͷઃఆ

    View Slide

  56. ಠࣗϑΝΠϧͷઃఆ
    w %PDVNFOU5ZQFTͷ*EFOUJpFSʹ

    PSHBOOBZXPSLTQBDFΛࢦఆ
    w ΄͔ͷ஋͸ඞཁͳ͠

    View Slide

  57. ಠࣗϑΝΠϧͷઃఆ

    View Slide

  58. %SBHBOE%SPQ
    w ৄ͘͠͸ίνϥ

    IUUQTEFWFMPQFSBQQMFDPN
    WJEFPTQMBZXXED

    View Slide

  59. %SBHBOE%SPQ
    w /41BTUFCPBSEΛ࢖͏
    w ΄΅6*1BTUFCPBSEͱಉ͡
    w %SBHͷλΠϛϯάͰHFOFSBMͰ͸
    ͳ͍/41BTUFCPBSEΛҾ਺ʹ
    EFMFHBUFͷϝιου͕ݺ͹ΕΔ

    View Slide

  60. %SBHBOE%SPQ
    func outlineView(
    _ outlineView: NSOutlineView,
    writeItems items: [Any],
    to pasteboard: NSPasteboard
    ) -> Bool {
    let nodes = items.compactMap { $0 as? NodeModel }
    let filePromiseProviders = nodes.map {
    NSFilePromiseProvider(
    fileType: kUTTypePlainText as String,
    delegate: $0
    )
    }
    pasteboard.writeObjects(filePromiseProviders)
    return true
    }

    View Slide

  61. %SBHBOE%SPQ
    extension NodeModel: NSFilePromiseProviderDelegate {
    func filePromiseProvider(
    _ filePromiseProvider: NSFilePromiseProvider,
    fileNameForType fileType: String
    ) -> String {
    return name
    }
    func filePromiseProvider(
    _ filePromiseProvider: NSFilePromiseProvider,
    writePromiseTo url: URL,
    completionHandler: @escaping (Error?) -> Void
    ) {
    do {
    try write(to: url)
    } catch {
    completionHandler(error)
    }
    completionHandler(nil)
    }
    }

    View Slide

  62. /40VUMJOF7JFX

    View Slide

  63. /40VUMJOF7JFX
    w ͱͯ΋ศརϏϡʔ
    w υΩϡϝϯτগͳ͗͢
    w ओʹར༻͢ΔϓϩτίϧϝιουΛ

    ྻڍ͠·͢

    View Slide

  64. /40VUMJOF7JFX
    protocol NSOutlineViewDataSource {
    func outlineView(
    _ outlineView: NSOutlineView,
    numberOfChildrenOfItem item: Any?
    ) -> Int
    func outlineView(
    _ outlineView: NSOutlineView,
    child index: Int,
    ofItem item: Any?
    ) -> Any
    func outlineView(
    _ outlineView: NSOutlineView,
    isItemExpandable item: Any
    ) -> Bool
    }

    View Slide

  65. /40VUMJOF7JFX
    protocol NSOutlineViewDelegate {
    func outlineViewSelectionDidChange(
    _ notification: Notification
    )
    func outlineView(
    _ outlineView: NSOutlineView,
    viewFor tableColumn: NSTableColumn?,
    item: Any
    ) -> NSView?
    }

    View Slide

  66. /40VUMJOF7JFX
    0VUMJOF7JFX಺%SBHBOE%SPQ༻
    protocol NSOutlineViewDataSource {
    func outlineView(
    _ outlineView: NSOutlineView,
    validateDrop info: NSDraggingInfo,
    proposedItem item: Any?,
    proposedChildIndex index: Int
    ) -> NSDragOperation
    func outlineView(
    _ outlineView: NSOutlineView,
    acceptDrop info: NSDraggingInfo,
    item: Any?,
    childIndex index: Int
    ) -> Bool
    }

    View Slide

  67. /40VUMJOF7JFX
    ։͖ঢ়ଶอଘ
    outlineView.autosaveName = .init(“foobar”)
    outlineView.autosaveExpandedItems = true
    protocol NSOutlineViewDataSource {
    func outlineView(
    _ outlineView: NSOutlineView,
    itemForPersistentObject object: Any
    ) -> Any?
    func outlineView(
    _ outlineView: NSOutlineView,
    persistentObjectForItem item: Any?
    ) -> Any?
    }

    View Slide

  68. ࠷ޙʹ
    w NBDΞϓϦ։ൃͷ࣮૷͸

    ૉ੖Β͍͠Ͱ͢
    w ඒ͘͠ɺ଎͘ɺ࢖͍΍͍͢ΞϓϦ͕
    ࡞Ε·͢
    w υΩϡϝϯτ͕ἧ͍ͬͯͳ͍ͷ͕

    ͭΒ͍͚ͩͰ͢

    View Slide

  69. ࠷ޙʹ
    w օͰɺNBDΞϓϦք۾Λ

    ੝Γ্͍͖͛ͯ·ͤΜ͔ʁ
    w ࣭໰͸͍ͭͰ΋͓ड͚͠·͢

    !NBMU

    View Slide

  70. ͋Γ͕ͱ͏
    ͍͟͝·ͨ͠

    View Slide