实例介绍
macOS应用开发基础教程 配套的实例源码。
【实例截图】
【核心代码】
macOSwift4.0.3-Ebook-Demo
├── macOSwift4.0.3-Ebook-Demo
│ ├── Chapter 01 Preparation
│ │ └── HelloWorld
│ │ ├── HelloWorld
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj
│ │ │ │ └── MainMenu.xib
│ │ │ ├── HelloWorld.entitlements
│ │ │ └── Info.plist
│ │ └── HelloWorld.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ └── zhaojw.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── Chapter 02 Window
│ │ ├── Window
│ │ │ ├── Window
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── AppIcon.png
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── MainMenu.xib
│ │ │ │ └── Info.plist
│ │ │ └── Window.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── Window.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ └── WindowCenter
│ │ ├── WindowCenter
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj
│ │ │ │ └── Main.storyboard
│ │ │ ├── Info.plist
│ │ │ ├── ViewController.swift
│ │ │ └── WindowController.swift
│ │ └── WindowCenter.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ ├── idevfans.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ ├── WindowCenter.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── zhaojw.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── Chapter 03 View&ScrollView
│ │ ├── NSEffectView
│ │ │ └── WindowLoginEffect
│ │ │ ├── WindowLogin
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ ├── AppIcon.appiconset
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ ├── ic_close.imageset
│ │ │ │ │ │ ├── Contents.json
│ │ │ │ │ │ └── ic_close@2x.png
│ │ │ │ │ └── ic_face.imageset
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── ic_face@2x.png
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Controllers
│ │ │ │ │ ├── LoginViewController.swift
│ │ │ │ │ ├── LoginWindowController.swift
│ │ │ │ │ └── MainWindowController.swift
│ │ │ │ ├── Info.plist
│ │ │ │ ├── WindowBorderless.swift
│ │ │ │ └── WindowLogin.entitlements
│ │ │ └── WindowLogin.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ └── zhaojw.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── ResponderChain
│ │ │ ├── ResponderChain
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── MainMenu.xib
│ │ │ │ ├── FXButton.swift
│ │ │ │ ├── FXView.swift
│ │ │ │ ├── FXWindow.swift
│ │ │ │ └── Info.plist
│ │ │ └── ResponderChain.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ ├── ResponderChain.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── ScrollView
│ │ │ ├── ScrollView
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── MainMenu.xib
│ │ │ │ ├── CustomScrollView.swift
│ │ │ │ ├── DisableVerticalScrollView.swift
│ │ │ │ ├── Info.plist
│ │ │ │ ├── NoScrollerScrollView.swift
│ │ │ │ └── screen.png
│ │ │ └── ScrollView.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── ScrollView.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ └── View
│ │ ├── View
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj
│ │ │ │ └── MainMenu.xib
│ │ │ ├── CustomView.swift
│ │ │ └── Info.plist
│ │ └── View.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ ├── idevfans.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ ├── View.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── zhaojw.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── Chapter 04 Controlls
│ │ ├── 4.10 NSSegmentedControl
│ │ │ ├── NSSegmentedControl
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ ├── NSSegmentedControlSize
│ │ │ │ ├── NSSegmentedControlSize
│ │ │ │ │ ├── AppDelegate.swift
│ │ │ │ │ ├── Assets.xcassets
│ │ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Base.lproj
│ │ │ │ │ │ └── Main.storyboard
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ └── ViewController.swift
│ │ │ │ └── NSSegmentedControlSize.xcodeproj
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace
│ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ └── xcuserdata
│ │ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── xcschemes
│ │ │ │ │ ├── NSSegmentedControlSize.xcscheme
│ │ │ │ │ └── xcschememanagement.plist
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── NSSegmentedControl.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ ├── NSSegmentedControl.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── 4.11 NSComboBox
│ │ │ ├── NSComboBox
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── NSComboBox.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── NSComboBox.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── 4.12 NSPopUpButton
│ │ │ ├── NSPopUpButton
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── NSPopUpButton.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ ├── NSPopUpButton.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ ├── NSPopUpButton.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ ├── 4.13 NSSlider
│ │ │ ├── NSSlider
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── NSSlider.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ ├── NSSlider.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── 4.14 NSDatePicker
│ │ │ ├── NSDatePicker
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── NSDatePicker.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── NSDatePicker.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── 4.15 NSStepper
│ │ │ ├── NSStepper
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── NSStepper.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── NSStepper.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── 4.16 NSProgressIndicator
│ │ │ ├── NSProgressIndicator
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── NSProgressIndicator.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ ├── NSProgressIndicator.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── 4.17 NSImageView
│ │ │ ├── NSImageView
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── earth.png
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── NSImageView.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── NSImageView.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── 4.18 NSBox
│ │ │ ├── NSBox
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── NSBox.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ ├── NSBox.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── 4.19 NSSplitView
│ │ │ ├── NSSplitView
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ ├── SplitView.swift
│ │ │ │ └── ViewController.swift
│ │ │ └── NSSplitView.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ ├── NSSplitView.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ ├── NSSplitView.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ ├── 4.20 NSCollectionView
│ │ │ ├── NSCollectionView
│ │ │ │ ├── NSCollectionView
│ │ │ │ │ ├── AppDelegate.swift
│ │ │ │ │ ├── Assets.xcassets
│ │ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Base.lproj
│ │ │ │ │ │ └── Main.storyboard
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ └── ViewController.swift
│ │ │ │ └── NSCollectionView.xcodeproj
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace
│ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ └── xcuserdata
│ │ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ ├── xcdebugger
│ │ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ │ └── xcschemes
│ │ │ │ │ ├── NSCollectionView.xcscheme
│ │ │ │ │ └── xcschememanagement.plist
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ └── xcschememanagement.plist
│ │ │ ├── NSCollectionViewCode
│ │ │ │ ├── NSCollectionViewCode
│ │ │ │ │ ├── AppDelegate.swift
│ │ │ │ │ ├── Assets.xcassets
│ │ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Base.lproj
│ │ │ │ │ │ └── Main.storyboard
│ │ │ │ │ ├── CollectionViewItem.swift
│ │ │ │ │ ├── CollectionViewItem.xib
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ └── ViewController.swift
│ │ │ │ └── NSCollectionViewCode.xcodeproj
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace
│ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ └── xcuserdata
│ │ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ ├── xcdebugger
│ │ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ │ └── xcschemes
│ │ │ │ │ ├── NSCollectionViewCode.xcscheme
│ │ │ │ │ └── xcschememanagement.plist
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ └── xcschememanagement.plist
│ │ │ ├── NSCollectionViewDataSource
│ │ │ │ ├── NSCollectionViewDataSource
│ │ │ │ │ ├── AppDelegate.swift
│ │ │ │ │ ├── Assets.xcassets
│ │ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Base.lproj
│ │ │ │ │ │ └── Main.storyboard
│ │ │ │ │ ├── CollectionItemView.swift
│ │ │ │ │ ├── CollectionViewItem.swift
│ │ │ │ │ ├── CollectionViewItem.xib
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ └── ViewController.swift
│ │ │ │ └── NSCollectionViewDataSource.xcodeproj
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace
│ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ └── xcuserdata
│ │ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ ├── xcdebugger
│ │ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ │ └── xcschemes
│ │ │ │ │ ├── NSCollectionViewDataSource.xcscheme
│ │ │ │ │ └── xcschememanagement.plist
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── NSCollectionViewHeadFoot
│ │ │ ├── NSCollectionViewHeadFoot
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── MainMenu.xib
│ │ │ │ ├── CollectionViewItem.swift
│ │ │ │ ├── CollectionViewItem.xib
│ │ │ │ ├── FooterView.swift
│ │ │ │ ├── FooterView.xib
│ │ │ │ ├── HeaderView.swift
│ │ │ │ ├── HeaderView.xib
│ │ │ │ ├── Info.plist
│ │ │ │ └── NSCollectionViewHeadFoot.entitlements
│ │ │ └── NSCollectionViewHeadFoot.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ └── zhaojw.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── 4.21 NSTabView
│ │ │ ├── NSTabLessView
│ │ │ │ ├── NSTabLessView
│ │ │ │ │ ├── AppDelegate.swift
│ │ │ │ │ ├── Assets.xcassets
│ │ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Base.lproj
│ │ │ │ │ │ └── MainMenu.xib
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ └── NSTabLessView.entitlements
│ │ │ │ └── NSTabLessView.xcodeproj
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace
│ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ └── xcuserdata
│ │ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── xcuserdata
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── NSTabView
│ │ │ ├── NSTabView
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── NSTabView.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── NSTabView.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── 4.22 NSPopover
│ │ │ ├── NSPopover
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── NSPopover.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ ├── NSPopover.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── 4.2 ResponderChain
│ │ │ ├── ResponderChain
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── MainMenu.xib
│ │ │ │ ├── FXButton.swift
│ │ │ │ ├── FXView.swift
│ │ │ │ ├── FXWindow.swift
│ │ │ │ └── Info.plist
│ │ │ └── ResponderChain.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ ├── ResponderChain.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── 4.3 NSTextField
│ │ │ ├── NSTextField
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── MainMenu.xib
│ │ │ │ └── Info.plist
│ │ │ └── NSTextField.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── NSTextField.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── 4.4 NSTextView
│ │ │ ├── NSTextView
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── MainMenu.xib
│ │ │ │ └── Info.plist
│ │ │ └── NSTextView.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── NSTextView.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── 4.5 NSSearchField
│ │ │ ├── NSSearchField
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── MainMenu.xib
│ │ │ │ └── Info.plist
│ │ │ └── NSSearchField.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── NSSearchField.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ ├── NSSearchField.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ ├── 4.6 Label
│ │ │ ├── Label
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── MainMenu.xib
│ │ │ │ └── Info.plist
│ │ │ └── Label.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── Label.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── 4.7 NSButton
│ │ │ ├── ImageButton
│ │ │ │ ├── ImageButton
│ │ │ │ │ ├── AppDelegate.swift
│ │ │ │ │ ├── Assets.xcassets
│ │ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Base.lproj
│ │ │ │ │ │ └── Main.storyboard
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ └── ViewController.swift
│ │ │ │ └── ImageButton.xcodeproj
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace
│ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ └── xcuserdata
│ │ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── xcschemes
│ │ │ │ │ ├── ImageButton.xcscheme
│ │ │ │ │ └── xcschememanagement.plist
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ └── xcschememanagement.plist
│ │ │ ├── NSButton
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── MainMenu.xib
│ │ │ │ └── Info.plist
│ │ │ └── NSButton.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ ├── NSButton.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── 4.8 CheckBox
│ │ │ ├── CheckBox
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── MainMenu.xib
│ │ │ │ └── Info.plist
│ │ │ └── CheckBox.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ ├── CheckBox.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ └── 4.9 Radio
│ │ ├── Radio
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj
│ │ │ │ └── MainMenu.xib
│ │ │ └── Info.plist
│ │ └── Radio.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ ├── idevfans.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ ├── Radio.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── zhaojw.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── Chapter 05 Alert&Panel
│ │ ├── NSAlert
│ │ │ ├── NSAlert
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── NSAlert.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ ├── NSAlert.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── NSOpenPanel
│ │ │ ├── NSOpenPanel
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── NSOpenPanel.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ ├── NSOpenPanel.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── NSPanel
│ │ │ ├── NSPanel
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── MainMenu.xib
│ │ │ │ └── Info.plist
│ │ │ └── NSPanel.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ ├── NSPanel.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ └── SingleXibPanel
│ │ ├── SingleXibPanel
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj
│ │ │ │ └── Main.storyboard
│ │ │ ├── Info.plist
│ │ │ ├── MyPanel.swift
│ │ │ ├── MyPanel.xib
│ │ │ └── ViewController.swift
│ │ └── SingleXibPanel.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ ├── idevfans.xcuserdatad
│ │ │ └── xcschemes
│ │ │ ├── SingleXibPanel.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── zhaojw.xcuserdatad
│ │ ├── xcdebugger
│ │ │ └── Breakpoints_v2.xcbkptlist
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── Chapter 06 ToolBar&Menu
│ │ ├── NSMenu
│ │ │ ├── NSMenu
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── NSMenu.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── NSMenu.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── NSStatusBar
│ │ │ ├── NSStatusBar
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── AppViewController.swift
│ │ │ │ ├── AppViewController.xib
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── blue@2x.png
│ │ │ │ ├── Info.plist
│ │ │ │ ├── Stock1.png
│ │ │ │ └── ViewController.swift
│ │ │ └── NSStatusBar.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── NSStatusBar.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ └── NSToolbar
│ │ ├── NSToolbar
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj
│ │ │ │ └── Main.storyboard
│ │ │ ├── FontSetting.png
│ │ │ ├── Info.plist
│ │ │ ├── Save.png
│ │ │ ├── ViewController.swift
│ │ │ └── WindowController.swift
│ │ └── NSToolbar.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ ├── idevfans.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ ├── NSToolbar.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── zhaojw.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── Chapter 07 TableView&TreeView
│ │ ├── NSOutlineView
│ │ │ ├── NSOutlineView
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ ├── AppIcon.appiconset
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Minus.imageset
│ │ │ │ │ │ ├── Contents.json
│ │ │ │ │ │ └── 涓嬫媺-鏀?png
│ │ │ │ │ └── Plus.imageset
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── 鍙虫媺-鏀?png
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ ├── OutlineView.swift
│ │ │ │ ├── TreeNodeModel.swift
│ │ │ │ └── ViewController.swift
│ │ │ └── NSOutlineView.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── NSOutlineView.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ └── NSTableView
│ │ ├── CustomTableView
│ │ │ ├── CustomTableView
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── CustomTableRowView.swift
│ │ │ │ ├── CustomTableView-Bridging-Header.h
│ │ │ │ ├── CustomTableView.swift
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── CustomTableView.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── CustomTableView.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── NSTableView
│ │ │ ├── NSTableView
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── NSTableViewCellBased.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── NSTableView.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── NSTableViewBinding
│ │ │ ├── NSTableViewBinding
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── NSTableViewBinding.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ └── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ │ └── xcschemes
│ │ │ ├── NSTableViewBinding.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ ├── NSTableViewCreatedByCode
│ │ │ ├── NSTableViewCreatedByCode
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── NSTableViewCreatedByCode.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── NSTableViewCreatedByCode.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── NSTableViewCustomBackgroud
│ │ │ ├── NSTableViewCustomBackgroud
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── CustomTableView.swift
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── NSTableViewCustomBackgroud.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ └── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ │ └── xcschemes
│ │ │ ├── NSTableViewCustomBackgroud.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ ├── NSTableViewDragDrop
│ │ │ ├── NSTableViewDragDrop
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── NSTableViewDragDrop.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ └── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ ├── NSTableViewDragDrop.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── NSTableViewViewBased
│ │ ├── NSTableViewViewBased
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj
│ │ │ │ └── Main.storyboard
│ │ │ ├── Info.plist
│ │ │ ├── MyTableView.swift
│ │ │ └── ViewController.swift
│ │ └── NSTableViewViewBased.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ ├── idevfans.xcuserdatad
│ │ │ └── xcschemes
│ │ │ ├── NSTableViewViewBased.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── zhaojw.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── Chapter 08 AutoLayout
│ │ ├── AutoLayout
│ │ │ ├── AutoLayout
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── AutolayoutSolution1.swift
│ │ │ │ ├── AutolayoutSolution1.xib
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── MainMenu.xib
│ │ │ │ └── Info.plist
│ │ │ └── AutoLayout.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ ├── AutoLayout.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── AutoLayoutDemo
│ │ │ ├── AutoLayoutDemo
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── AutoLayoutX.swift
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ ├── LabelTextFieldViewController.swift
│ │ │ │ ├── LabelTextFieldViewController.xib
│ │ │ │ ├── SimpleViewController.swift
│ │ │ │ ├── SimpleViewController.xib
│ │ │ │ ├── ThreeEqualWidthButtonsViewController.swift
│ │ │ │ ├── ThreeEqualWidthButtonsViewController.xib
│ │ │ │ ├── TwoEqualWidthButtonsViewController.swift
│ │ │ │ ├── TwoEqualWidthButtonsViewController.xib
│ │ │ │ └── ViewController.swift
│ │ │ └── AutoLayoutDemo.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ ├── AutoLayoutDemo.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── AutolayoutManySolution
│ │ │ ├── AutolayoutManySolution
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── AutolayoutSolution1.swift
│ │ │ │ ├── AutolayoutSolution1.xib
│ │ │ │ ├── AutolayoutSolution2.swift
│ │ │ │ ├── AutolayoutSolution2.xib
│ │ │ │ ├── AutolayoutSolution3.swift
│ │ │ │ ├── AutolayoutSolution3.xib
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── MainMenu.xib
│ │ │ │ └── Info.plist
│ │ │ └── AutolayoutManySolution.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ └── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ │ └── xcschemes
│ │ │ ├── AutolayoutManySolution.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ ├── NSScrollViewAutolayout
│ │ │ ├── NSScrollViewAutolayout
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── AppIcon1024.png
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── MainMenu.xib
│ │ │ │ └── Info.plist
│ │ │ └── NSScrollViewAutolayout.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ └── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ │ └── xcschemes
│ │ │ ├── NSScrollViewAutolayout.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── UseAutolayoutByCode
│ │ ├── UseAutolayoutByCode
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj
│ │ │ │ └── Main.storyboard
│ │ │ ├── Info.plist
│ │ │ └── ViewController.swift
│ │ └── UseAutolayoutByCode.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ │ └── Breakpoints_v2.xcbkptlist
│ │ └── xcschemes
│ │ ├── UseAutolayoutByCode.xcscheme
│ │ └── xcschememanagement.plist
│ ├── Chapter 09 NSWindowController
│ │ ├── NSWindowArchitecture
│ │ │ ├── NSWindowArchitecture
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── AppMainWindowController.swift
│ │ │ │ ├── AppMainWindowController.xib
│ │ │ │ ├── AppViewController.swift
│ │ │ │ ├── AppViewController.xib
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── MainMenu.xib
│ │ │ │ └── Info.plist
│ │ │ └── NSWindowArchitecture.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ ├── NSWindowArchitecture.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── NSWindowController
│ │ │ ├── NSWindowController
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ ├── MyWindow.swift
│ │ │ │ └── ViewController.swift
│ │ │ └── NSWindowController.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── NSWindowController.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── NSWindowControllerWithXib
│ │ │ ├── NSWindowControllerWithXib
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── MainMenu.xib
│ │ │ │ ├── Info.plist
│ │ │ │ └── MyWindow.swift
│ │ │ └── NSWindowControllerWithXib.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── NSWindowControllerWithXib.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ └── WindowSwitch
│ │ ├── WindowSwitch
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj
│ │ │ │ └── Main.storyboard
│ │ │ ├── Info.plist
│ │ │ └── ViewController.swift
│ │ └── WindowSwitch.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ ├── idevfans.xcuserdatad
│ │ │ └── xcschemes
│ │ │ ├── WindowSwitch.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── zhaojw.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── Chapter 10 NSViewController
│ │ ├── 10.1 NSViewController
│ │ │ ├── 10.1.5 ChangeView
│ │ │ │ ├── ChangeView
│ │ │ │ │ ├── AppDelegate.swift
│ │ │ │ │ ├── Assets.xcassets
│ │ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Base.lproj
│ │ │ │ │ │ └── Main.storyboard
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ └── ViewController.swift
│ │ │ │ └── ChangeView.xcodeproj
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace
│ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ └── xcuserdata
│ │ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ ├── xcdebugger
│ │ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ │ └── xcschemes
│ │ │ │ │ ├── ChangeView.xcscheme
│ │ │ │ │ └── xcschememanagement.plist
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ └── xcschememanagement.plist
│ │ │ ├── 10.1.6 NSViewControllerTransition
│ │ │ │ ├── NSViewControllerTransition
│ │ │ │ │ ├── AppDelegate.swift
│ │ │ │ │ ├── Assets.xcassets
│ │ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Base.lproj
│ │ │ │ │ │ └── Main.storyboard
│ │ │ │ │ ├── CustomSegue.swift
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ ├── PresentCustomAnimator.swift
│ │ │ │ │ ├── PresentViewController.swift
│ │ │ │ │ └── ViewController.swift
│ │ │ │ └── NSViewControllerTransition.xcodeproj
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace
│ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ └── xcuserdata
│ │ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ ├── xcdebugger
│ │ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ │ └── xcschemes
│ │ │ │ │ ├── NSViewControllerTransition.xcscheme
│ │ │ │ │ └── xcschememanagement.plist
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ ├── NSViewControllerTransition.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ ├── CreateViewController
│ │ │ │ ├── CreateViewController
│ │ │ │ │ ├── AppDelegate.swift
│ │ │ │ │ ├── Assets.xcassets
│ │ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Base.lproj
│ │ │ │ │ │ └── Main.storyboard
│ │ │ │ │ ├── BasicXibViewController.swift
│ │ │ │ │ ├── BasicXibViewController.xib
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ ├── LoadViewController.swift
│ │ │ │ │ ├── Storyboard.storyboard
│ │ │ │ │ ├── Test2ViewController.swift
│ │ │ │ │ ├── TestViewController.swift
│ │ │ │ │ ├── TestViewController.xib
│ │ │ │ │ ├── ViewController.swift
│ │ │ │ │ └── WindowController.swift
│ │ │ │ └── CreateViewController.xcodeproj
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace
│ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ └── xcuserdata
│ │ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ ├── xcdebugger
│ │ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ │ └── xcschemes
│ │ │ │ │ ├── CreateViewController.xcscheme
│ │ │ │ │ └── xcschememanagement.plist
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ └── xcschememanagement.plist
│ │ │ ├── NSViewController
│ │ │ │ ├── NSViewController
│ │ │ │ │ ├── AppDelegate.swift
│ │ │ │ │ ├── Assets.xcassets
│ │ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Base.lproj
│ │ │ │ │ │ └── Main.storyboard
│ │ │ │ │ ├── CustomView1.swift
│ │ │ │ │ ├── CustomView.swift
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ ├── ScrollView1.swift
│ │ │ │ │ ├── ScrollView.swift
│ │ │ │ │ └── ViewController.swift
│ │ │ │ └── NSViewController.xcodeproj
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace
│ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ └── xcuserdata
│ │ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ ├── xcdebugger
│ │ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ │ └── xcschemes
│ │ │ │ │ ├── NSViewController.xcscheme
│ │ │ │ │ └── xcschememanagement.plist
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── ViewController
│ │ │ ├── ViewController
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Button.swift
│ │ │ │ ├── CustomView1.swift
│ │ │ │ ├── CustomView.swift
│ │ │ │ ├── Info.plist
│ │ │ │ ├── ScrollView1.swift
│ │ │ │ ├── ScrollView.swift
│ │ │ │ ├── ViewController.swift
│ │ │ │ └── Window.swift
│ │ │ └── ViewController.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── ViewController.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── 10.2 NSTabViewController
│ │ │ ├── 10.2.1 NSTabViewController
│ │ │ │ ├── NSTabViewController
│ │ │ │ │ ├── AppDelegate.swift
│ │ │ │ │ ├── Assets.xcassets
│ │ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Base.lproj
│ │ │ │ │ │ └── Main.storyboard
│ │ │ │ │ ├── FirstViewController.swift
│ │ │ │ │ ├── FirstViewController.xib
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ ├── SecondViewController.swift
│ │ │ │ │ ├── SecondViewController.xib
│ │ │ │ │ └── ViewController.swift
│ │ │ │ └── NSTabViewController.xcodeproj
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace
│ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ └── xcuserdata
│ │ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ ├── xcdebugger
│ │ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ │ └── xcschemes
│ │ │ │ │ ├── NSTabViewController.xcscheme
│ │ │ │ │ └── xcschememanagement.plist
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ └── xcschememanagement.plist
│ │ │ ├── 10.2.2 NSTabViewControllerXib
│ │ │ │ ├── NSTabViewControllerXib
│ │ │ │ │ ├── AppDelegate.swift
│ │ │ │ │ ├── Assets.xcassets
│ │ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Base.lproj
│ │ │ │ │ │ └── MainMenu.xib
│ │ │ │ │ ├── FirstViewController.swift
│ │ │ │ │ ├── FirstViewController.xib
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ ├── SecondViewController.swift
│ │ │ │ │ ├── SecondViewController.xib
│ │ │ │ │ └── TabViewContrller.swift
│ │ │ │ └── NSTabViewControllerXib.xcodeproj
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace
│ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ └── xcuserdata
│ │ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── xcschemes
│ │ │ │ │ ├── NSTabViewControllerXib.xcscheme
│ │ │ │ │ └── xcschememanagement.plist
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── 10.2.3 NSTabViewControllerStoryboard
│ │ │ ├── NSTabViewControllerStoryboard
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── NSTabViewControllerStoryboard.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ ├── NSTabViewControllerStoryboard.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── 10.3 NSSplitViewController
│ │ │ ├── CollapseSplitView
│ │ │ │ ├── CollapseSplitView
│ │ │ │ │ ├── AppDelegate.swift
│ │ │ │ │ ├── Assets.xcassets
│ │ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Base.lproj
│ │ │ │ │ │ └── Main.storyboard
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ ├── splitOpen@2x.png
│ │ │ │ │ ├── splitOpen.png
│ │ │ │ │ ├── SplitViewController.swift
│ │ │ │ │ └── WindowController.swift
│ │ │ │ └── CollapseSplitView.xcodeproj
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace
│ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ └── xcuserdata
│ │ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── xcschemes
│ │ │ │ │ ├── CollapseSplitView.xcscheme
│ │ │ │ │ └── xcschememanagement.plist
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ └── xcschememanagement.plist
│ │ │ ├── NSSplitVCCodeCreateDemo
│ │ │ │ ├── NSSplitVCCodeCreateDemo
│ │ │ │ │ ├── AppDelegate.swift
│ │ │ │ │ ├── Assets.xcassets
│ │ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Base.lproj
│ │ │ │ │ │ └── Main.storyboard
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ ├── SplitViewController.swift
│ │ │ │ │ ├── SubViewController.swift
│ │ │ │ │ └── SubViewController.xib
│ │ │ │ └── NSSplitVCCodeCreateDemo.xcodeproj
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace
│ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ └── xcuserdata
│ │ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ ├── xcdebugger
│ │ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ │ └── xcschemes
│ │ │ │ │ ├── NSSplitVCCodeCreateDemo.xcscheme
│ │ │ │ │ └── xcschememanagement.plist
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ └── xcschememanagement.plist
│ │ │ ├── NSSplitViewCollapse
│ │ │ │ ├── NSSplitViewCollapse
│ │ │ │ │ ├── AppDelegate.swift
│ │ │ │ │ ├── Assets.xcassets
│ │ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Base.lproj
│ │ │ │ │ │ └── Main.storyboard
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ ├── SplitViewController.swift
│ │ │ │ │ ├── ViewController.swift
│ │ │ │ │ └── WindowController.swift
│ │ │ │ └── NSSplitViewCollapse.xcodeproj
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace
│ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ └── xcuserdata
│ │ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── xcschemes
│ │ │ │ │ ├── NSSplitViewCollapse.xcscheme
│ │ │ │ │ └── xcschememanagement.plist
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── NSSplitViewControllerDemo
│ │ │ ├── NSSplitViewControllerDemo
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── NSSplitViewControllerDemo.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ ├── NSSplitViewControllerDemo.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── 10.4
│ │ │ ├── PureCodeApp
│ │ │ │ ├── PureCodeApp
│ │ │ │ │ ├── AppDelegate.swift
│ │ │ │ │ ├── Assets.xcassets
│ │ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Base.lproj
│ │ │ │ │ │ └── MainMenu.xib
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ ├── ViewController.swift
│ │ │ │ │ └── WindowController.swift
│ │ │ │ └── PureCodeApp.xcodeproj
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace
│ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ └── xcuserdata
│ │ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ ├── xcdebugger
│ │ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ │ └── xcschemes
│ │ │ │ │ ├── PureCodeApp.xcscheme
│ │ │ │ │ └── xcschememanagement.plist
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ └── xcschememanagement.plist
│ │ │ ├── PureCodeFramework
│ │ │ │ ├── PureCodeFramework
│ │ │ │ │ ├── AppDelegate.swift
│ │ │ │ │ ├── Assets.xcassets
│ │ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ ├── main.swift
│ │ │ │ │ ├── ViewController.swift
│ │ │ │ │ └── WindowController.swift
│ │ │ │ └── PureCodeFramework.xcodeproj
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace
│ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ └── xcuserdata
│ │ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ ├── xcdebugger
│ │ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ │ └── xcschemes
│ │ │ │ │ ├── PureCodeFramework.xcscheme
│ │ │ │ │ └── xcschememanagement.plist
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── PureCodeStoryboard
│ │ │ ├── PureCodeStoryboard
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ ├── ViewController.swift
│ │ │ │ └── WindowController.swift
│ │ │ └── PureCodeStoryboard.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ ├── PureCodeStoryboard.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── 10.5
│ │ │ ├── 10.5.1 WindowLogin
│ │ │ │ ├── WindowLogin
│ │ │ │ │ ├── AppDelegate.swift
│ │ │ │ │ ├── Assets.xcassets
│ │ │ │ │ │ ├── AppIcon.appiconset
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ ├── Contents.json
│ │ │ │ │ │ ├── ic_close.imageset
│ │ │ │ │ │ │ ├── Contents.json
│ │ │ │ │ │ │ └── ic_close@2x.png
│ │ │ │ │ │ └── ic_face.imageset
│ │ │ │ │ │ ├── Contents.json
│ │ │ │ │ │ └── ic_face@2x.png
│ │ │ │ │ ├── Base.lproj
│ │ │ │ │ │ └── Main.storyboard
│ │ │ │ │ ├── Controllers
│ │ │ │ │ │ ├── LoginViewController.swift
│ │ │ │ │ │ ├── LoginWindowController.swift
│ │ │ │ │ │ └── MainWindowController.swift
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ ├── WindowBorderless.swift
│ │ │ │ │ └── WindowLogin.entitlements
│ │ │ │ └── WindowLogin.xcodeproj
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace
│ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ └── xcuserdata
│ │ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── xcuserdata
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ └── xcschememanagement.plist
│ │ │ ├── 10.5.2 WindowLogin
│ │ │ │ ├── WindowLogin
│ │ │ │ │ ├── AppDelegate.swift
│ │ │ │ │ ├── Assets.xcassets
│ │ │ │ │ │ ├── AppIcon.appiconset
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ ├── Contents.json
│ │ │ │ │ │ ├── ic_close.imageset
│ │ │ │ │ │ │ ├── Contents.json
│ │ │ │ │ │ │ └── ic_close@2x.png
│ │ │ │ │ │ └── ic_face.imageset
│ │ │ │ │ │ ├── Contents.json
│ │ │ │ │ │ └── ic_face@2x.png
│ │ │ │ │ ├── Base.lproj
│ │ │ │ │ │ └── Main.storyboard
│ │ │ │ │ ├── Controllers
│ │ │ │ │ │ ├── LoginViewController.swift
│ │ │ │ │ │ ├── LoginWindowController.swift
│ │ │ │ │ │ └── MainWindowController.swift
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ ├── WindowBorderless.swift
│ │ │ │ │ └── WindowLogin.entitlements
│ │ │ │ └── WindowLogin.xcodeproj
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace
│ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ └── xcuserdata
│ │ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── xcuserdata
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── 10.5.3 WindowLogin
│ │ │ ├── WindowLoginEffect
│ │ │ │ ├── WindowLogin
│ │ │ │ │ ├── AppDelegate.swift
│ │ │ │ │ ├── Assets.xcassets
│ │ │ │ │ │ ├── AppIcon.appiconset
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ ├── Contents.json
│ │ │ │ │ │ ├── ic_close.imageset
│ │ │ │ │ │ │ ├── Contents.json
│ │ │ │ │ │ │ └── ic_close@2x.png
│ │ │ │ │ │ └── ic_face.imageset
│ │ │ │ │ │ ├── Contents.json
│ │ │ │ │ │ └── ic_face@2x.png
│ │ │ │ │ ├── Base.lproj
│ │ │ │ │ │ └── Main.storyboard
│ │ │ │ │ ├── Controllers
│ │ │ │ │ │ ├── LoginViewController.swift
│ │ │ │ │ │ ├── LoginWindowController.swift
│ │ │ │ │ │ └── MainWindowController.swift
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ ├── WindowBorderless.swift
│ │ │ │ │ └── WindowLogin.entitlements
│ │ │ │ └── WindowLogin.xcodeproj
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace
│ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ └── xcuserdata
│ │ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── xcuserdata
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ └── xcschememanagement.plist
│ │ │ ├── WindowLoginEffectByCode
│ │ │ │ ├── WindowLogin
│ │ │ │ │ ├── AppDelegate.swift
│ │ │ │ │ ├── Assets.xcassets
│ │ │ │ │ │ ├── AppIcon.appiconset
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ ├── Contents.json
│ │ │ │ │ │ ├── ic_close.imageset
│ │ │ │ │ │ │ ├── Contents.json
│ │ │ │ │ │ │ └── ic_close@2x.png
│ │ │ │ │ │ └── ic_face.imageset
│ │ │ │ │ │ ├── Contents.json
│ │ │ │ │ │ └── ic_face@2x.png
│ │ │ │ │ ├── Base.lproj
│ │ │ │ │ │ └── Main.storyboard
│ │ │ │ │ ├── Controllers
│ │ │ │ │ │ ├── LoginViewController.swift
│ │ │ │ │ │ ├── LoginWindowController.swift
│ │ │ │ │ │ └── MainWindowController.swift
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ ├── WindowBorderless.swift
│ │ │ │ │ └── WindowLogin.entitlements
│ │ │ │ └── WindowLogin.xcodeproj
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace
│ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ └── xcuserdata
│ │ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── xcuserdata
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ └── xcschememanagement.plist
│ │ │ ├── WindowLoginFilter
│ │ │ │ ├── WindowLogin
│ │ │ │ │ ├── AppDelegate.swift
│ │ │ │ │ ├── Assets.xcassets
│ │ │ │ │ │ ├── AppIcon.appiconset
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ ├── Contents.json
│ │ │ │ │ │ ├── ic_close.imageset
│ │ │ │ │ │ │ ├── Contents.json
│ │ │ │ │ │ │ └── ic_close@2x.png
│ │ │ │ │ │ └── ic_face.imageset
│ │ │ │ │ │ ├── Contents.json
│ │ │ │ │ │ └── ic_face@2x.png
│ │ │ │ │ ├── Base.lproj
│ │ │ │ │ │ └── Main.storyboard
│ │ │ │ │ ├── Controllers
│ │ │ │ │ │ ├── LoginViewController.swift
│ │ │ │ │ │ ├── LoginWindowController.swift
│ │ │ │ │ │ └── MainWindowController.swift
│ │ │ │ │ ├── Info.plist
│ │ │ │ │ ├── WindowBorderless.swift
│ │ │ │ │ └── WindowLogin.entitlements
│ │ │ │ └── WindowLogin.xcodeproj
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace
│ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ └── xcuserdata
│ │ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── xcuserdata
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── WindowLoginViewByCode
│ │ │ ├── WindowLogin
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ ├── AppIcon.appiconset
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ ├── ic_close.imageset
│ │ │ │ │ │ ├── Contents.json
│ │ │ │ │ │ └── ic_close@2x.png
│ │ │ │ │ └── ic_face.imageset
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── ic_face@2x.png
│ │ │ │ ├── AutoLayout
│ │ │ │ │ └── AutoLayoutX.swift
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Controllers
│ │ │ │ │ ├── LoginViewController.swift
│ │ │ │ │ ├── LoginWindowController.swift
│ │ │ │ │ ├── MainViewController.swift
│ │ │ │ │ └── MainWindowController.swift
│ │ │ │ ├── Info.plist
│ │ │ │ ├── WindowBorderless.swift
│ │ │ │ └── WindowLogin.entitlements
│ │ │ └── WindowLogin.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ └── zhaojw.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ └── 10.6
│ │ ├── PageScrollView
│ │ │ ├── AutoLayoutX
│ │ │ │ └── AutoLayoutX.swift
│ │ │ ├── Images
│ │ │ │ ├── icon10.png
│ │ │ │ ├── icon11.png
│ │ │ │ ├── icon12.png
│ │ │ │ ├── icon13.png
│ │ │ │ ├── icon1.png
│ │ │ │ ├── icon2.png
│ │ │ │ ├── icon3.png
│ │ │ │ ├── icon4.png
│ │ │ │ ├── icon5.png
│ │ │ │ ├── icon6.png
│ │ │ │ ├── icon7.png
│ │ │ │ ├── icon8.png
│ │ │ │ └── icon9.png
│ │ │ ├── PageScrollView
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ ├── PageContainer.swift
│ │ │ │ ├── PageIndicator.swift
│ │ │ │ ├── PageScrollView.entitlements
│ │ │ │ ├── PageScrollView.swift
│ │ │ │ └── ViewController.swift
│ │ │ └── PageScrollView.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ └── zhaojw.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── ScrollViewButtons
│ │ │ ├── ScrollViewButtons
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── AutoLayout
│ │ │ │ │ └── AutoLayoutX.swift
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── ButtonView.swift
│ │ │ │ ├── Info.plist
│ │ │ │ ├── ScrollViewButtons.entitlements
│ │ │ │ └── ViewController.swift
│ │ │ └── ScrollViewButtons.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ └── ScrollViewHorizontalButtons
│ │ ├── ScrollViewButtons
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── AutoLayout
│ │ │ │ └── AutoLayoutX.swift
│ │ │ ├── Base.lproj
│ │ │ │ └── Main.storyboard
│ │ │ ├── ButtonView.swift
│ │ │ ├── Info.plist
│ │ │ ├── ScrollViewButtons.entitlements
│ │ │ └── ViewController.swift
│ │ └── ScrollViewButtons.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ └── zhaojw.xcuserdatad
│ │ ├── xcdebugger
│ │ │ └── Breakpoints_v2.xcbkptlist
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── Chapter 11 Mouse & Keyboard Event
│ │ └── NSEvent
│ │ ├── NSEvent
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj
│ │ │ │ └── Main.storyboard
│ │ │ ├── CaptureCtrlKeyView.swift
│ │ │ ├── CustomTextView.swift
│ │ │ ├── DragView.swift
│ │ │ ├── Info.plist
│ │ │ ├── NSButtonX.swift
│ │ │ ├── NSTextFieldX.swift
│ │ │ ├── TextView.swift
│ │ │ ├── TrackView.swift
│ │ │ ├── ViewController.swift
│ │ │ ├── View.swift
│ │ │ └── Window.swift
│ │ └── NSEvent.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ ├── idevfans.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ ├── NSEvent.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── zhaojw.xcuserdatad
│ │ ├── xcdebugger
│ │ │ └── Breakpoints_v2.xcbkptlist
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── Chapter 12 UndoRedo
│ │ ├── ComputeUndoRedo
│ │ │ ├── ComputeUndoRedo
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ ├── UndoManager+Ext.swift
│ │ │ │ └── ViewController.swift
│ │ │ └── ComputeUndoRedo.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── ComputeUndoRedo.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ └── NSUndoManager
│ │ ├── NSUndoManager
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj
│ │ │ │ └── Main.storyboard
│ │ │ ├── Info.plist
│ │ │ └── ViewController.swift
│ │ └── NSUndoManager.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ ├── idevfans.xcuserdatad
│ │ │ └── xcschemes
│ │ │ ├── NSUndoManager.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── zhaojw.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── Chapter 13 DragDrop
│ │ ├── DragDrop
│ │ │ ├── DragDrop
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── DragImageDataItem.swift
│ │ │ │ ├── DragSourceView.swift
│ │ │ │ ├── DrawImageItem.swift
│ │ │ │ ├── DropDestinationView.swift
│ │ │ │ ├── Info.plist
│ │ │ │ ├── online@2x.png
│ │ │ │ └── ViewController.swift
│ │ │ └── DragDrop.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── DragDrop.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── FileDrag
│ │ │ ├── FileDrag
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── FileDragView.swift
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── FileDrag.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── FileDrag.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── NSOutlineViewDragDrop
│ │ │ ├── NSOutlineViewDragDrop
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── NSOutlineViewDragDrop.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── NSOutlineViewDragDrop.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ └── NSTableViewDragDrop
│ │ ├── NSTableViewDragDrop
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj
│ │ │ │ └── Main.storyboard
│ │ │ ├── Info.plist
│ │ │ └── ViewController.swift
│ │ └── NSTableViewDragDrop.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ ├── idevfans.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ ├── NSTableViewDragDrop.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── zhaojw.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── Chapter 14 CocoaBindings
│ │ ├── KVBEmploee
│ │ │ ├── KVBEmploee
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Emploee.xcdatamodeld
│ │ │ │ │ └── Emploee.xcdatamodel
│ │ │ │ │ └── contents
│ │ │ │ ├── Employee.swift
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── KVBEmployee.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── KVBEmploee.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── KVC
│ │ │ ├── KVC
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ ├── Person.swift
│ │ │ │ ├── Phone.swift
│ │ │ │ └── ViewController.swift
│ │ │ └── KVC.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── KVC.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── KVO
│ │ │ ├── KVO
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── DBPath.swift
│ │ │ │ ├── Info.plist
│ │ │ │ ├── Student.swift
│ │ │ │ ├── Teacher.swift
│ │ │ │ └── ViewController.swift
│ │ │ └── KVO.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── KVO.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── NSArrayController
│ │ │ ├── NSArrayController
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Employee.swift
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── NSArrayController.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ ├── NSArrayController.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ └── NSTreeController
│ │ ├── NSTreeController
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj
│ │ │ │ └── Main.storyboard
│ │ │ ├── Info.plist
│ │ │ ├── TreeController.swift
│ │ │ ├── TreeNode.swift
│ │ │ └── ViewController.swift
│ │ └── NSTreeController.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ ├── idevfans.xcuserdatad
│ │ │ └── xcschemes
│ │ │ ├── NSTreeController.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── zhaojw.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── Chapter 15 Bluetooth
│ │ ├── BluetoothCentral
│ │ │ ├── BluetoothCentral
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── BluetoothCentral.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── BluetoothCentral.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── BluetoothCentralIPhone
│ │ │ ├── BluetoothCentralIPhone
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ ├── LaunchScreen.storyboard
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── BluetoothCentralIPhone.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── BluetoothCentralIPhone.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ └── BluetoothPeripheralOSX
│ │ ├── BluetoothPeripheralOSX
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj
│ │ │ │ └── Main.storyboard
│ │ │ ├── Info.plist
│ │ │ └── ViewController.swift
│ │ └── BluetoothPeripheralOSX.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ ├── idevfans.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ ├── BluetoothPeripheralOSX.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── zhaojw.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── Chapter 16 Bonjour
│ │ ├── BonjourClient
│ │ │ ├── BonjourClient
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── BonjourClient.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ ├── BonjourClient.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ └── BonjourServer
│ │ ├── BonjourServer
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj
│ │ │ │ └── Main.storyboard
│ │ │ ├── Info.plist
│ │ │ └── ViewController.swift
│ │ └── BonjourServer.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ ├── idevfans.xcuserdatad
│ │ │ └── xcschemes
│ │ │ ├── BonjourServer.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── zhaojw.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── Chapter 17 Services
│ │ └── SysServiceDemo
│ │ ├── ServiceProvider.swift
│ │ ├── SysServiceDemo
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj
│ │ │ │ └── Main.storyboard
│ │ │ ├── Info.plist
│ │ │ ├── TextView.swift
│ │ │ └── ViewController.swift
│ │ └── SysServiceDemo.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ ├── idevfans.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ ├── SysServiceDemo.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── zhaojw.xcuserdatad
│ │ ├── xcdebugger
│ │ │ └── Breakpoints_v2.xcbkptlist
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── Chapter 18 XPC
│ │ ├── XPCBidirectionDemo
│ │ │ ├── CallbackProtocol.swift
│ │ │ ├── DHelper
│ │ │ │ ├── Helper.swift
│ │ │ │ ├── Info.plist
│ │ │ │ └── main.swift
│ │ │ ├── HelperProtocol.swift
│ │ │ ├── XPCBidirectionDemo
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ ├── ViewController.swift
│ │ │ │ └── XPCBidirectionDemo.entitlements
│ │ │ └── XPCBidirectionDemo.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── DHelper.xcscheme
│ │ │ │ ├── xcschememanagement.plist
│ │ │ │ └── XPCBidirectionDemo.xcscheme
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ └── XPCDemo
│ │ ├── Helper
│ │ │ ├── Helper.entitlements
│ │ │ ├── Helper.swift
│ │ │ ├── Info.plist
│ │ │ └── main.swift
│ │ ├── HelperProtocol.swift
│ │ ├── XPCDemo
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj
│ │ │ │ └── Main.storyboard
│ │ │ ├── Info.plist
│ │ │ ├── ViewController.swift
│ │ │ └── XPCDemo.entitlements
│ │ └── XPCDemo.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ ├── idevfans.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ ├── Helper.xcscheme
│ │ │ ├── xcschememanagement.plist
│ │ │ └── XPCDemo.xcscheme
│ │ └── zhaojw.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── Chapter 19 UserNotification
│ │ ├── LocalNotification
│ │ │ ├── LocalNotification
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ ├── icon_mac_128@2x.png
│ │ │ │ │ ├── icon_mac_128.png
│ │ │ │ │ ├── icon_mac_16@2x.png
│ │ │ │ │ ├── icon_mac_16.png
│ │ │ │ │ ├── icon_mac_256@2x.png
│ │ │ │ │ ├── icon_mac_256.png
│ │ │ │ │ ├── icon_mac_32@2x.png
│ │ │ │ │ ├── icon_mac_32.png
│ │ │ │ │ ├── icon_mac_512@2x.png
│ │ │ │ │ └── icon_mac_512.png
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ ├── Menu.png
│ │ │ │ └── ViewController.swift
│ │ │ └── LocalNotification.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ ├── LocalNotification.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ └── PushNotification
│ │ ├── PushNotification
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj
│ │ │ │ └── Main.storyboard
│ │ │ ├── Info.plist
│ │ │ ├── PushNotification.entitlements
│ │ │ └── ViewController.swift
│ │ └── PushNotification.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ ├── idevfans.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ ├── PushNotification.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── zhaojw.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── Chapter 20 Document
│ │ ├── Doc
│ │ │ ├── Doc
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ ├── Document.xib
│ │ │ │ │ └── MainMenu.xib
│ │ │ │ ├── Document.swift
│ │ │ │ └── Info.plist
│ │ │ └── Doc.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ ├── Doc.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── DocumentDemo
│ │ │ ├── DocumentDemo
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ ├── AppIcon.appiconset
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── DataIcon.png
│ │ │ │ ├── Document.swift
│ │ │ │ ├── Info.plist
│ │ │ │ ├── pdata.png
│ │ │ │ └── ViewController.swift
│ │ │ └── DocumentDemo.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── DocumentDemo.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── FileWrapper
│ │ │ ├── FileWrapper
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── DataIcon.png
│ │ │ │ ├── Document.swift
│ │ │ │ ├── Image.png
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── FileWrapper.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── FileWrapper.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ └── PersonProfileDoc
│ │ ├── PersonProfileDoc
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj
│ │ │ │ └── Main.storyboard
│ │ │ ├── Document.swift
│ │ │ ├── Info.plist
│ │ │ ├── PackageDocument.swift
│ │ │ ├── pdata.png
│ │ │ ├── PersonProfile.swift
│ │ │ └── ViewController.swift
│ │ └── PersonProfileDoc.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ ├── idevfans.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ ├── PersonProfileDoc.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── zhaojw.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── Chapter 21 iCloud
│ │ └── iCloud
│ │ ├── iCloud
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj
│ │ │ │ └── Main.storyboard
│ │ │ ├── iCloud.entitlements
│ │ │ ├── Info.plist
│ │ │ └── ViewController.swift
│ │ └── iCloudDemo.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ ├── idevfans.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ ├── iCloudDemo.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── zhaojw.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── Chapter 22 CloudKit
│ │ └── CloudKitDemo
│ │ ├── CloudKitDemo
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj
│ │ │ │ └── Main.storyboard
│ │ │ ├── CloudKitDemo.entitlements
│ │ │ ├── Info.plist
│ │ │ └── ViewController.swift
│ │ └── CloudKitDemo.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ ├── idevfans.xcuserdatad
│ │ │ └── xcschemes
│ │ │ ├── CloudKitDemo.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── zhaojw.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── Chapter 23 CoreData
│ │ ├── ClassesManager
│ │ │ ├── Classes+CoreDataClass.swift
│ │ │ ├── Classes+CoreDataProperties.swift
│ │ │ ├── ClassesManager
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── ClassesManager.xcdatamodeld
│ │ │ │ │ └── ClassesManager.xcdatamodel
│ │ │ │ │ └── contents
│ │ │ │ ├── CoreDataManager.swift
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── ClassesManager.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── ClassesManager.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── School
│ │ │ ├── Classes+CoreDataClass.swift
│ │ │ ├── Classes+CoreDataProperties.swift
│ │ │ ├── Profile+CoreDataClass.swift
│ │ │ ├── Profile+CoreDataProperties.swift
│ │ │ ├── School
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ ├── School2.xcdatamodeld
│ │ │ │ │ └── School.xcdatamodel
│ │ │ │ │ └── contents
│ │ │ │ ├── School.entitlements
│ │ │ │ ├── School.xcdatamodeld
│ │ │ │ │ └── School.xcdatamodel
│ │ │ │ │ └── contents
│ │ │ │ └── ViewController.swift
│ │ │ ├── School.xcdatamodeld
│ │ │ │ └── School.xcdatamodel
│ │ │ │ └── contents
│ │ │ ├── School.xcodeproj
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace
│ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ └── xcuserdata
│ │ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── xcuserdata
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ └── xcschememanagement.plist
│ │ │ ├── Students+CoreDataClass.swift
│ │ │ ├── Students+CoreDataProperties.swift
│ │ │ ├── Subjects+CoreDataClass.swift
│ │ │ └── Subjects+CoreDataProperties.swift
│ │ ├── SchoolV2
│ │ │ ├── Classes+CoreDataClass.swift
│ │ │ ├── Classes+CoreDataProperties.swift
│ │ │ ├── Profile+CoreDataClass.swift
│ │ │ ├── Profile+CoreDataProperties.swift
│ │ │ ├── SchoolV2
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── CoreDataManager.swift
│ │ │ │ ├── Info.plist
│ │ │ │ ├── School.xcdatamodeld
│ │ │ │ │ ├── SchoolV2.xcdatamodel
│ │ │ │ │ │ └── contents
│ │ │ │ │ └── School.xcdatamodel
│ │ │ │ │ └── contents
│ │ │ │ └── ViewController.swift
│ │ │ ├── SchoolV2.xcodeproj
│ │ │ │ ├── project.pbxproj
│ │ │ │ ├── project.xcworkspace
│ │ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ │ └── xcuserdata
│ │ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── xcschemes
│ │ │ │ │ ├── SchoolV2.xcscheme
│ │ │ │ │ └── xcschememanagement.plist
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ └── xcschememanagement.plist
│ │ │ ├── School.xcdatamodeld
│ │ │ │ └── School.xcdatamodel
│ │ │ │ └── contents
│ │ │ ├── Students+CoreDataClass.swift
│ │ │ ├── Students+CoreDataProperties.swift
│ │ │ ├── Subjects+CoreDataClass.swift
│ │ │ └── Subjects+CoreDataProperties.swift
│ │ └── SchoolV3
│ │ ├── Classes+CoreDataClass.swift
│ │ ├── Classes+CoreDataProperties.swift
│ │ ├── ClassInfo+CoreDataClass.swift
│ │ ├── ClassInfo+CoreDataProperties.swift
│ │ ├── Profile+CoreDataClass.swift
│ │ ├── Profile+CoreDataProperties.swift
│ │ ├── SchoolV2
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj
│ │ │ │ └── Main.storyboard
│ │ │ ├── CoreDataManager.swift
│ │ │ ├── Info.plist
│ │ │ ├── School.xcdatamodeld
│ │ │ │ ├── SchoolV2.xcdatamodel
│ │ │ │ │ └── contents
│ │ │ │ ├── SchoolV3.xcdatamodel
│ │ │ │ │ └── contents
│ │ │ │ └── School.xcdatamodel
│ │ │ │ └── contents
│ │ │ └── ViewController.swift
│ │ ├── SchoolV2_V3.xcmappingmodel
│ │ │ └── xcmapping.xml
│ │ ├── SchoolV3.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ ├── SchoolV3.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── School.xcdatamodeld
│ │ │ └── School.xcdatamodel
│ │ │ └── contents
│ │ ├── Students+CoreDataClass.swift
│ │ ├── Students+CoreDataProperties.swift
│ │ ├── Subjects+CoreDataClass.swift
│ │ └── Subjects+CoreDataProperties.swift
│ ├── Chapter 24 HTTP
│ │ ├── HTTP
│ │ │ ├── HTTP
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── HTTP.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── HTTP.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── HTTPClient
│ │ │ ├── HTTPClient
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── HTTPClientSessionDelegate.swift
│ │ │ │ ├── HTTPClient.swift
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── HTTPClient.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── HTTPClient.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── HTTPCookie
│ │ │ ├── HTTPCookie
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── HTTPCookie.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ ├── HTTPCookie.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ └── HTTPFileDownUpload
│ │ ├── HTTPFileDownUpload
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj
│ │ │ │ └── Main.storyboard
│ │ │ ├── Info.plist
│ │ │ └── ViewController.swift
│ │ └── HTTPFileDownUpload.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ ├── idevfans.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ ├── HTTPFileDownUpload.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── zhaojw.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── Chapter 25 Thread
│ │ ├── GCD
│ │ │ ├── GCD
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── HTTPClientSessionDelegate.swift
│ │ │ │ ├── HTTPClient.swift
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── GCD.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── GCD.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ ├── OperationQueue
│ │ │ ├── OperationQueue
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── HTTPImageOperation.swift
│ │ │ │ ├── Info.plist
│ │ │ │ └── ViewController.swift
│ │ │ └── OperationQueue.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ ├── OperationQueue.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ └── Thread
│ │ ├── Thread
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj
│ │ │ │ └── Main.storyboard
│ │ │ ├── Info.plist
│ │ │ ├── NSConditionLockTest.swift
│ │ │ ├── NSConditionTest.swift
│ │ │ ├── ViewController.swift
│ │ │ └── WorkThread.swift
│ │ └── Thread.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ ├── idevfans.xcuserdatad
│ │ │ └── xcschemes
│ │ │ ├── Thread.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── zhaojw.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── Chapter 26 RunLoop
│ │ ├── RunLoop
│ │ │ ├── RunLoop
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ ├── screen.png
│ │ │ │ └── ViewController.swift
│ │ │ └── RunLoop.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── RunLoop.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ └── RunLoopiOS
│ │ ├── RunLoopiOS
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj
│ │ │ │ ├── LaunchScreen.storyboard
│ │ │ │ └── Main.storyboard
│ │ │ ├── Info.plist
│ │ │ └── ViewController.swift
│ │ └── RunLoopiOS.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ ├── idevfans.xcuserdatad
│ │ │ └── xcschemes
│ │ │ ├── RunLoopiOS.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── zhaojw.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── Chapter 27 CocoaDraw
│ │ ├── Chapter 27 CocoaDraw
│ │ │ └── CocoaDraw
│ │ │ ├── CocoaDraw
│ │ │ │ ├── AffineTransView.swift
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── ColorViewController.swift
│ │ │ │ ├── DrawObject.swift
│ │ │ │ ├── GradientViewController.swift
│ │ │ │ ├── image.png
│ │ │ │ ├── ImageViewController.swift
│ │ │ │ ├── Info.plist
│ │ │ │ ├── LineGradientView.swift
│ │ │ │ ├── LockFocusView.swift
│ │ │ │ ├── PathView.swift
│ │ │ │ ├── RadialGradientView.swift
│ │ │ │ ├── ShadowDrawView.swift
│ │ │ │ ├── ShadowViewController.swift
│ │ │ │ ├── StringDrawView.swift
│ │ │ │ └── ViewController.swift
│ │ │ └── CocoaDraw.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── CocoaDraw.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ └── CocoaDraw
│ │ ├── CocoaDraw
│ │ │ ├── AffineTransView.swift
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj
│ │ │ │ └── Main.storyboard
│ │ │ ├── ColorViewController.swift
│ │ │ ├── DrawObject.swift
│ │ │ ├── GradientViewController.swift
│ │ │ ├── image.png
│ │ │ ├── ImageViewController.swift
│ │ │ ├── Info.plist
│ │ │ ├── LineGradientView.swift
│ │ │ ├── LockFocusView.swift
│ │ │ ├── PathView.swift
│ │ │ ├── RadialGradientView.swift
│ │ │ ├── ShadowDrawView.swift
│ │ │ ├── ShadowViewController.swift
│ │ │ ├── StringDrawView.swift
│ │ │ └── ViewController.swift
│ │ └── CocoaDraw.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ ├── idevfans.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ ├── CocoaDraw.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── zhaojw.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── Chapter 28 CoreAnimation
│ │ ├── CALayerDemo
│ │ │ ├── CALayerDemo
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Ball_blue.png
│ │ │ │ ├── Ball_green.png
│ │ │ │ ├── Ball_red.png
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── CAEmitterLayerVC.swift
│ │ │ │ ├── CAGradientLayerVC.swift
│ │ │ │ ├── CAReplicatorLayerVC.swift
│ │ │ │ ├── CAShapeLayerVC.swift
│ │ │ │ ├── CATextLayerVC.swift
│ │ │ │ ├── CATiledLayerVC.swift
│ │ │ │ ├── CATransformLayerVC.swift
│ │ │ │ ├── Info.plist
│ │ │ │ ├── NSImage+cgImage.swift
│ │ │ │ ├── snowflake.png
│ │ │ │ ├── snowFlakesCell.png
│ │ │ │ ├── TileView.swift
│ │ │ │ └── ViewController.swift
│ │ │ └── CALayerDemo.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── CALayerDemo.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ ├── CALayerDemo.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── CoreAnimation
│ │ ├── CoreAnimation
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj
│ │ │ │ └── Main.storyboard
│ │ │ ├── BlueLayer.swift
│ │ │ ├── CustomView.swift
│ │ │ ├── gradintCell.png
│ │ │ ├── GroupAnimationWC.swift
│ │ │ ├── GroupAnimationWC.xib
│ │ │ ├── Info.plist
│ │ │ ├── KeyframeAnimationWC.swift
│ │ │ ├── KeyframeAnimationWC.xib
│ │ │ ├── PathAnimationWC.swift
│ │ │ ├── PathAnimationWC.xib
│ │ │ ├── TransitionAnimationWC.swift
│ │ │ ├── TransitionAnimationWC.xib
│ │ │ └── ViewController.swift
│ │ └── CoreAnimation.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ ├── idevfans.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ ├── CoreAnimation.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── zhaojw.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── Chapter 29 MultiDelegate
│ │ ├── BuddyMultiDelegateDemo
│ │ │ ├── BuddyMultiDelegateDemo
│ │ │ │ ├── App-Bridging-Header.h
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── AutoLayoutX
│ │ │ │ │ └── AutoLayoutX.swift
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── BuddyDetailViewController.swift
│ │ │ │ ├── BuddyListViewController.swift
│ │ │ │ ├── BuddyStatusManager.swift
│ │ │ │ ├── DAO
│ │ │ │ │ ├── BuddyDetailDAO.swift
│ │ │ │ │ └── BuddyListDAO.swift
│ │ │ │ ├── DataStoreBO
│ │ │ │ │ └── DataStoreBO.swift
│ │ │ │ ├── DispatchQueue+Ext.swift
│ │ │ │ ├── Info.plist
│ │ │ │ ├── MainViewController.swift
│ │ │ │ ├── MDatabase
│ │ │ │ │ ├── DBObject
│ │ │ │ │ │ ├── DAO.swift
│ │ │ │ │ │ ├── MDAO.swift
│ │ │ │ │ │ ├── MDatabase.swift
│ │ │ │ │ │ └── MModel.swift
│ │ │ │ │ ├── Meta
│ │ │ │ │ │ ├── DatabaseInfo.swift
│ │ │ │ │ │ ├── FieldInfo.swift
│ │ │ │ │ │ ├── MDatabase+Meta.swift
│ │ │ │ │ │ ├── TableInfo.swift
│ │ │ │ │ │ └── TypeKit.swift
│ │ │ │ │ └── String+Regex.swift
│ │ │ │ ├── Model
│ │ │ │ │ ├── BuddyDetail.swift
│ │ │ │ │ └── BuddyList.swift
│ │ │ │ ├── NSImage+HHTint.h
│ │ │ │ ├── NSImage+HHTint.m
│ │ │ │ ├── Resources
│ │ │ │ │ ├── DB
│ │ │ │ │ │ └── Chat.sqlite
│ │ │ │ │ └── images
│ │ │ │ │ ├── 10.png
│ │ │ │ │ ├── 11.png
│ │ │ │ │ ├── 12.png
│ │ │ │ │ ├── 13.png
│ │ │ │ │ ├── 14.png
│ │ │ │ │ ├── 15.png
│ │ │ │ │ ├── 16.png
│ │ │ │ │ ├── 1.png
│ │ │ │ │ ├── 2.png
│ │ │ │ │ ├── 3.png
│ │ │ │ │ ├── 4.png
│ │ │ │ │ ├── 5.png
│ │ │ │ │ ├── 6.png
│ │ │ │ │ ├── 7.png
│ │ │ │ │ ├── 8.png
│ │ │ │ │ ├── 9.png
│ │ │ │ │ ├── offline@2x.png
│ │ │ │ │ ├── offline.png
│ │ │ │ │ ├── online@2x.png
│ │ │ │ │ └── online.png
│ │ │ │ └── Vendor
│ │ │ │ ├── fmdb
│ │ │ │ │ ├── FMDatabaseAdditions.h
│ │ │ │ │ ├── FMDatabaseAdditions.m
│ │ │ │ │ ├── FMDatabase.h
│ │ │ │ │ ├── FMDatabase.m
│ │ │ │ │ ├── FMDatabasePool.h
│ │ │ │ │ ├── FMDatabasePool.m
│ │ │ │ │ ├── FMDatabaseQueue.h
│ │ │ │ │ ├── FMDatabaseQueue.m
│ │ │ │ │ ├── FMDB.h
│ │ │ │ │ ├── FMResultSet.h
│ │ │ │ │ ├── FMResultSet.m
│ │ │ │ │ └── MDatabase-Bridging-Header.h
│ │ │ │ └── GCDMulticastDelegate
│ │ │ │ ├── GCDMulticastDelegate.h
│ │ │ │ └── GCDMulticastDelegate.m
│ │ │ └── BuddyMultiDelegateDemo.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── BuddyMultiDelegateDemo.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ └── MultiDelegate
│ │ ├── MultiDelegate
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj
│ │ │ │ └── Main.storyboard
│ │ │ ├── BuddyListController.swift
│ │ │ ├── BuddyListController.xib
│ │ │ ├── ChatViewController.swift
│ │ │ ├── ChatViewController.xib
│ │ │ ├── Info.plist
│ │ │ ├── MessageManager.swift
│ │ │ └── ViewController.swift
│ │ └── MultiDelegate.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ ├── idevfans.xcuserdatad
│ │ │ └── xcschemes
│ │ │ ├── MultiDelegate.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── zhaojw.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── Chapter 30 Transformer
│ │ └── DataTransformer
│ │ ├── DataTransformer
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj
│ │ │ │ └── Main.storyboard
│ │ │ ├── DataField.swift
│ │ │ ├── Info.plist
│ │ │ ├── IsNotNilTransformer.swift
│ │ │ ├── TypeMapValueTransformer.swift
│ │ │ └── ViewController.swift
│ │ └── DataTransformer.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ ├── idevfans.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ ├── DataTransformer.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── zhaojw.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── Chapter 31 Framework
│ │ ├── XXXBonjourNetWork
│ │ │ ├── XXXBonjourNetWork
│ │ │ │ ├── Helper.h
│ │ │ │ ├── Helper.m
│ │ │ │ ├── Info.plist
│ │ │ │ └── XXXBonjourNetWork.h
│ │ │ ├── XXXBonjourNetWorkManager.swift
│ │ │ └── XXXBonjourNetWork.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── xcschemes
│ │ │ │ ├── libXXXBonjourNetWork.xcscheme
│ │ │ │ ├── xcschememanagement.plist
│ │ │ │ └── XXXBonjourNetWork.xcscheme
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ └── XXXBonjourNetWorkManagerTest
│ │ ├── XXXBonjourNetWorkManagerTest
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj
│ │ │ │ └── Main.storyboard
│ │ │ ├── Info.plist
│ │ │ ├── ViewController.swift
│ │ │ └── XXXBonjourNetWork.framework
│ │ │ ├── Headers
│ │ │ ├── Modules
│ │ │ ├── Resources
│ │ │ ├── Versions
│ │ │ │ ├── A
│ │ │ │ │ ├── Headers
│ │ │ │ │ │ ├── Helper.h
│ │ │ │ │ │ ├── XXXBonjourNetWork.h
│ │ │ │ │ │ └── XXXBonjourNetWork-Swift.h
│ │ │ │ │ ├── Modules
│ │ │ │ │ │ ├── module.modulemap
│ │ │ │ │ │ └── XXXBonjourNetWork.swiftmodule
│ │ │ │ │ │ ├── x86_64.swiftdoc
│ │ │ │ │ │ └── x86_64.swiftmodule
│ │ │ │ │ ├── Resources
│ │ │ │ │ │ └── Info.plist
│ │ │ │ │ └── XXXBonjourNetWork
│ │ │ │ └── Current
│ │ │ └── XXXBonjourNetWork
│ │ └── XXXBonjourNetWorkManagerTest.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ ├── idevfans.xcuserdatad
│ │ │ └── xcschemes
│ │ │ ├── xcschememanagement.plist
│ │ │ └── XXXBonjourNetWorkManagerTest.xcscheme
│ │ └── zhaojw.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── Chapter 32 Sandbox
│ │ └── SandboxFile
│ │ ├── SandboxFile
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj
│ │ │ │ └── Main.storyboard
│ │ │ ├── Info.plist
│ │ │ ├── SandboxFile.entitlements
│ │ │ └── ViewController.swift
│ │ └── SandboxFile.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ ├── idevfans.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ ├── SandboxFile.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── zhaojw.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── Chapter 33 DataNavigation
│ │ └── DataNavigationView
│ │ ├── DataNavigationView
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ ├── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Contents.json
│ │ │ │ ├── first.imageset
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── toolbar-first@2x.png
│ │ │ │ ├── last.imageset
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── toolbar-last@2x.png
│ │ │ │ ├── next.imageset
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── toolbar-next@2x.png
│ │ │ │ └── pre.imageset
│ │ │ │ ├── Contents.json
│ │ │ │ └── toolbar-pre@2x.png
│ │ │ ├── Base.lproj
│ │ │ │ └── Main.storyboard
│ │ │ ├── DataNavigationItem.swift
│ │ │ ├── DataNavigationView.swift
│ │ │ ├── Info.plist
│ │ │ ├── SnapKit
│ │ │ └── ViewController.swift
│ │ ├── DataNavigationView.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── DataNavigationView.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ └── Masonry
│ ├── Chapter 34 TableDataNavigationViewController
│ │ └── TableViewControllerDemo
│ │ ├── File.strings
│ │ ├── TableViewControllerDemo
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ ├── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── closeDB.imageset
│ │ │ │ │ ├── CloseDB@2x.png
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Contents.json
│ │ │ │ ├── database.imageset
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ ├── DBDatabase-Sys@2x.png
│ │ │ │ │ └── DBDatabase-Sys.png
│ │ │ │ ├── first.imageset
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── toolbar-first@2x.png
│ │ │ │ ├── home.imageset
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── SQLite-Home@2x.png
│ │ │ │ ├── last.imageset
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── toolbar-last@2x.png
│ │ │ │ ├── next.imageset
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── toolbar-next@2x.png
│ │ │ │ ├── openDB.imageset
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── openDB@2x.png
│ │ │ │ ├── pre.imageset
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── toolbar-pre@2x.png
│ │ │ │ ├── table.imageset
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ ├── DBTable-Sys@2x.png
│ │ │ │ │ └── DBTable-Sys.png
│ │ │ │ └── windowIcon.imageset
│ │ │ │ ├── Contents.json
│ │ │ │ └── icon_mac_32.png
│ │ │ ├── Base.lproj
│ │ │ │ └── Main.storyboard
│ │ │ ├── DataNavigationItem.swift
│ │ │ ├── DataNavigationView.swift
│ │ │ ├── DataPageManager.swift
│ │ │ ├── Info.plist
│ │ │ ├── NSButton+ColumnItem.swift
│ │ │ ├── NSComboBox+ColumnItem.swift
│ │ │ ├── NSImageView+ColumnItem.swift
│ │ │ ├── NSTableColumn+ColumnItem.swift
│ │ │ ├── NSTableView+ColumnItem.swift
│ │ │ ├── NSTextField+ColumnItem.swift
│ │ │ ├── TableColumnItem.swift
│ │ │ ├── TableDataDelegate.swift
│ │ │ ├── TableDataNavigationViewController.swift
│ │ │ ├── TableDataNavigationViewDelegate.swift
│ │ │ ├── ViewController.swift
│ │ │ ├── ViewController.xib
│ │ │ ├── ViewXibViewController.swift
│ │ │ ├── WindowController.swift
│ │ │ ├── WindowController.xib
│ │ │ ├── XibViewController.swift
│ │ │ └── XibViewController.xib
│ │ └── TableViewControllerDemo.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ ├── idevfans.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ ├── TableViewControllerDemo.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── zhaojw.xcuserdatad
│ │ ├── xcdebugger
│ │ │ └── Breakpoints_v2.xcbkptlist
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── Chapter 35 AutoTools
│ │ ├── ImageAassetAutomator
│ │ │ ├── ImageAassetAutomator
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ ├── AppIcon.appiconset
│ │ │ │ │ │ ├── Contents.json
│ │ │ │ │ │ ├── icon_mac_16@2x.png
│ │ │ │ │ │ ├── icon_mac_16.png
│ │ │ │ │ │ ├── icon_mac_32@2x.png
│ │ │ │ │ │ └── icon_mac_32.png
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── DragImage.imageset
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── DragImage@2x.png
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── DragImageView.swift
│ │ │ │ ├── FileManager+Ext.swift
│ │ │ │ ├── imageSize.plist
│ │ │ │ ├── Info.plist
│ │ │ │ ├── NSImage+Ext.swift
│ │ │ │ ├── NSPasteboard+Ext.swift
│ │ │ │ └── ViewController.swift
│ │ │ └── ImageAassetAutomator.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── ImageAassetAutomator.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ └── LocalizationTools
│ │ ├── Base.lproj
│ │ │ └── Localizable.strings
│ │ ├── en.lproj
│ │ │ └── Localizable.strings
│ │ ├── Flags
│ │ │ ├── AC.png
│ │ │ ├── AD.png
│ │ │ ├── AE.png
│ │ │ ├── AF.png
│ │ │ ├── AG.png
│ │ │ ├── AI.png
│ │ │ ├── AL.png
│ │ │ ├── AM.png
│ │ │ ├── AN.png
│ │ │ ├── AO.png
│ │ │ ├── AQ.png
│ │ │ ├── AR.png
│ │ │ ├── AS.png
│ │ │ ├── AT.png
│ │ │ ├── AU.png
│ │ │ ├── AW.png
│ │ │ ├── AX.png
│ │ │ ├── AZ.png
│ │ │ ├── BA.png
│ │ │ ├── BB.png
│ │ │ ├── BD.png
│ │ │ ├── BE.png
│ │ │ ├── BF.png
│ │ │ ├── BG.png
│ │ │ ├── BH.png
│ │ │ ├── BI.png
│ │ │ ├── BJ.png
│ │ │ ├── BM.png
│ │ │ ├── BN.png
│ │ │ ├── BO.png
│ │ │ ├── BR.png
│ │ │ ├── BS.png
│ │ │ ├── BT.png
│ │ │ ├── BV.png
│ │ │ ├── BW.png
│ │ │ ├── BY.png
│ │ │ ├── BZ.png
│ │ │ ├── CA.png
│ │ │ ├── CC.png
│ │ │ ├── CD.png
│ │ │ ├── CF.png
│ │ │ ├── CG.png
│ │ │ ├── CH.png
│ │ │ ├── CI.png
│ │ │ ├── CK.png
│ │ │ ├── CL.png
│ │ │ ├── CM.png
│ │ │ ├── CN.png
│ │ │ ├── CO.png
│ │ │ ├── CR.png
│ │ │ ├── CU.png
│ │ │ ├── CV.png
│ │ │ ├── CX.png
│ │ │ ├── CY.png
│ │ │ ├── CZ.png
│ │ │ ├── DE.png
│ │ │ ├── DJ.png
│ │ │ ├── DK.png
│ │ │ ├── DM.png
│ │ │ ├── DO.png
│ │ │ ├── DZ.png
│ │ │ ├── EC.png
│ │ │ ├── EE.png
│ │ │ ├── EG.png
│ │ │ ├── EH.png
│ │ │ ├── ER.png
│ │ │ ├── ES.png
│ │ │ ├── ET.png
│ │ │ ├── FI.png
│ │ │ ├── FJ.png
│ │ │ ├── FK.png
│ │ │ ├── FM.png
│ │ │ ├── FO.png
│ │ │ ├── FR.png
│ │ │ ├── FX.png
│ │ │ ├── GA.png
│ │ │ ├── GB.png
│ │ │ ├── GD.png
│ │ │ ├── GE.png
│ │ │ ├── GF.png
│ │ │ ├── GG.png
│ │ │ ├── GH.png
│ │ │ ├── GI.png
│ │ │ ├── GL.png
│ │ │ ├── GM.png
│ │ │ ├── GN.png
│ │ │ ├── GP.png
│ │ │ ├── GQ.png
│ │ │ ├── GR.png
│ │ │ ├── GS.png
│ │ │ ├── GT.png
│ │ │ ├── GU.png
│ │ │ ├── GW.png
│ │ │ ├── GY.png
│ │ │ ├── HE.png
│ │ │ ├── HK.png
│ │ │ ├── HM.png
│ │ │ ├── HN.png
│ │ │ ├── HR.png
│ │ │ ├── HT.png
│ │ │ ├── HU.png
│ │ │ ├── ID.png
│ │ │ ├── IE.png
│ │ │ ├── IL.png
│ │ │ ├── IM.png
│ │ │ ├── IN.png
│ │ │ ├── IO.png
│ │ │ ├── IQ.png
│ │ │ ├── IR.png
│ │ │ ├── IS.png
│ │ │ ├── IT.png
│ │ │ ├── JE.png
│ │ │ ├── JM.png
│ │ │ ├── JO.png
│ │ │ ├── JP.png
│ │ │ ├── KE.png
│ │ │ ├── KG.png
│ │ │ ├── KH.png
│ │ │ ├── KI.png
│ │ │ ├── KM.png
│ │ │ ├── KN.png
│ │ │ ├── KP.png
│ │ │ ├── KR.png
│ │ │ ├── KW.png
│ │ │ ├── KY.png
│ │ │ ├── KZ.png
│ │ │ ├── LA.png
│ │ │ ├── LB.png
│ │ │ ├── LC.png
│ │ │ ├── LI.png
│ │ │ ├── LK.png
│ │ │ ├── LR.png
│ │ │ ├── LS.png
│ │ │ ├── LT.png
│ │ │ ├── LU.png
│ │ │ ├── LV.png
│ │ │ ├── LY.png
│ │ │ ├── MA.png
│ │ │ ├── MC.png
│ │ │ ├── MD.png
│ │ │ ├── ME.png
│ │ │ ├── MF.png
│ │ │ ├── MG.png
│ │ │ ├── MH.png
│ │ │ ├── MK.png
│ │ │ ├── ML.png
│ │ │ ├── MM.png
│ │ │ ├── MN.png
│ │ │ ├── MO.png
│ │ │ ├── MP.png
│ │ │ ├── MQ.png
│ │ │ ├── MR.png
│ │ │ ├── MS.png
│ │ │ ├── MT.png
│ │ │ ├── MU.png
│ │ │ ├── MV.png
│ │ │ ├── MW.png
│ │ │ ├── MX.png
│ │ │ ├── MY.png
│ │ │ ├── MZ.png
│ │ │ ├── NA.png
│ │ │ ├── NC.png
│ │ │ ├── NE.png
│ │ │ ├── NF.png
│ │ │ ├── NG.png
│ │ │ ├── NI.png
│ │ │ ├── NL.png
│ │ │ ├── NO.png
│ │ │ ├── NP.png
│ │ │ ├── NR.png
│ │ │ ├── NU.png
│ │ │ ├── NZ.png
│ │ │ ├── OM.png
│ │ │ ├── PA.png
│ │ │ ├── PE.png
│ │ │ ├── PF.png
│ │ │ ├── PG.png
│ │ │ ├── PH.png
│ │ │ ├── PK.png
│ │ │ ├── PL.png
│ │ │ ├── PM.png
│ │ │ ├── PN.png
│ │ │ ├── PR.png
│ │ │ ├── PS.png
│ │ │ ├── PT.png
│ │ │ ├── PW.png
│ │ │ ├── PY.png
│ │ │ ├── QA.png
│ │ │ ├── RE.png
│ │ │ ├── RO.png
│ │ │ ├── RS.png
│ │ │ ├── RU.png
│ │ │ ├── RW.png
│ │ │ ├── SA.png
│ │ │ ├── SB.png
│ │ │ ├── SC.png
│ │ │ ├── SD.png
│ │ │ ├── SE.png
│ │ │ ├── SG.png
│ │ │ ├── SH.png
│ │ │ ├── SI.png
│ │ │ ├── SJ.png
│ │ │ ├── SK.png
│ │ │ ├── SL.png
│ │ │ ├── SM.png
│ │ │ ├── SN.png
│ │ │ ├── SO.png
│ │ │ ├── SR.png
│ │ │ ├── SS.png
│ │ │ ├── ST.png
│ │ │ ├── SV.png
│ │ │ ├── SY.png
│ │ │ ├── SZ.png
│ │ │ ├── TC.png
│ │ │ ├── TD.png
│ │ │ ├── TF.png
│ │ │ ├── TG.png
│ │ │ ├── TH.png
│ │ │ ├── TJ.png
│ │ │ ├── TK.png
│ │ │ ├── TL.png
│ │ │ ├── TM.png
│ │ │ ├── TN.png
│ │ │ ├── TO.png
│ │ │ ├── TR.png
│ │ │ ├── TT.png
│ │ │ ├── TV.png
│ │ │ ├── TW.png
│ │ │ ├── TZ.png
│ │ │ ├── UA.png
│ │ │ ├── UG.png
│ │ │ ├── UM.png
│ │ │ ├── US.png
│ │ │ ├── UY.png
│ │ │ ├── UZ.png
│ │ │ ├── VA.png
│ │ │ ├── VC.png
│ │ │ ├── VE.png
│ │ │ ├── VG.png
│ │ │ ├── VI.png
│ │ │ ├── VN.png
│ │ │ ├── VU.png
│ │ │ ├── WF.png
│ │ │ ├── WS.png
│ │ │ ├── XK.png
│ │ │ ├── YE.png
│ │ │ ├── YT.png
│ │ │ ├── YU.png
│ │ │ ├── ZA.png
│ │ │ ├── ZM.png
│ │ │ └── ZW.png
│ │ ├── fr.lproj
│ │ │ └── Localizable.strings
│ │ ├── ja.lproj
│ │ │ └── Localizable.strings
│ │ ├── LocalizationTools
│ │ │ ├── AppDelegate.swift
│ │ │ ├── AppleNationDAO.swift
│ │ │ ├── AppleNation.swift
│ │ │ ├── AppleNationVM.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ ├── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── arches.imageset
│ │ │ │ │ ├── arches@2x.png
│ │ │ │ │ ├── arches.png
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Contents.json
│ │ │ │ ├── toolbar-add.imageset
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ ├── toolbar-add-w@2x.png
│ │ │ │ │ └── toolbar-add-w.png
│ │ │ │ ├── toolbar-refresh.imageset
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ ├── toolbar-refresh-w@2x.png
│ │ │ │ │ └── toolbar-refresh-w.png
│ │ │ │ ├── toolbar-remove.imageset
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ ├── toolbar-remove-w@2x.png
│ │ │ │ │ └── toolbar-remove-w.png
│ │ │ │ ├── Trans-ToolBar-Export.imageset
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ ├── Trans-ToolBar-Export2@2x.png
│ │ │ │ │ └── Trans-ToolBar-Export2.png
│ │ │ │ ├── Trans-ToolBar-Help.imageset
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ ├── Trans-ToolBar-Help@2x.png
│ │ │ │ │ └── Trans-ToolBar-Help.png
│ │ │ │ ├── Trans-ToolBar-Open.imageset
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ ├── Trans-ToolBar-Open@2x.png
│ │ │ │ │ └── Trans-ToolBar-Open.png
│ │ │ │ └── Trans-ToolBar-Trans.imageset
│ │ │ │ ├── Contents.json
│ │ │ │ ├── Trans-ToolBar-Trans@2x.png
│ │ │ │ └── Trans-ToolBar-Trans.png
│ │ │ ├── Base.lproj
│ │ │ │ └── Main.storyboard
│ │ │ ├── Countries.plist
│ │ │ ├── DAO.swift
│ │ │ ├── DataNavigationItem.swift
│ │ │ ├── DataNavigationView.swift
│ │ │ ├── FileManager+Ext.swift
│ │ │ ├── fmdb
│ │ │ │ ├── FMDatabaseAdditions.h
│ │ │ │ ├── FMDatabaseAdditions.m
│ │ │ │ ├── FMDatabase.h
│ │ │ │ ├── FMDatabase.m
│ │ │ │ ├── FMDatabasePool.h
│ │ │ │ ├── FMDatabasePool.m
│ │ │ │ ├── FMDatabaseQueue.h
│ │ │ │ ├── FMDatabaseQueue.m
│ │ │ │ ├── FMDB.h
│ │ │ │ ├── FMResultSet.h
│ │ │ │ └── FMResultSet.m
│ │ │ ├── Info.plist
│ │ │ ├── LocalizationFile.swift
│ │ │ ├── LocalizationLang.swift
│ │ │ ├── LocalizationManager.swift
│ │ │ ├── LocalizationProject.swift
│ │ │ ├── LocalizationTools-Bridging-Header.h
│ │ │ ├── MDAO.swift
│ │ │ ├── MDatabase.swift
│ │ │ ├── MModel.swift
│ │ │ ├── MouseAutoClick.h
│ │ │ ├── MouseAutoClick.m
│ │ │ ├── NationBO.swift
│ │ │ ├── NationDAO.swift
│ │ │ ├── NationListViewController.swift
│ │ │ ├── NationListView.swift
│ │ │ ├── NationPanel.swift
│ │ │ ├── NationPanel.xib
│ │ │ ├── Nations.sqlite
│ │ │ ├── Nation.swift
│ │ │ ├── NationTextViewController.swift
│ │ │ ├── NationUtil.swift
│ │ │ ├── NoodleLineNumberView
│ │ │ │ ├── NoodleLineNumberMarker.h
│ │ │ │ ├── NoodleLineNumberMarker.m
│ │ │ │ ├── NoodleLineNumberView.h
│ │ │ │ └── NoodleLineNumberView.m
│ │ │ ├── NSColor+Ext.swift
│ │ │ ├── NSPasteboard+Ext.swift
│ │ │ ├── NSScreen+Ext.swift
│ │ │ ├── String+Component.swift
│ │ │ ├── String+Regex.swift
│ │ │ ├── ViewController.swift
│ │ │ ├── WindowController.swift
│ │ │ └── XcodeEditor
│ │ │ ├── Utils
│ │ │ │ ├── NSString+RemoveEmoji.h
│ │ │ │ ├── NSString+RemoveEmoji.m
│ │ │ │ ├── XCKeyBuilder.h
│ │ │ │ └── XCKeyBuilder.m
│ │ │ ├── XCAbstractDefinition.h
│ │ │ ├── XCAbstractDefinition.m
│ │ │ ├── XCBuildFile.h
│ │ │ ├── XCBuildShellScriptDefinition.h
│ │ │ ├── XCBuildShellScriptDefinition.m
│ │ │ ├── XCBuildShellScript.h
│ │ │ ├── XCBuildShellScript.m
│ │ │ ├── XCClassDefinition.h
│ │ │ ├── XCClassDefinition.m
│ │ │ ├── XCFileOperationQueue.h
│ │ │ ├── XCFileOperationQueue.m
│ │ │ ├── XCFrameworkDefinition.h
│ │ │ ├── XCFrameworkDefinition.m
│ │ │ ├── XCGroup.h
│ │ │ ├── XCGroup.m
│ │ │ ├── XcodeEditor.h
│ │ │ ├── XcodeGroupMember.h
│ │ │ ├── XcodeMemberType.h
│ │ │ ├── XcodeMemberType.m
│ │ │ ├── XcodeSourceFileType.h
│ │ │ ├── XcodeSourceFileType.m
│ │ │ ├── XcodeSourceTreeType.h
│ │ │ ├── XcodeSourceTreeType.m
│ │ │ ├── XCProjectBuildConfig.h
│ │ │ ├── XCProjectBuildConfig.m
│ │ │ ├── XCProject.h
│ │ │ ├── XCProject.m
│ │ │ ├── XCProject+SubProject.h
│ │ │ ├── XCProject+SubProject.m
│ │ │ ├── XCSourceFileDefinition.h
│ │ │ ├── XCSourceFileDefinition.m
│ │ │ ├── XCSourceFile.h
│ │ │ ├── XCSourceFile.m
│ │ │ ├── XCSubProjectDefinition.h
│ │ │ ├── XCSubProjectDefinition.m
│ │ │ ├── XCTarget.h
│ │ │ ├── XCTarget.m
│ │ │ ├── XCVersionGroup.h
│ │ │ ├── XCVersionGroup.m
│ │ │ ├── XCXibDefinition.h
│ │ │ └── XCXibDefinition.m
│ │ ├── LocalizationTools.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── LocalizationTools.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ └── nl.lproj
│ │ └── Localizable.strings
│ ├── Chapter 36 BluetoothTools
│ │ ├── OpenMacI
│ │ │ ├── OpenMacI
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ ├── AppIcon.appiconset
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── MacColor.imageset
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ └── MacColor@2x.png
│ │ │ │ ├── Base.lproj
│ │ │ │ │ ├── LaunchScreen.storyboard
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── ClientCmdHelper.swift
│ │ │ │ ├── Info.plist
│ │ │ │ ├── JSONKit.swift
│ │ │ │ ├── ViewController.swift
│ │ │ │ └── XXXCentralClient.swift
│ │ │ └── OpenMacI.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── OpenMacI.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ └── OpenMacX
│ │ ├── OpenMacX
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ ├── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── blue.imageset
│ │ │ │ │ ├── blue@2x.png
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Contents.json
│ │ │ │ └── openMacIcon.imageset
│ │ │ │ ├── Contents.json
│ │ │ │ └── openMacIcon@2x.png
│ │ │ ├── Base.lproj
│ │ │ │ └── MainMenu.xib
│ │ │ ├── CmdManager.swift
│ │ │ ├── Info.plist
│ │ │ ├── JSONKit.swift
│ │ │ ├── MDRestartShutdownLogout.h
│ │ │ ├── PasswordCmd.strings
│ │ │ ├── SleepCmd.strings
│ │ │ ├── String+Replace.swift
│ │ │ └── XXXPeripheralService.swift
│ │ ├── OpenMacX-Bridging-Header.h
│ │ └── OpenMacX.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ ├── idevfans.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ ├── OpenMacX.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── zhaojw.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── Chapter 37 SQLiteDatabase
│ │ ├── FMDBEncrypt
│ │ │ ├── FMDBEncrypt
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj
│ │ │ │ │ └── MainMenu.xib
│ │ │ │ ├── Database.sqlite
│ │ │ │ ├── fmdb
│ │ │ │ │ ├── FMDatabaseAdditions.h
│ │ │ │ │ ├── FMDatabaseAdditions.m
│ │ │ │ │ ├── FMDatabase.h
│ │ │ │ │ ├── FMDatabase.m
│ │ │ │ │ ├── FMDatabasePool.h
│ │ │ │ │ ├── FMDatabasePool.m
│ │ │ │ │ ├── FMDatabaseQueue.h
│ │ │ │ │ ├── FMDatabaseQueue.m
│ │ │ │ │ ├── FMDB.h
│ │ │ │ │ ├── FMResultSet.h
│ │ │ │ │ └── FMResultSet.m
│ │ │ │ ├── Info.plist
│ │ │ │ ├── MDatabase-Bridging-Header.h
│ │ │ │ ├── sqlite3.c
│ │ │ │ └── sqlite3.h
│ │ │ └── FMDBEncrypt.xcodeproj
│ │ │ ├── project.pbxproj
│ │ │ ├── project.xcworkspace
│ │ │ │ ├── contents.xcworkspacedata
│ │ │ │ └── xcuserdata
│ │ │ │ ├── idevfans.xcuserdatad
│ │ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ │ └── zhaojw.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ ├── xcdebugger
│ │ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ │ └── xcschemes
│ │ │ │ ├── FMDBEncrypt.xcscheme
│ │ │ │ └── xcschememanagement.plist
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── xcschemes
│ │ │ └── xcschememanagement.plist
│ │ └── MDatabase
│ │ ├── MDatabase
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj
│ │ │ │ └── Main.storyboard
│ │ │ ├── CodeGenerate.swift
│ │ │ ├── DAO.swift
│ │ │ ├── DatabaseDemo.sqlite
│ │ │ ├── DatabaseInfo.swift
│ │ │ ├── DMTemplateEngine
│ │ │ │ ├── DMTemplateEngine.h
│ │ │ │ └── DMTemplateEngine.m
│ │ │ ├── FieldInfo.swift
│ │ │ ├── fmdb
│ │ │ │ ├── FMDatabaseAdditions.h
│ │ │ │ ├── FMDatabaseAdditions.m
│ │ │ │ ├── FMDatabase.h
│ │ │ │ ├── FMDatabase.m
│ │ │ │ ├── FMDatabasePool.h
│ │ │ │ ├── FMDatabasePool.m
│ │ │ │ ├── FMDatabaseQueue.h
│ │ │ │ ├── FMDatabaseQueue.m
│ │ │ │ ├── FMDB.h
│ │ │ │ ├── FMResultSet.h
│ │ │ │ └── FMResultSet.m
│ │ │ ├── Info.plist
│ │ │ ├── MDAO.swift
│ │ │ ├── MDatabase-Bridging-Header.h
│ │ │ ├── MDatabase+Meta.swift
│ │ │ ├── MDatabase.swift
│ │ │ ├── MModel.swift
│ │ │ ├── Model.txt
│ │ │ ├── PersonDAO.swift
│ │ │ ├── Person.swift
│ │ │ ├── String+Regex.swift
│ │ │ ├── TableInfo.swift
│ │ │ ├── TypeKit.swift
│ │ │ └── ViewController.swift
│ │ └── MDatabase.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcuserdata
│ │ │ ├── idevfans.xcuserdatad
│ │ │ │ └── UserInterfaceState.xcuserstate
│ │ │ └── zhaojw.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata
│ │ ├── idevfans.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ │ └── Breakpoints_v2.xcbkptlist
│ │ │ └── xcschemes
│ │ │ ├── MDatabase.xcscheme
│ │ │ └── xcschememanagement.plist
│ │ └── zhaojw.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ └── Chapter 38 StartFirstApp
│ └── SwiftSQLiteApp
│ ├── Browse.png
│ ├── Query.png
│ ├── README.md
│ ├── Schema.png
│ ├── SQLiteApp
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets
│ │ │ ├── AppIcon.appiconset
│ │ │ │ ├── Contents.json
│ │ │ │ ├── icon_mac_128@2x.png
│ │ │ │ ├── icon_mac_128.png
│ │ │ │ ├── icon_mac_16@2x.png
│ │ │ │ ├── icon_mac_16.png
│ │ │ │ ├── icon_mac_256@2x.png
│ │ │ │ ├── icon_mac_256.png
│ │ │ │ ├── icon_mac_32@2x.png
│ │ │ │ ├── icon_mac_32.png
│ │ │ │ ├── icon_mac_512@2x.png
│ │ │ │ └── icon_mac_512.png
│ │ │ ├── arches.imageset
│ │ │ │ ├── arches@2x.png
│ │ │ │ ├── arches.png
│ │ │ │ └── Contents.json
│ │ │ ├── closeDB.imageset
│ │ │ │ ├── CloseDB@2x.png
│ │ │ │ └── Contents.json
│ │ │ ├── Contents.json
│ │ │ ├── database.imageset
│ │ │ │ ├── Contents.json
│ │ │ │ ├── DBDatabase-Sys@2x.png
│ │ │ │ └── DBDatabase-Sys.png
│ │ │ ├── first.imageset
│ │ │ │ ├── Contents.json
│ │ │ │ └── toolbar-first@2x.png
│ │ │ ├── home.imageset
│ │ │ │ ├── Contents.json
│ │ │ │ └── SQLite-Home@2x.png
│ │ │ ├── last.imageset
│ │ │ │ ├── Contents.json
│ │ │ │ └── toolbar-last@2x.png
│ │ │ ├── next.imageset
│ │ │ │ ├── Contents.json
│ │ │ │ └── toolbar-next@2x.png
│ │ │ ├── openDB.imageset
│ │ │ │ ├── Contents.json
│ │ │ │ └── openDB@2x.png
│ │ │ ├── pre.imageset
│ │ │ │ ├── Contents.json
│ │ │ │ └── toolbar-pre@2x.png
│ │ │ ├── table.imageset
│ │ │ │ ├── Contents.json
│ │ │ │ ├── DBTable-Sys@2x.png
│ │ │ │ └── DBTable-Sys.png
│ │ │ └── windowIcon.imageset
│ │ │ ├── Contents.json
│ │ │ └── icon_mac_32.png
│ │ ├── Base.lproj
│ │ │ └── Main.storyboard
│ │ ├── Common
│ │ │ ├── Config.swift
│ │ │ ├── DispatchQueue+Ext.swift
│ │ │ ├── JSONKit.swift
│ │ │ ├── NSColor+Ext.swift
│ │ │ └── NSPasteboard+Ext.swift
│ │ ├── Components
│ │ │ ├── AutoLayoutX
│ │ │ │ └── AutoLayoutX.swift
│ │ │ ├── DataNavigationView
│ │ │ │ ├── DataNavigationItem.swift
│ │ │ │ └── DataNavigationView.swift
│ │ │ ├── DataNavigationViewController
│ │ │ │ ├── Controller
│ │ │ │ │ ├── TableDataNavigationViewController.swift
│ │ │ │ │ ├── TableDataNavigationViewDelegate.swift
│ │ │ │ │ ├── XibViewController.swift
│ │ │ │ │ └── XibViewController.xib
│ │ │ │ ├── DataPageManager
│ │ │ │ │ └── DataPageManager.swift
│ │ │ │ ├── Extension
│ │ │ │ │ ├── NSButton+ColumnItem.swift
│ │ │ │ │ ├── NSComboBox+ColumnItem.swift
│ │ │ │ │ ├── NSImageView+ColumnItem.swift
│ │ │ │ │ ├── NSTableColumn+ColumnItem.swift
│ │ │ │ │ ├── NSTableView+ColumnItem.swift
│ │ │ │ │ └── NSTextField+ColumnItem.swift
│ │ │ │ ├── Model
│ │ │ │ │ └── TableColumnItem.swift
│ │ │ │ └── TableDataDelegate
│ │ │ │ └── TableDataDelegate.swift
│ │ │ ├── DataStoreBO
│ │ │ │ └── DataStoreBO.swift
│ │ │ ├── MDatabase
│ │ │ │ ├── DBObject
│ │ │ │ │ ├── DAO.swift
│ │ │ │ │ ├── MDAO.swift
│ │ │ │ │ ├── MDatabase.swift
│ │ │ │ │ └── MModel.swift
│ │ │ │ ├── Meta
│ │ │ │ │ ├── DatabaseInfo.swift
│ │ │ │ │ ├── FieldInfo.swift
│ │ │ │ │ ├── MDatabase+Meta.swift
│ │ │ │ │ ├── TableInfo.swift
│ │ │ │ │ └── TypeKit.swift
│ │ │ │ └── String+Regex.swift
│ │ │ ├── MulticastDelegate
│ │ │ │ └── TableListSelectionState.swift
│ │ │ └── TreeViewDataDelegate
│ │ │ ├── TreeNodeModel.swift
│ │ │ └── TreeViewDataDelegate.swift
│ │ ├── Controllers
│ │ │ ├── Browse
│ │ │ │ ├── TableBrowseViewController.swift
│ │ │ │ └── TableBrowseViewDelegate.swift
│ │ │ ├── Main
│ │ │ │ ├── AppMainSplitViewController.swift
│ │ │ │ ├── AppMainSplitViewController.xib
│ │ │ │ ├── AppMainTabViewController.swift
│ │ │ │ └── AppMainWindowController.swift
│ │ │ ├── Preferences
│ │ │ │ ├── PreferencesViewController.swift
│ │ │ │ └── PreferencesWindowController.swift
│ │ │ ├── Query
│ │ │ │ ├── TableQueryViewController1.xib
│ │ │ │ ├── TableQueryViewController.swift
│ │ │ │ └── TableQueryViewController.xib
│ │ │ ├── Schema
│ │ │ │ └── TableSchemaViewController.swift
│ │ │ └── TableList
│ │ │ ├── TableListViewController.swift
│ │ │ ├── TableListViewController.xib
│ │ │ ├── TableListViewDelegate.swift
│ │ │ └── TableListView.swift
│ │ ├── Info.plist
│ │ ├── MacDev.sqlite
│ │ ├── SQLiteApp-Bridging-Header.h
│ │ └── Vendor
│ │ ├── fmdb
│ │ │ ├── FMDatabaseAdditions.h
│ │ │ ├── FMDatabaseAdditions.m
│ │ │ ├── FMDatabase.h
│ │ │ ├── FMDatabase.m
│ │ │ ├── FMDatabasePool.h
│ │ │ ├── FMDatabasePool.m
│ │ │ ├── FMDatabaseQueue.h
│ │ │ ├── FMDatabaseQueue.m
│ │ │ ├── FMDB.h
│ │ │ ├── FMResultSet.h
│ │ │ ├── FMResultSet.m
│ │ │ └── MDatabase-Bridging-Header.h
│ │ └── GCDMulticastDelegate
│ │ ├── GCDMulticastDelegate.h
│ │ └── GCDMulticastDelegate.m
│ ├── SQLiteAppLogicArchitecture.png
│ └── SwiftSQLiteApp.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcuserdata
│ │ ├── idevfans.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── zhaojw.xcuserdatad
│ │ └── UserInterfaceState.xcuserstate
│ └── xcuserdata
│ ├── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ │ └── Breakpoints_v2.xcbkptlist
│ │ └── xcschemes
│ │ ├── SwiftSQLiteApp.xcscheme
│ │ └── xcschememanagement.plist
│ └── zhaojw.xcuserdatad
│ ├── xcdebugger
│ │ └── Breakpoints_v2.xcbkptlist
│ └── xcschemes
│ └── xcschememanagement.plist
└── __MACOSX
└── macOSwift4.0.3-Ebook-Demo
├── Chapter 01 Preparation
│ └── HelloWorld
│ └── HelloWorld
│ ├── Assets.xcassets
│ │ └── AppIcon.appiconset
│ └── Base.lproj
├── Chapter 02 Window
│ ├── Window
│ │ ├── Window
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── Window.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ └── WindowCenter
│ └── WindowCenter
│ └── Assets.xcassets
│ └── AppIcon.appiconset
├── Chapter 03 View&ScrollView
│ ├── NSEffectView
│ │ └── WindowLoginEffect
│ │ └── WindowLogin
│ │ ├── Assets.xcassets
│ │ │ └── AppIcon.appiconset
│ │ ├── Base.lproj
│ │ └── Controllers
│ ├── ResponderChain
│ │ ├── ResponderChain
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── ResponderChain.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ └── xcschemes
│ ├── ScrollView
│ │ ├── ScrollView
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── ScrollView.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ └── xcschemes
│ └── View
│ ├── View
│ │ ├── Assets.xcassets
│ │ │ └── AppIcon.appiconset
│ │ └── Base.lproj
│ └── View.xcodeproj
│ ├── project.xcworkspace
│ │ └── xcuserdata
│ └── xcuserdata
│ └── idevfans.xcuserdatad
│ ├── xcdebugger
│ └── xcschemes
├── Chapter 04 Controlls
│ ├── 4.10 NSSegmentedControl
│ │ ├── NSSegmentedControl
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ ├── NSSegmentedControlSize
│ │ │ └── NSSegmentedControlSize
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSSegmentedControl.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ └── xcschemes
│ ├── 4.11 NSComboBox
│ │ ├── NSComboBox
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSComboBox.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ ├── 4.12 NSPopUpButton
│ │ ├── NSPopUpButton
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSPopUpButton.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ └── xcschemes
│ ├── 4.13 NSSlider
│ │ ├── NSSlider
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSSlider.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ └── xcschemes
│ ├── 4.14 NSDatePicker
│ │ ├── NSDatePicker
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSDatePicker.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ ├── 4.15 NSStepper
│ │ ├── NSStepper
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSStepper.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ ├── 4.16 NSProgressIndicator
│ │ ├── NSProgressIndicator
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSProgressIndicator.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ └── xcschemes
│ ├── 4.17 NSImageView
│ │ ├── NSImageView
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSImageView.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ ├── 4.18 NSBox
│ │ ├── NSBox
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSBox.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ └── xcschemes
│ ├── 4.19 NSSplitView
│ │ ├── NSSplitView
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSSplitView.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ └── xcschemes
│ ├── 4.20 NSCollectionView
│ │ ├── NSCollectionView
│ │ │ ├── NSCollectionView
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Base.lproj
│ │ │ └── NSCollectionView.xcodeproj
│ │ │ ├── project.xcworkspace
│ │ │ │ └── xcuserdata
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ │ └── xcschemes
│ │ ├── NSCollectionViewCode
│ │ │ ├── NSCollectionViewCode
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Base.lproj
│ │ │ └── NSCollectionViewCode.xcodeproj
│ │ │ ├── project.xcworkspace
│ │ │ │ └── xcuserdata
│ │ │ │ └── idevfans.xcuserdatad
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ └── xcschemes
│ │ ├── NSCollectionViewDataSource
│ │ │ ├── NSCollectionViewDataSource
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Base.lproj
│ │ │ └── NSCollectionViewDataSource.xcodeproj
│ │ │ ├── project.xcworkspace
│ │ │ │ └── xcuserdata
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ │ └── xcschemes
│ │ └── NSCollectionViewHeadFoot
│ │ └── NSCollectionViewHeadFoot
│ │ ├── Assets.xcassets
│ │ │ └── AppIcon.appiconset
│ │ └── Base.lproj
│ ├── 4.21 NSTabView
│ │ ├── NSTabLessView
│ │ │ └── NSTabLessView
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSTabView
│ │ ├── NSTabView
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSTabView.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ ├── 4.22 NSPopover
│ │ ├── NSPopover
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSPopover.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ └── xcschemes
│ ├── 4.2 ResponderChain
│ │ ├── ResponderChain
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── ResponderChain.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ └── xcschemes
│ ├── 4.3 NSTextField
│ │ ├── NSTextField
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSTextField.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ ├── 4.4 NSTextView
│ │ ├── NSTextView
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSTextView.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ ├── 4.5 NSSearchField
│ │ ├── NSSearchField
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSSearchField.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ ├── 4.6 Label
│ │ ├── Label
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── Label.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ ├── 4.7 NSButton
│ │ ├── ImageButton
│ │ │ └── ImageButton
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ ├── NSButton
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSButton.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ └── xcschemes
│ ├── 4.8 CheckBox
│ │ ├── CheckBox
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── CheckBox.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ └── xcschemes
│ └── 4.9 Radio
│ ├── Radio
│ │ ├── Assets.xcassets
│ │ │ └── AppIcon.appiconset
│ │ └── Base.lproj
│ └── Radio.xcodeproj
│ ├── project.xcworkspace
│ │ └── xcuserdata
│ └── xcuserdata
│ └── idevfans.xcuserdatad
│ ├── xcdebugger
│ └── xcschemes
├── Chapter 05 Alert&Panel
│ ├── NSAlert
│ │ ├── NSAlert
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSAlert.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ └── xcschemes
│ ├── NSOpenPanel
│ │ ├── NSOpenPanel
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSOpenPanel.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ └── xcschemes
│ ├── NSPanel
│ │ ├── NSPanel
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSPanel.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ └── xcschemes
│ └── SingleXibPanel
│ └── SingleXibPanel
│ └── Assets.xcassets
│ └── AppIcon.appiconset
├── Chapter 06 ToolBar&Menu
│ ├── NSMenu
│ │ ├── NSMenu
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSMenu.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ ├── NSStatusBar
│ │ ├── NSStatusBar
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSStatusBar.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ └── NSToolbar
│ ├── NSToolbar
│ │ ├── Assets.xcassets
│ │ │ └── AppIcon.appiconset
│ │ └── Base.lproj
│ └── NSToolbar.xcodeproj
│ ├── project.xcworkspace
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ └── xcuserdata
│ └── idevfans.xcuserdatad
│ ├── xcdebugger
│ └── xcschemes
├── Chapter 07 TableView&TreeView
│ ├── NSOutlineView
│ │ ├── NSOutlineView
│ │ │ ├── Assets.xcassets
│ │ │ │ ├── AppIcon.appiconset
│ │ │ │ ├── Minus.imageset
│ │ │ │ └── Plus.imageset
│ │ │ └── Base.lproj
│ │ └── NSOutlineView.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ └── NSTableView
│ ├── CustomTableView
│ │ └── CustomTableView
│ │ ├── Assets.xcassets
│ │ │ └── AppIcon.appiconset
│ │ └── Base.lproj
│ ├── NSTableView
│ │ ├── NSTableView
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSTableViewCellBased.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ ├── NSTableViewBinding
│ │ ├── NSTableViewBinding
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSTableViewBinding.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ └── xcschemes
│ ├── NSTableViewCreatedByCode
│ │ ├── NSTableViewCreatedByCode
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSTableViewCreatedByCode.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ ├── NSTableViewCustomBackgroud
│ │ └── NSTableViewCustomBackgroud
│ │ └── Assets.xcassets
│ │ └── AppIcon.appiconset
│ ├── NSTableViewDragDrop
│ │ ├── NSTableViewDragDrop
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSTableViewDragDrop.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ └── NSTableViewViewBased
│ ├── NSTableViewViewBased
│ │ ├── Assets.xcassets
│ │ │ └── AppIcon.appiconset
│ │ └── Base.lproj
│ └── NSTableViewViewBased.xcodeproj
│ ├── project.xcworkspace
│ │ └── xcuserdata
│ └── xcuserdata
│ └── idevfans.xcuserdatad
│ └── xcschemes
├── Chapter 08 AutoLayout
│ ├── AutoLayout
│ │ └── AutoLayout
│ │ └── Assets.xcassets
│ │ └── AppIcon.appiconset
│ ├── AutoLayoutDemo
│ │ └── AutoLayoutDemo
│ │ └── Assets.xcassets
│ │ └── AppIcon.appiconset
│ ├── AutolayoutManySolution
│ │ └── AutolayoutManySolution
│ │ ├── Assets.xcassets
│ │ │ └── AppIcon.appiconset
│ │ └── Base.lproj
│ ├── NSScrollViewAutolayout
│ │ └── NSScrollViewAutolayout
│ │ └── Assets.xcassets
│ │ └── AppIcon.appiconset
│ └── UseAutolayoutByCode
│ └── UseAutolayoutByCode
│ ├── Assets.xcassets
│ │ └── AppIcon.appiconset
│ └── Base.lproj
├── Chapter 09 NSWindowController
│ ├── NSWindowArchitecture
│ │ ├── NSWindowArchitecture
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSWindowArchitecture.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ └── xcschemes
│ ├── NSWindowController
│ │ ├── NSWindowController
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSWindowController.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ └── xcschemes
│ ├── NSWindowControllerWithXib
│ │ ├── NSWindowControllerWithXib
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSWindowControllerWithXib.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ └── WindowSwitch
│ ├── WindowSwitch
│ │ ├── Assets.xcassets
│ │ │ └── AppIcon.appiconset
│ │ └── Base.lproj
│ └── WindowSwitch.xcodeproj
│ ├── project.xcworkspace
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ └── xcuserdata
│ └── idevfans.xcuserdatad
│ └── xcschemes
├── Chapter 10 NSViewController
│ ├── 10.1 NSViewController
│ │ ├── 10.1.5 ChangeView
│ │ │ ├── ChangeView
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Base.lproj
│ │ │ └── ChangeView.xcodeproj
│ │ │ ├── project.xcworkspace
│ │ │ │ └── xcuserdata
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ └── xcschemes
│ │ ├── 10.1.6 NSViewControllerTransition
│ │ │ ├── NSViewControllerTransition
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Base.lproj
│ │ │ └── NSViewControllerTransition.xcodeproj
│ │ │ ├── project.xcworkspace
│ │ │ │ └── xcuserdata
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ └── xcschemes
│ │ ├── CreateViewController
│ │ │ ├── CreateViewController
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Base.lproj
│ │ │ └── CreateViewController.xcodeproj
│ │ │ ├── project.xcworkspace
│ │ │ │ └── xcuserdata
│ │ │ │ └── idevfans.xcuserdatad
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ └── xcschemes
│ │ ├── NSViewController
│ │ │ ├── NSViewController
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Base.lproj
│ │ │ └── NSViewController.xcodeproj
│ │ │ ├── project.xcworkspace
│ │ │ │ └── xcuserdata
│ │ │ │ └── idevfans.xcuserdatad
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ └── xcschemes
│ │ └── ViewController
│ │ ├── ViewController
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── ViewController.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ ├── 10.2 NSTabViewController
│ │ ├── 10.2.1 NSTabViewController
│ │ │ ├── NSTabViewController
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Base.lproj
│ │ │ └── NSTabViewController.xcodeproj
│ │ │ ├── project.xcworkspace
│ │ │ │ └── xcuserdata
│ │ │ │ └── idevfans.xcuserdatad
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ └── xcschemes
│ │ ├── 10.2.2 NSTabViewControllerXib
│ │ │ ├── NSTabViewControllerXib
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Base.lproj
│ │ │ └── NSTabViewControllerXib.xcodeproj
│ │ │ ├── project.xcworkspace
│ │ │ │ └── xcuserdata
│ │ │ │ └── idevfans.xcuserdatad
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ │ └── xcschemes
│ │ └── 10.2.3 NSTabViewControllerStoryboard
│ │ ├── NSTabViewControllerStoryboard
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSTabViewControllerStoryboard.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ └── xcschemes
│ ├── 10.3 NSSplitViewController
│ │ ├── CollapseSplitView
│ │ │ └── CollapseSplitView
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ ├── NSSplitVCCodeCreateDemo
│ │ │ ├── NSSplitVCCodeCreateDemo
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Base.lproj
│ │ │ └── NSSplitVCCodeCreateDemo.xcodeproj
│ │ │ ├── project.xcworkspace
│ │ │ │ └── xcuserdata
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ │ ├── xcdebugger
│ │ │ └── xcschemes
│ │ ├── NSSplitViewCollapse
│ │ │ ├── NSSplitViewCollapse
│ │ │ │ ├── Assets.xcassets
│ │ │ │ │ └── AppIcon.appiconset
│ │ │ │ └── Base.lproj
│ │ │ └── NSSplitViewCollapse.xcodeproj
│ │ │ ├── project.xcworkspace
│ │ │ │ └── xcuserdata
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ │ └── xcschemes
│ │ └── NSSplitViewControllerDemo
│ │ ├── NSSplitViewControllerDemo
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSSplitViewControllerDemo.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ └── xcschemes
│ ├── 10.4
│ │ ├── PureCodeApp
│ │ │ └── PureCodeApp
│ │ │ └── Assets.xcassets
│ │ │ └── AppIcon.appiconset
│ │ ├── PureCodeFramework
│ │ │ └── PureCodeFramework
│ │ │ └── Assets.xcassets
│ │ │ └── AppIcon.appiconset
│ │ └── PureCodeStoryboard
│ │ └── PureCodeStoryboard
│ │ └── Assets.xcassets
│ │ └── AppIcon.appiconset
│ ├── 10.5
│ │ ├── 10.5.1 WindowLogin
│ │ │ └── WindowLogin
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ ├── Base.lproj
│ │ │ └── Controllers
│ │ ├── 10.5.2 WindowLogin
│ │ │ └── WindowLogin
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ ├── Base.lproj
│ │ │ └── Controllers
│ │ └── 10.5.3 WindowLogin
│ │ ├── WindowLoginEffect
│ │ │ └── WindowLogin
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ ├── Base.lproj
│ │ │ └── Controllers
│ │ ├── WindowLoginEffectByCode
│ │ │ └── WindowLogin
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ ├── Base.lproj
│ │ │ └── Controllers
│ │ ├── WindowLoginFilter
│ │ │ └── WindowLogin
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ ├── Base.lproj
│ │ │ └── Controllers
│ │ └── WindowLoginViewByCode
│ │ └── WindowLogin
│ │ ├── Assets.xcassets
│ │ │ └── AppIcon.appiconset
│ │ ├── AutoLayout
│ │ ├── Base.lproj
│ │ └── Controllers
│ └── 10.6
│ ├── PageScrollView
│ │ ├── AutoLayoutX
│ │ ├── Images
│ │ └── PageScrollView
│ │ ├── Assets.xcassets
│ │ │ └── AppIcon.appiconset
│ │ └── Base.lproj
│ ├── ScrollViewButtons
│ │ └── ScrollViewButtons
│ │ ├── Assets.xcassets
│ │ │ └── AppIcon.appiconset
│ │ ├── AutoLayout
│ │ └── Base.lproj
│ └── ScrollViewHorizontalButtons
│ └── ScrollViewButtons
│ ├── Assets.xcassets
│ │ └── AppIcon.appiconset
│ ├── AutoLayout
│ └── Base.lproj
├── Chapter 11 Mouse & Keyboard Event
│ └── NSEvent
│ └── NSEvent
│ ├── Assets.xcassets
│ │ └── AppIcon.appiconset
│ └── Base.lproj
├── Chapter 12 UndoRedo
│ ├── ComputeUndoRedo
│ │ ├── ComputeUndoRedo
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── ComputeUndoRedo.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ └── xcschemes
│ └── NSUndoManager
│ ├── NSUndoManager
│ │ ├── Assets.xcassets
│ │ │ └── AppIcon.appiconset
│ │ └── Base.lproj
│ └── NSUndoManager.xcodeproj
│ ├── project.xcworkspace
│ │ └── xcuserdata
│ └── xcuserdata
│ └── idevfans.xcuserdatad
│ └── xcschemes
├── Chapter 13 DragDrop
│ ├── DragDrop
│ │ ├── DragDrop
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── DragDrop.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ ├── FileDrag
│ │ ├── FileDrag
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── FileDrag.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ ├── NSOutlineViewDragDrop
│ │ ├── NSOutlineViewDragDrop
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSOutlineViewDragDrop.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ └── NSTableViewDragDrop
│ ├── NSTableViewDragDrop
│ │ ├── Assets.xcassets
│ │ │ └── AppIcon.appiconset
│ │ └── Base.lproj
│ └── NSTableViewDragDrop.xcodeproj
│ ├── project.xcworkspace
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ └── xcuserdata
│ └── idevfans.xcuserdatad
│ ├── xcdebugger
│ └── xcschemes
├── Chapter 14 CocoaBindings
│ ├── KVBEmploee
│ │ ├── KVBEmploee
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ ├── Base.lproj
│ │ │ └── Emploee.xcdatamodeld
│ │ │ └── Emploee.xcdatamodel
│ │ └── KVBEmployee.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ ├── KVC
│ │ ├── KVC
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── KVC.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ ├── KVO
│ │ ├── KVO
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── KVO.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ ├── NSArrayController
│ │ ├── NSArrayController
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── NSArrayController.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ └── xcschemes
│ └── NSTreeController
│ ├── NSTreeController
│ │ ├── Assets.xcassets
│ │ │ └── AppIcon.appiconset
│ │ └── Base.lproj
│ └── NSTreeController.xcodeproj
│ ├── project.xcworkspace
│ │ └── xcuserdata
│ └── xcuserdata
│ └── idevfans.xcuserdatad
│ └── xcschemes
├── Chapter 15 Bluetooth
│ ├── BluetoothCentral
│ │ ├── BluetoothCentral
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── BluetoothCentral.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ ├── BluetoothCentralIPhone
│ │ ├── BluetoothCentralIPhone
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── BluetoothCentralIPhone.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ └── BluetoothPeripheralOSX
│ ├── BluetoothPeripheralOSX
│ │ ├── Assets.xcassets
│ │ │ └── AppIcon.appiconset
│ │ └── Base.lproj
│ └── BluetoothPeripheralOSX.xcodeproj
│ ├── project.xcworkspace
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ └── xcuserdata
│ └── idevfans.xcuserdatad
│ ├── xcdebugger
│ └── xcschemes
├── Chapter 16 Bonjour
│ ├── BonjourClient
│ │ ├── BonjourClient
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── BonjourClient.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ └── xcschemes
│ └── BonjourServer
│ ├── BonjourServer
│ │ ├── Assets.xcassets
│ │ │ └── AppIcon.appiconset
│ │ └── Base.lproj
│ └── BonjourServer.xcodeproj
│ ├── project.xcworkspace
│ │ └── xcuserdata
│ └── xcuserdata
│ └── idevfans.xcuserdatad
│ └── xcschemes
├── Chapter 17 Services
│ └── SysServiceDemo
│ ├── SysServiceDemo
│ │ ├── Assets.xcassets
│ │ │ └── AppIcon.appiconset
│ │ └── Base.lproj
│ └── SysServiceDemo.xcodeproj
│ ├── project.xcworkspace
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ └── xcuserdata
│ └── idevfans.xcuserdatad
│ ├── xcdebugger
│ └── xcschemes
├── Chapter 18 XPC
│ ├── XPCBidirectionDemo
│ │ ├── DHelper
│ │ ├── XPCBidirectionDemo
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── XPCBidirectionDemo.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ └── XPCDemo
│ ├── Helper
│ ├── XPCDemo
│ │ ├── Assets.xcassets
│ │ │ └── AppIcon.appiconset
│ │ └── Base.lproj
│ └── XPCDemo.xcodeproj
│ ├── project.xcworkspace
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ └── xcuserdata
│ └── idevfans.xcuserdatad
│ ├── xcdebugger
│ └── xcschemes
├── Chapter 19 UserNotification
│ ├── LocalNotification
│ │ ├── LocalNotification
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── LocalNotification.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ └── xcschemes
│ └── PushNotification
│ ├── PushNotification
│ │ ├── Assets.xcassets
│ │ │ └── AppIcon.appiconset
│ │ └── Base.lproj
│ └── PushNotification.xcodeproj
│ ├── project.xcworkspace
│ │ └── xcuserdata
│ └── xcuserdata
│ └── idevfans.xcuserdatad
│ ├── xcdebugger
│ └── xcschemes
├── Chapter 20 Document
│ ├── Doc
│ │ ├── Doc
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── Doc.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ └── xcschemes
│ ├── DocumentDemo
│ │ ├── DocumentDemo
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── DocumentDemo.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ ├── FileWrapper
│ │ ├── FileWrapper
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ └── Base.lproj
│ │ └── FileWrapper.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ └── PersonProfileDoc
│ ├── PersonProfileDoc
│ │ ├── Assets.xcassets
│ │ │ └── AppIcon.appiconset
│ │ └── Base.lproj
│ └── PersonProfileDoc.xcodeproj
│ ├── project.xcworkspace
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ └── xcuserdata
│ └── idevfans.xcuserdatad
│ ├── xcdebugger
│ └── xcschemes
├── Chapter 21 iCloud
│ └── iCloud
│ └── iCloud
│ └── Assets.xcassets
│ └── AppIcon.appiconset
├── Chapter 22 CloudKit
│ └── CloudKitDemo
│ ├── CloudKitDemo
│ │ ├── Assets.xcassets
│ │ │ └── AppIcon.appiconset
│ │ └── Base.lproj
│ └── CloudKitDemo.xcodeproj
│ ├── project.xcworkspace
│ │ └── xcuserdata
│ └── xcuserdata
│ └── idevfans.xcuserdatad
│ └── xcschemes
├── Chapter 23 CoreData
│ ├── ClassesManager
│ │ ├── ClassesManager
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ ├── Base.lproj
│ │ │ └── ClassesManager.xcdatamodeld
│ │ │ └── ClassesManager.xcdatamodel
│ │ └── ClassesManager.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ ├── School
│ │ ├── School
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ ├── Base.lproj
│ │ │ ├── School2.xcdatamodeld
│ │ │ └── School.xcdatamodeld
│ │ └── School.xcdatamodeld
│ │ └── School.xcdatamodel
│ ├── SchoolV2
│ │ ├── SchoolV2
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ ├── Base.lproj
│ │ │ └── School.xcdatamodeld
│ │ │ ├── SchoolV2.xcdatamodel
│ │ │ └── School.xcdatamodel
│ │ ├── SchoolV2.xcodeproj
│ │ │ ├── project.xcworkspace
│ │ │ │ └── xcuserdata
│ │ │ │ └── idevfans.xcuserdatad
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ │ └── xcschemes
│ │ └── School.xcdatamodeld
│ │ └── School.xcdatamodel
│ └── SchoolV3
│ ├── SchoolV2
│ │ ├── Assets.xcassets
│ │ │ └── AppIcon.appiconset
│ │ ├── Base.lproj
│ │ └── School.xcdatamodeld
│ │ ├── SchoolV2.xcdatamodel
│ │ ├── SchoolV3.xcdatamodel
│ │ └── School.xcdatamodel
│ ├── SchoolV2_V3.xcmappingmodel
│ ├── SchoolV3.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ └── xcschemes
│ └── School.xcdatamodeld
│ └── School.xcdatamodel
├── Chapter 24 HTTP
│ ├── HTTP
│ │ └── HTTP
│ │ └── Assets.xcassets
│ │ └── AppIcon.appiconset
│ ├── HTTPClient
│ │ └── HTTPClient
│ │ └── Assets.xcassets
│ │ └── AppIcon.appiconset
│ ├── HTTPCookie
│ │ └── HTTPCookie
│ │ ├── Assets.xcassets
│ │ │ └── AppIcon.appiconset
│ │ └── Base.lproj
│ └── HTTPFileDownUpload
│ └── HTTPFileDownUpload
│ └── Assets.xcassets
│ └── AppIcon.appiconset
├── Chapter 25 Thread
│ ├── GCD
│ │ └── GCD
│ │ └── Assets.xcassets
│ │ └── AppIcon.appiconset
│ ├── OperationQueue
│ │ └── OperationQueue
│ │ └── Assets.xcassets
│ │ └── AppIcon.appiconset
│ └── Thread
│ └── Thread
│ ├── Assets.xcassets
│ │ └── AppIcon.appiconset
│ └── Base.lproj
├── Chapter 26 RunLoop
│ ├── RunLoop
│ │ └── RunLoop
│ │ └── Assets.xcassets
│ │ └── AppIcon.appiconset
│ └── RunLoopiOS
│ └── RunLoopiOS
│ ├── Assets.xcassets
│ │ └── AppIcon.appiconset
│ └── Base.lproj
├── Chapter 27 CocoaDraw
│ ├── Chapter 27 CocoaDraw
│ │ └── CocoaDraw
│ │ └── CocoaDraw
│ │ └── Assets.xcassets
│ │ └── AppIcon.appiconset
│ └── CocoaDraw
│ └── CocoaDraw
│ └── Assets.xcassets
│ └── AppIcon.appiconset
├── Chapter 28 CoreAnimation
│ ├── CALayerDemo
│ │ └── CALayerDemo
│ │ └── Assets.xcassets
│ │ └── AppIcon.appiconset
│ └── CoreAnimation
│ └── CoreAnimation
│ └── Assets.xcassets
│ └── AppIcon.appiconset
├── Chapter 29 MultiDelegate
│ ├── BuddyMultiDelegateDemo
│ │ └── BuddyMultiDelegateDemo
│ │ ├── Assets.xcassets
│ │ │ └── AppIcon.appiconset
│ │ ├── AutoLayoutX
│ │ ├── DAO
│ │ ├── DataStoreBO
│ │ ├── MDatabase
│ │ ├── Model
│ │ ├── Resources
│ │ │ ├── DB
│ │ │ └── images
│ │ └── Vendor
│ │ ├── fmdb
│ │ └── GCDMulticastDelegate
│ └── MultiDelegate
│ └── MultiDelegate
│ ├── Assets.xcassets
│ │ └── AppIcon.appiconset
│ └── Base.lproj
├── Chapter 30 Transformer
│ └── DataTransformer
│ ├── DataTransformer
│ │ ├── Assets.xcassets
│ │ │ └── AppIcon.appiconset
│ │ └── Base.lproj
│ └── DataTransformer.xcodeproj
│ ├── project.xcworkspace
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ └── xcuserdata
│ └── idevfans.xcuserdatad
│ ├── xcdebugger
│ └── xcschemes
├── Chapter 31 Framework
│ ├── XXXBonjourNetWork
│ │ └── XXXBonjourNetWork
│ └── XXXBonjourNetWorkManagerTest
│ └── XXXBonjourNetWorkManagerTest
│ ├── Assets.xcassets
│ │ └── AppIcon.appiconset
│ └── Base.lproj
├── Chapter 32 Sandbox
│ └── SandboxFile
│ ├── SandboxFile
│ │ ├── Assets.xcassets
│ │ │ └── AppIcon.appiconset
│ │ └── Base.lproj
│ └── SandboxFile.xcodeproj
│ ├── project.xcworkspace
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ └── xcuserdata
│ └── idevfans.xcuserdatad
│ ├── xcdebugger
│ └── xcschemes
├── Chapter 33 DataNavigation
│ └── DataNavigationView
│ ├── DataNavigationView
│ │ ├── Assets.xcassets
│ │ │ └── AppIcon.appiconset
│ │ └── SnapKit
│ └── Masonry
├── Chapter 34 TableDataNavigationViewController
│ └── TableViewControllerDemo
│ ├── TableViewControllerDemo
│ │ ├── Assets.xcassets
│ │ │ ├── AppIcon.appiconset
│ │ │ ├── closeDB.imageset
│ │ │ ├── database.imageset
│ │ │ ├── first.imageset
│ │ │ ├── home.imageset
│ │ │ ├── last.imageset
│ │ │ ├── next.imageset
│ │ │ ├── openDB.imageset
│ │ │ ├── pre.imageset
│ │ │ ├── table.imageset
│ │ │ └── windowIcon.imageset
│ │ └── Base.lproj
│ └── TableViewControllerDemo.xcodeproj
│ ├── project.xcworkspace
│ │ └── xcuserdata
│ └── xcuserdata
│ └── idevfans.xcuserdatad
│ ├── xcdebugger
│ └── xcschemes
├── Chapter 35 AutoTools
│ ├── ImageAassetAutomator
│ │ ├── ImageAassetAutomator
│ │ │ ├── Assets.xcassets
│ │ │ │ ├── AppIcon.appiconset
│ │ │ │ └── DragImage.imageset
│ │ │ └── Base.lproj
│ │ └── ImageAassetAutomator.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ └── LocalizationTools
│ ├── Base.lproj
│ ├── en.lproj
│ ├── Flags
│ ├── fr.lproj
│ ├── ja.lproj
│ ├── LocalizationTools
│ │ ├── Assets.xcassets
│ │ │ ├── AppIcon.appiconset
│ │ │ ├── arches.imageset
│ │ │ ├── toolbar-add.imageset
│ │ │ ├── toolbar-refresh.imageset
│ │ │ ├── toolbar-remove.imageset
│ │ │ ├── Trans-ToolBar-Export.imageset
│ │ │ ├── Trans-ToolBar-Help.imageset
│ │ │ ├── Trans-ToolBar-Open.imageset
│ │ │ └── Trans-ToolBar-Trans.imageset
│ │ ├── Base.lproj
│ │ ├── fmdb
│ │ ├── NoodleLineNumberView
│ │ └── XcodeEditor
│ │ └── Utils
│ ├── LocalizationTools.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ └── nl.lproj
├── Chapter 36 BluetoothTools
│ ├── OpenMacI
│ │ ├── OpenMacI
│ │ │ ├── Assets.xcassets
│ │ │ │ ├── AppIcon.appiconset
│ │ │ │ └── MacColor.imageset
│ │ │ └── Base.lproj
│ │ └── OpenMacI.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ └── OpenMacX
│ ├── OpenMacX
│ │ ├── Assets.xcassets
│ │ │ ├── AppIcon.appiconset
│ │ │ ├── blue.imageset
│ │ │ └── openMacIcon.imageset
│ │ └── Base.lproj
│ └── OpenMacX.xcodeproj
│ ├── project.xcworkspace
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ └── xcuserdata
│ └── idevfans.xcuserdatad
│ ├── xcdebugger
│ └── xcschemes
├── Chapter 37 SQLiteDatabase
│ ├── FMDBEncrypt
│ │ ├── FMDBEncrypt
│ │ │ ├── Assets.xcassets
│ │ │ │ └── AppIcon.appiconset
│ │ │ ├── Base.lproj
│ │ │ └── fmdb
│ │ └── FMDBEncrypt.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── xcuserdata
│ │ │ └── idevfans.xcuserdatad
│ │ └── xcuserdata
│ │ └── idevfans.xcuserdatad
│ │ ├── xcdebugger
│ │ └── xcschemes
│ └── MDatabase
│ ├── MDatabase
│ │ ├── Assets.xcassets
│ │ │ └── AppIcon.appiconset
│ │ ├── Base.lproj
│ │ ├── DMTemplateEngine
│ │ └── fmdb
│ └── MDatabase.xcodeproj
│ ├── project.xcworkspace
│ │ └── xcuserdata
│ └── xcuserdata
│ └── idevfans.xcuserdatad
│ ├── xcdebugger
│ └── xcschemes
└── Chapter 38 StartFirstApp
└── SwiftSQLiteApp
└── SQLiteApp
├── Assets.xcassets
├── Common
├── Components
│ ├── AutoLayoutX
│ ├── DataNavigationView
│ ├── DataNavigationViewController
│ │ ├── Controller
│ │ ├── Extension
│ │ └── TableDataDelegate
│ ├── DataStoreBO
│ ├── MDatabase
│ ├── MulticastDelegate
│ └── TreeViewDataDelegate
├── Controllers
│ ├── Browse
│ ├── Main
│ ├── Query
│ ├── Schema
│ └── TableList
└── Vendor
├── fmdb
└── GCDMulticastDelegate
3873 directories, 2805 files
标签:
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论