Update ListerAProductivityAppBuiltinSwift
This commit is contained in:
parent
4610aafc26
commit
c37971efdb
|
@ -1,208 +0,0 @@
|
|||
/*
|
||||
<codex />
|
||||
*/
|
||||
|
||||
import UIKit
|
||||
|
||||
var _sharedListCoordinator: ListCoordinator?
|
||||
|
||||
class ListCoordinator: NSObject {
|
||||
struct Notifications {
|
||||
static let storageChoiceDidChangeNotification = "storageChoiceDidChangeNotification"
|
||||
}
|
||||
|
||||
struct Defaults {
|
||||
static let storedUbiquityIdentityToken = "storedUbiquityIdentityToken"
|
||||
}
|
||||
|
||||
struct Identifiers {
|
||||
static let applicationGropuIdentifier = "A93A5CM278.com.example.apple-samplecode.ListerGroup"
|
||||
static let ubiquityContainerIdentifier = "A93A5CM278.com.example.apple-samplecode.Lister"
|
||||
}
|
||||
|
||||
class func sharedListCoordinator() -> ListCoordinator {
|
||||
if _sharedListCoordinator {
|
||||
return _sharedListCoordinator!
|
||||
}
|
||||
|
||||
_sharedListCoordinator = ListCoordinator()
|
||||
|
||||
return _sharedListCoordinator!
|
||||
}
|
||||
|
||||
var storedUbiquityIdentityToken: protocol<NSCoding, NSCopying, NSObjectProtocol>? {
|
||||
var storedToken: protocol<NSCoding, NSCopying, NSObjectProtocol>?
|
||||
|
||||
// determine if the logged in iCloud account has changed since the user last launched the app
|
||||
let archivedObject: AnyObject? = NSUserDefaults.standardUserDefaults().objectForKey(ListCoordinator.Defaults.storedUbiquityIdentityToken)
|
||||
if let ubiquityIdentityTokenArchive = archivedObject as? NSData {
|
||||
if let archivedObject = NSKeyedUnarchiver.unarchiveObjectWithData(ubiquityIdentityTokenArchive) as? protocol<NSCoding, NSCopying, NSObjectProtocol> {
|
||||
storedToken = archivedObject
|
||||
}
|
||||
}
|
||||
|
||||
return storedToken
|
||||
}
|
||||
|
||||
var documentsDirectory = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] as NSURL
|
||||
var groupDocumentsDirectory: NSURL {
|
||||
if cloudEnabled {
|
||||
return documentsDirectory
|
||||
}
|
||||
else {
|
||||
return NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier(ListCoordinator.Identifiers.applicationGropuIdentifier)
|
||||
}
|
||||
}
|
||||
|
||||
var todayDocumentURL: NSURL {
|
||||
return groupDocumentsDirectory.URLByAppendingPathComponent("Today.list")
|
||||
}
|
||||
var cloudEnabled: Bool = false {
|
||||
didSet {
|
||||
if cloudEnabled != oldValue {
|
||||
updateFileStorageContainerURL()
|
||||
NSNotificationCenter.defaultCenter().postNotificationName(ListCoordinator.Notifications.storageChoiceDidChangeNotification, object: self)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: Identity
|
||||
|
||||
func checkUbiquityIdentityDidChange() -> Bool {
|
||||
var result = false
|
||||
|
||||
let currentToken = NSFileManager.defaultManager().ubiquityIdentityToken
|
||||
let storedToken = storedUbiquityIdentityToken
|
||||
|
||||
if !currentToken || !storedToken || !currentToken.isEqual(storedToken) {
|
||||
println("ubiquity identity has changed")
|
||||
handleUbiquityIdentityChange()
|
||||
result = true
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
func handleUbiquityIdentityChange() {
|
||||
var defaults = NSUserDefaults.standardUserDefaults()
|
||||
if let token = NSFileManager.defaultManager().ubiquityIdentityToken {
|
||||
// the account has changed
|
||||
println("user changed iCloud accounts")
|
||||
let ubiquityIdentityTokenArchive = NSKeyedArchiver.archivedDataWithRootObject(token)
|
||||
defaults.setObject(ubiquityIdentityTokenArchive, forKey: ListCoordinator.Defaults.storedUbiquityIdentityToken)
|
||||
}
|
||||
else {
|
||||
// there is no signed-in account
|
||||
println("user signed out of iCloud")
|
||||
defaults.removeObjectForKey(ListCoordinator.Defaults.storedUbiquityIdentityToken)
|
||||
}
|
||||
|
||||
defaults.synchronize()
|
||||
}
|
||||
|
||||
func ubiquityIdentityDidChangeNotification(notification: NSNotification) {
|
||||
println("ubiquity identity did change")
|
||||
handleUbiquityIdentityChange()
|
||||
|
||||
println("should post a notification to alert the app that the identity has changed")
|
||||
}
|
||||
|
||||
// MARK: Today
|
||||
|
||||
func ensureTodayDocumentExistsWithError(outError: NSErrorPointer) -> Bool {
|
||||
let fileManager = NSFileManager.defaultManager()
|
||||
|
||||
if fileManager.fileExistsAtPath(todayDocumentURL.path) {
|
||||
return true
|
||||
}
|
||||
|
||||
// <rdar://problem/16908721> NSBundle(forClass:) should remain as NSBundle.bundleForClass()
|
||||
// <rdar://problem/16880689> "dynamicType" requires "self" in class scope
|
||||
let defaultTodayDocumentURL = NSBundle.mainBundle().URLForResource("Today", withExtension: "list")
|
||||
|
||||
return fileManager.copyItemAtURL(defaultTodayDocumentURL, toURL: todayDocumentURL, error: error)
|
||||
}
|
||||
|
||||
// MARK: Document Handling
|
||||
|
||||
func updateFileStorageContainerURL() {
|
||||
let oldDocumentsDirectory = documentsDirectory
|
||||
|
||||
if !cloudEnabled {
|
||||
// <rdar://problem/16953693> Array.firstElement
|
||||
documentsDirectory = (NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] as NSURL)
|
||||
}
|
||||
else {
|
||||
let cloudDirectory = NSFileManager.defaultManager().URLForUbiquityContainerIdentifier(ListCoordinator.Identifiers.ubiquityContainerIdentifier)!
|
||||
documentsDirectory = cloudDirectory.URLByAppendingPathComponent("Documents")
|
||||
|
||||
var error: NSError?
|
||||
let localDocuments = NSFileManager.defaultManager().contentsOfDirectoryAtURL(oldDocumentsDirectory, includingPropertiesForKeys: nil, options: .SkipsPackageDescendants, error: &error)
|
||||
|
||||
for object: AnyObject in localDocuments! {
|
||||
if let url = object as? NSURL {
|
||||
if url.pathExtension == "list" {
|
||||
moveFileToUbiquity(url)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func moveFileToUbiquity(sourceURL: NSURL) {
|
||||
let destinationFileName = sourceURL.lastPathComponent
|
||||
let destinationURL = documentsDirectory.URLByAppendingPathComponent(destinationFileName)
|
||||
|
||||
// dispatch ubiquity upload to background queue
|
||||
var defaultQueue = dispatch_get_global_queue(CLong(DISPATCH_QUEUE_PRIORITY_DEFAULT), 0)
|
||||
dispatch_async(defaultQueue) {
|
||||
let fileManager = NSFileManager()
|
||||
|
||||
var error: NSError?
|
||||
let success: Bool = fileManager.setUbiquitous(true, itemAtURL: sourceURL, destinationURL: destinationURL, error: &error)
|
||||
|
||||
if !success {
|
||||
println("couldn't move file \(sourceURL.absoluteString) to cloud at: \(destinationURL.absoluteString). Error: \(error.description)")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func copyFileToDocuments(sourceURL: NSURL) {
|
||||
copyFileFrom(sourceURL, to: documentsDirectory.URLByAppendingPathComponent(sourceURL.lastPathComponent))
|
||||
}
|
||||
|
||||
func copyFileToGroupDocuments(sourceURL: NSURL) {
|
||||
copyFileFrom(sourceURL, to: groupDocumentsDirectory.URLByAppendingPathComponent(sourceURL.lastPathComponent))
|
||||
}
|
||||
|
||||
func copyFileFrom(from: NSURL, to: NSURL) {
|
||||
let coordinator = NSFileCoordinator(filePresenter: nil)
|
||||
|
||||
coordinator.coordinateWritingItemAtURL(from, options: .ForMoving, writingItemAtURL: to, options: .ForReplacing, error: nil) { (source, destination) in
|
||||
var moveError: NSError?
|
||||
let success = NSFileManager().copyItemAtURL(source, toURL: destination, error: &moveError)
|
||||
if success {
|
||||
println("moved file: \(source.absoluteString) to: \(destination.absoluteString).")
|
||||
}
|
||||
else {
|
||||
println("couldn't move file: \(source.absoluteString) to: \(destination.absoluteString). Error: \(moveError.description)")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func deleteFileAtURL(fileURL: NSURL) {
|
||||
let fileCoordinator = NSFileCoordinator()
|
||||
var error: NSError?
|
||||
fileCoordinator.coordinateWritingItemAtURL(fileURL, options: .ForDeleting, error: &error) { writingURL in
|
||||
NSFileManager().removeItemAtURL(writingURL, error: &error)
|
||||
|
||||
// Need the return statement here because single line closures are assumed to return values.
|
||||
// Tracking radar for fix: <rdar://problem/13175298> Allow function conversion from (A) -> B to (A) -> ()
|
||||
return
|
||||
}
|
||||
|
||||
if error {
|
||||
println("couldn't delete file at URL \(fileURL.absoluteString). Error: \(error.description)")
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,420 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="6154.5" systemVersion="14A238h" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="6154.5"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
|
||||
<connections>
|
||||
<outlet property="delegate" destination="jdX-3Y-psN" id="MQd-Rk-Oib"/>
|
||||
</connections>
|
||||
</customObject>
|
||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||
<customObject id="-3" userLabel="Application"/>
|
||||
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
|
||||
<customObject id="jdX-3Y-psN" customClass="ApplicationDelegate" customModule="ListerOSX"/>
|
||||
<menu title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
|
||||
<items>
|
||||
<menuItem title="Lister" id="1Xt-HY-uBw">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="Lister" systemMenu="apple" id="uQy-DD-JDr">
|
||||
<items>
|
||||
<menuItem title="About Lister" id="5kV-Vb-QxS">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="orderFrontStandardAboutPanel:" target="-1" id="Exp-CZ-Vem"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
|
||||
<menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW"/>
|
||||
<menuItem isSeparatorItem="YES" id="wFC-TO-SCJ"/>
|
||||
<menuItem title="Services" id="NMo-om-nkz">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="4je-JR-u6R"/>
|
||||
<menuItem title="Hide Lister" keyEquivalent="h" id="Olw-nP-bQN">
|
||||
<connections>
|
||||
<action selector="hide:" target="-1" id="PnN-Uc-m68"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO">
|
||||
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
||||
<connections>
|
||||
<action selector="hideOtherApplications:" target="-1" id="VT4-aY-XCT"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Show All" id="Kd2-mp-pUS">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="unhideAllApplications:" target="-1" id="Dhg-Le-xox"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
|
||||
<menuItem title="Quit Lister" keyEquivalent="q" id="4sb-4s-VLi">
|
||||
<connections>
|
||||
<action selector="terminate:" target="-1" id="Te7-pn-YzF"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
<menuItem title="File" id="dMs-cI-mzQ">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="File" id="bib-Uj-vzu">
|
||||
<items>
|
||||
<menuItem title="New" keyEquivalent="n" id="Was-JA-tGl">
|
||||
<connections>
|
||||
<action selector="newDocument:" target="-1" id="4Si-XN-c54"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Open…" keyEquivalent="o" id="IAo-SY-fd9">
|
||||
<connections>
|
||||
<action selector="openDocument:" target="-1" id="bVn-NM-KNZ"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Open Today List" keyEquivalent="t" id="D3I-mn-BfF">
|
||||
<connections>
|
||||
<action selector="openTodayDocument:" target="-1" id="HFr-Da-z7e"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Open Recent" id="tXI-mr-wws">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="oas-Oc-fiZ">
|
||||
<items>
|
||||
<menuItem title="Clear Menu" id="vNY-rz-j42">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="clearRecentDocuments:" target="-1" id="Daa-9d-B3U"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="m54-Is-iLE"/>
|
||||
<menuItem title="Close" keyEquivalent="w" id="DVo-aG-piG">
|
||||
<connections>
|
||||
<action selector="performClose:" target="-1" id="HmO-Ls-i7Q"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Save…" keyEquivalent="s" id="pxx-59-PXV">
|
||||
<connections>
|
||||
<action selector="saveDocument:" target="-1" id="teZ-XB-qJY"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Save As…" keyEquivalent="S" id="Bw7-FT-i3A">
|
||||
<connections>
|
||||
<action selector="saveDocumentAs:" target="-1" id="mDf-zr-I0C"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Revert to Saved" id="KaW-ft-85H">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="revertDocumentToSaved:" target="-1" id="iJ3-Pv-kwq"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="aJh-i4-bef"/>
|
||||
<menuItem title="Page Setup…" keyEquivalent="P" id="qIS-W8-SiK">
|
||||
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
|
||||
<connections>
|
||||
<action selector="runPageLayout:" target="-1" id="Din-rz-gC5"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Print…" keyEquivalent="p" id="aTl-1u-JFS">
|
||||
<connections>
|
||||
<action selector="printDocument:" target="-1" id="qaZ-4w-aoO"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
<menuItem title="Edit" id="5QF-Oa-p0T">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="Edit" id="W48-6f-4Dl">
|
||||
<items>
|
||||
<menuItem title="Undo" keyEquivalent="z" id="dRJ-4n-Yzg">
|
||||
<connections>
|
||||
<action selector="undo:" target="-1" id="M6e-cu-g7V"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Redo" keyEquivalent="Z" id="6dh-zS-Vam">
|
||||
<connections>
|
||||
<action selector="redo:" target="-1" id="oIA-Rs-6OD"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="WRV-NI-Exz"/>
|
||||
<menuItem title="Complete All" keyEquivalent="C" id="iik-Dk-SwK">
|
||||
<connections>
|
||||
<action selector="completeAllItems:" target="-1" id="Gvu-Ar-fJb"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Incomplete All" keyEquivalent="I" id="Izf-2i-uxX">
|
||||
<connections>
|
||||
<action selector="incompleteAllItems:" target="-1" id="G6k-69-DEf"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="DWF-LI-aeM"/>
|
||||
<menuItem title="Cut" keyEquivalent="x" id="uRl-iY-unG">
|
||||
<connections>
|
||||
<action selector="cut:" target="-1" id="YJe-68-I9s"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Copy" keyEquivalent="c" id="x3v-GG-iWU">
|
||||
<connections>
|
||||
<action selector="copy:" target="-1" id="G1f-GL-Joy"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Paste" keyEquivalent="v" id="gVA-U4-sdL">
|
||||
<connections>
|
||||
<action selector="paste:" target="-1" id="UvS-8e-Qdg"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Paste and Match Style" keyEquivalent="V" id="WeT-3V-zwk">
|
||||
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
||||
<connections>
|
||||
<action selector="pasteAsPlainText:" target="-1" id="cEh-KX-wJQ"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Delete" id="pa3-QI-u2k">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="delete:" target="-1" id="0Mk-Ml-PaM"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Select All" keyEquivalent="a" id="Ruw-6m-B2m">
|
||||
<connections>
|
||||
<action selector="selectAll:" target="-1" id="VNm-Mi-diN"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="uyl-h8-XO2"/>
|
||||
<menuItem title="Find" id="4EN-yA-p0u">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="Find" id="1b7-l0-nxx">
|
||||
<items>
|
||||
<menuItem title="Find…" tag="1" keyEquivalent="f" id="Xz5-n4-O0W">
|
||||
<connections>
|
||||
<action selector="performFindPanelAction:" target="-1" id="cD7-Qs-BN4"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="YEy-JH-Tfz">
|
||||
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
||||
<connections>
|
||||
<action selector="performFindPanelAction:" target="-1" id="WD3-Gg-5AJ"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Find Next" tag="2" keyEquivalent="g" id="q09-fT-Sye">
|
||||
<connections>
|
||||
<action selector="performFindPanelAction:" target="-1" id="NDo-RZ-v9R"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Find Previous" tag="3" keyEquivalent="G" id="OwM-mh-QMV">
|
||||
<connections>
|
||||
<action selector="performFindPanelAction:" target="-1" id="HOh-sY-3ay"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="buJ-ug-pKt">
|
||||
<connections>
|
||||
<action selector="performFindPanelAction:" target="-1" id="U76-nv-p5D"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Jump to Selection" keyEquivalent="j" id="S0p-oC-mLd">
|
||||
<connections>
|
||||
<action selector="centerSelectionInVisibleArea:" target="-1" id="IOG-6D-g5B"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
<menuItem title="Spelling and Grammar" id="Dv1-io-Yv7">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="Spelling" id="3IN-sU-3Bg">
|
||||
<items>
|
||||
<menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="HFo-cy-zxI">
|
||||
<connections>
|
||||
<action selector="showGuessPanel:" target="-1" id="vFj-Ks-hy3"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Check Document Now" keyEquivalent=";" id="hz2-CU-CR7">
|
||||
<connections>
|
||||
<action selector="checkSpelling:" target="-1" id="fz7-VC-reM"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="bNw-od-mp5"/>
|
||||
<menuItem title="Check Spelling While Typing" id="rbD-Rh-wIN">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="toggleContinuousSpellChecking:" target="-1" id="7w6-Qz-0kB"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Check Grammar With Spelling" id="mK6-2p-4JG">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="toggleGrammarChecking:" target="-1" id="muD-Qn-j4w"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Correct Spelling Automatically" id="78Y-hA-62v">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="toggleAutomaticSpellingCorrection:" target="-1" id="2lM-Qi-WAP"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
<menuItem title="Substitutions" id="9ic-FL-obx">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="Substitutions" id="FeM-D8-WVr">
|
||||
<items>
|
||||
<menuItem title="Show Substitutions" id="z6F-FW-3nz">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="orderFrontSubstitutionsPanel:" target="-1" id="oku-mr-iSq"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="gPx-C9-uUO"/>
|
||||
<menuItem title="Smart Copy/Paste" id="9yt-4B-nSM">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="toggleSmartInsertDelete:" target="-1" id="3IJ-Se-DZD"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Smart Quotes" id="hQb-2v-fYv">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="toggleAutomaticQuoteSubstitution:" target="-1" id="ptq-xd-QOA"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Smart Dashes" id="rgM-f4-ycn">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="toggleAutomaticDashSubstitution:" target="-1" id="oCt-pO-9gS"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Smart Links" id="cwL-P1-jid">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="toggleAutomaticLinkDetection:" target="-1" id="Gip-E3-Fov"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Data Detectors" id="tRr-pd-1PS">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="toggleAutomaticDataDetection:" target="-1" id="R1I-Nq-Kbl"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Text Replacement" id="HFQ-gK-NFA">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="toggleAutomaticTextReplacement:" target="-1" id="DvP-Fe-Py6"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
<menuItem title="Transformations" id="2oI-Rn-ZJC">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="Transformations" id="c8a-y6-VQd">
|
||||
<items>
|
||||
<menuItem title="Make Upper Case" id="vmV-6d-7jI">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="uppercaseWord:" target="-1" id="sPh-Tk-edu"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Make Lower Case" id="d9M-CD-aMd">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="lowercaseWord:" target="-1" id="iUZ-b5-hil"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Capitalize" id="UEZ-Bs-lqG">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="capitalizeWord:" target="-1" id="26H-TL-nsh"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
<menuItem title="Speech" id="xrE-MZ-jX0">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="Speech" id="3rS-ZA-NoH">
|
||||
<items>
|
||||
<menuItem title="Start Speaking" id="Ynk-f8-cLZ">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="startSpeaking:" target="-1" id="654-Ng-kyl"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Stop Speaking" id="Oyz-dy-DGm">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="stopSpeaking:" target="-1" id="dX8-6p-jy9"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
<menuItem title="View" id="H8h-7b-M4v">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="View" id="HyV-fh-RgO">
|
||||
<items>
|
||||
<menuItem title="Show Toolbar" keyEquivalent="t" id="snW-S8-Cw5">
|
||||
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
||||
<connections>
|
||||
<action selector="toggleToolbarShown:" target="-1" id="BXY-wc-z0C"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Customize Toolbar…" id="1UK-8n-QPP">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="runToolbarCustomizationPalette:" target="-1" id="pQI-g3-MTW"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
<menuItem title="Window" id="aUF-d1-5bR">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="Window" systemMenu="window" id="Td7-aD-5lo">
|
||||
<items>
|
||||
<menuItem title="Minimize" keyEquivalent="m" id="OY7-WF-poV">
|
||||
<connections>
|
||||
<action selector="performMiniaturize:" target="-1" id="VwT-WD-YPe"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Zoom" id="R4o-n2-Eq4">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="performZoom:" target="-1" id="DIl-cC-cCs"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="eu3-7i-yIM"/>
|
||||
<menuItem title="Bring All to Front" id="LE2-aR-0XJ">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="arrangeInFront:" target="-1" id="DRN-fu-gQh"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
<menuItem title="Help" id="wpr-3q-Mcd">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="Help" systemMenu="help" id="F2S-fz-NVQ">
|
||||
<items>
|
||||
<menuItem title="Lister Help" keyEquivalent="?" id="FKE-Sm-Kum">
|
||||
<connections>
|
||||
<action selector="showHelp:" target="-1" id="y7X-2Q-9no"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</objects>
|
||||
</document>
|
|
@ -1,58 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="6106" systemVersion="14A194e" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="6106"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<customObject id="-2" userLabel="File's Owner"/>
|
||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||
<customObject id="-3" userLabel="Application"/>
|
||||
<customView id="yj6-w8-hv4" customClass="ListItemView">
|
||||
<rect key="frame" x="0.0" y="0.0" width="482" height="35"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<subviews>
|
||||
<button hidden="YES" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="fDL-6G-73e">
|
||||
<rect key="frame" x="392" y="10" width="86" height="16"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="86" id="B3s-Am-sZM"/>
|
||||
<constraint firstAttribute="height" constant="16" id="khU-ir-lyE"/>
|
||||
</constraints>
|
||||
<buttonCell key="cell" type="inline" title="Complete" bezelStyle="inline" alignment="center" state="on" inset="2" id="Sua-Zv-iGg">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="smallSystemBold"/>
|
||||
</buttonCell>
|
||||
<connections>
|
||||
<action selector="buttonClicked:" target="yj6-w8-hv4" id="yO1-N4-Ywx"/>
|
||||
</connections>
|
||||
</button>
|
||||
<textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="rDZ-jx-lhS" customClass="ResizingTextField">
|
||||
<rect key="frame" x="13" y="6" width="254" height="22"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="254" id="1ss-rr-flr"/>
|
||||
<constraint firstAttribute="height" constant="22" id="HnH-01-Iae"/>
|
||||
</constraints>
|
||||
<textFieldCell key="cell" lineBreakMode="truncatingHead" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" focusRingType="none" drawsBackground="YES" usesSingleLineMode="YES" id="H5V-3p-rmK">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" white="1" alpha="0.0" colorSpace="deviceWhite"/>
|
||||
</textFieldCell>
|
||||
<connections>
|
||||
<outlet property="widthConstraint" destination="1ss-rr-flr" id="ghC-pN-vhK"/>
|
||||
</connections>
|
||||
</textField>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="rDZ-jx-lhS" firstAttribute="centerY" secondItem="yj6-w8-hv4" secondAttribute="centerY" id="CLk-RP-Pdz"/>
|
||||
<constraint firstAttribute="trailing" secondItem="fDL-6G-73e" secondAttribute="trailing" constant="4" id="CiF-Ja-OKL"/>
|
||||
<constraint firstItem="fDL-6G-73e" firstAttribute="centerY" secondItem="yj6-w8-hv4" secondAttribute="centerY" priority="999" id="HyD-bU-qQH"/>
|
||||
<constraint firstItem="rDZ-jx-lhS" firstAttribute="leading" secondItem="yj6-w8-hv4" secondAttribute="leading" constant="13" id="t9r-X1-dpq"/>
|
||||
</constraints>
|
||||
<connections>
|
||||
<outlet property="statusButton" destination="fDL-6G-73e" id="ozB-d1-a6g"/>
|
||||
<outlet property="textField" destination="rDZ-jx-lhS" id="Rqy-6a-zGS"/>
|
||||
</connections>
|
||||
</customView>
|
||||
</objects>
|
||||
</document>
|
|
@ -127,6 +127,7 @@ class ListCoordinator: NSObject {
|
|||
else {
|
||||
// In your app, handle this gracefully.
|
||||
NSLog("Couldn't move file: \(sourceURL.absoluteString) to: \(destinationURL.absoluteString). Error: \(moveError.description).")
|
||||
abort()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,45 +0,0 @@
|
|||
/*
|
||||
<codex />
|
||||
*/
|
||||
|
||||
import UIKit
|
||||
|
||||
class ListFileRepresentation: Equatable {
|
||||
|
||||
var URL: NSURL! {
|
||||
if let item = self.item {
|
||||
return item.valueForAttribute(NSMetadataItemURLKey) as NSURL
|
||||
}
|
||||
else {
|
||||
return _URL
|
||||
}
|
||||
}
|
||||
var _URL: NSURL!
|
||||
var item: NSMetadataItem?
|
||||
var color: List.Color = .Gray
|
||||
|
||||
init(URL: NSURL) {
|
||||
_URL = URL
|
||||
}
|
||||
|
||||
init(metadataItem item: NSMetadataItem) {
|
||||
self.item = item
|
||||
_URL = item.valueForAttribute(NSMetadataItemURLKey) as NSURL
|
||||
}
|
||||
|
||||
func prepare(completionHandler: () -> Void) {
|
||||
let document = ListDocument(fileURL: URL)
|
||||
document.openWithCompletionHandler() { _ in
|
||||
self.color = document.list.color
|
||||
|
||||
document.closeWithCompletionHandler(nil)
|
||||
|
||||
completionHandler()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func ==(lhs: ListFileRepresentation, rhs: ListFileRepresentation) -> Bool {
|
||||
// the metadata item does not impact equality for our purposes
|
||||
return lhs.URL == rhs.URL
|
||||
}
|
|
@ -1,42 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 2014 Apple Inc. All Rights Reserved.
|
||||
See LICENSE.txt for this sample’s licensing information
|
||||
|
||||
*/
|
||||
|
||||
import Cocoa
|
||||
import ListerKitOSX
|
||||
|
||||
class ApplicationDelegate: NSObject, NSApplicationDelegate {
|
||||
func applicationDidFinishLaunching(NSNotification) {
|
||||
AppConfiguration.sharedConfiguration.runHandlerOnFirstLaunch {
|
||||
// Make sure that no other documents are visible except for the Today document.
|
||||
NSDocumentController.sharedDocumentController().closeAllDocumentsWithDelegate(nil, didCloseAllSelector: nil, contextInfo: nil)
|
||||
|
||||
self.openTodayDocument()
|
||||
}
|
||||
}
|
||||
|
||||
// Note that there are two possibile callers for this method. The first is the application delegate if it's the first launch.
|
||||
// The other possibility is if you use the keyboard shortcut (Command-T) to open your Today document.
|
||||
@IBAction func openTodayDocument(_: AnyObject? = nil) {
|
||||
let listManager = TodayListManager.sharedTodayListManager
|
||||
|
||||
let documentController = NSDocumentController.sharedDocumentController() as NSDocumentController
|
||||
|
||||
var error: NSError?
|
||||
if !listManager.ensureTodayDocumentExistsWithError(&error) {
|
||||
documentController.presentError(error)
|
||||
return
|
||||
}
|
||||
|
||||
documentController.openDocumentWithContentsOfURL(listManager.todayDocumentURL, display: true) { (document, _, _) in
|
||||
documentController.addDocument(document)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// <rdar://problem/16880777> can't compare two NSObjectProtocol instances even though they implement -isEqual:
|
||||
func ==(lhs: protocol<NSObjectProtocol, NSCoding, NSCopying>, rhs: protocol<NSObjectProtocol, NSCoding, NSCopying>) -> Bool {
|
||||
return lhs.isEqual(rhs)
|
||||
}
|
|
@ -1,10 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>com.apple.security.application-groups</key>
|
||||
<array>
|
||||
<string>$(TeamIdentifierPrefix)com.example.apple-samplecode.ListerGroup</string>
|
||||
</array>
|
||||
</dict>
|
||||
</plist>
|
|
@ -1,104 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6154.16" systemVersion="14A238s" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="Yx6-Rv-4Rt">
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6153.10"/>
|
||||
<capability name="Aspect ratio constraints" minToolsVersion="5.1"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--TtC4 7com example apple samplecode Lister Lister Today19 Today View Controller-->
|
||||
<scene sceneID="ptT-1U-RxG">
|
||||
<objects>
|
||||
<tableViewController id="Yx6-Rv-4Rt" customClass="TodayViewController" customModule="com_example_apple_samplecode_Lister_ListerToday" sceneMemberID="viewController">
|
||||
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="none" showsSelectionImmediatelyOnTouchBegin="NO" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="qUQ-YA-DWa">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="200"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<prototypes>
|
||||
<tableViewCell contentMode="scaleToFill" ambiguous="YES" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="todayViewCell" id="yvc-Rb-Ky9" customClass="CheckboxCell" customModule="com_example_apple_samplecode_Lister_ListerToday">
|
||||
<rect key="frame" x="0.0" y="86" width="320" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="yvc-Rb-Ky9" id="FVA-2r-Qck">
|
||||
<rect key="frame" x="0.0" y="0.0" width="703" height="43.5"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="SdY-qH-iah" customClass="CheckBox" customModule="ListerKit">
|
||||
<rect key="frame" x="15" y="8" width="27.5" height="28"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<color key="tintColor" white="0.33333333333333331" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" secondItem="SdY-qH-iah" secondAttribute="height" multiplier="1:1" id="ZEg-1d-KMS"/>
|
||||
</constraints>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="boolean" keyPath="isChecked" value="NO"/>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="insetFactor">
|
||||
<real key="value" value="0.171875"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="strokeFactor">
|
||||
<real key="value" value="0.068359375"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
<connections>
|
||||
<action selector="checkBoxTapped:" destination="Yx6-Rv-4Rt" eventType="touchUpInside" id="X65-ZG-6tK"/>
|
||||
</connections>
|
||||
</view>
|
||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bpF-CM-0Y8">
|
||||
<rect key="frame" x="57.5" y="12" width="247.5" height="20"/>
|
||||
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
|
||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<constraints>
|
||||
<constraint firstItem="bpF-CM-0Y8" firstAttribute="leading" secondItem="SdY-qH-iah" secondAttribute="trailing" constant="15" id="3bX-xw-2S0"/>
|
||||
<constraint firstAttribute="bottom" secondItem="SdY-qH-iah" secondAttribute="bottom" constant="8" id="Ae1-1Y-6SB"/>
|
||||
<constraint firstAttribute="centerY" secondItem="bpF-CM-0Y8" secondAttribute="centerY" id="Jld-hP-mol"/>
|
||||
<constraint firstItem="SdY-qH-iah" firstAttribute="leading" secondItem="FVA-2r-Qck" secondAttribute="leading" constant="15" id="OBm-Jx-Jkl"/>
|
||||
<constraint firstItem="SdY-qH-iah" firstAttribute="top" secondItem="FVA-2r-Qck" secondAttribute="top" constant="8" id="Xl6-eD-p6n"/>
|
||||
<constraint firstAttribute="trailing" secondItem="bpF-CM-0Y8" secondAttribute="trailing" constant="15" id="jNW-fZ-UrU"/>
|
||||
</constraints>
|
||||
</tableViewCellContentView>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<connections>
|
||||
<outlet property="checkBox" destination="SdY-qH-iah" id="piX-je-ZlD"/>
|
||||
<outlet property="label" destination="bpF-CM-0Y8" id="tvC-hs-6vU"/>
|
||||
</connections>
|
||||
</tableViewCell>
|
||||
<tableViewCell appearanceType="aqua" contentMode="scaleToFill" ambiguous="YES" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="messageCell" textLabel="A1L-bz-N4F" style="IBUITableViewCellStyleDefault" id="iIK-77-nn0">
|
||||
<rect key="frame" x="0.0" y="86" width="320" height="44"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="iIK-77-nn0" id="YtQ-tO-l90">
|
||||
<rect key="frame" x="0.0" y="0.0" width="703" height="43.5"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="A1L-bz-N4F">
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
|
||||
<color key="textColor" cocoaTouchSystemColor="lightTextColor"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
</tableViewCellContentView>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
</tableViewCell>
|
||||
</prototypes>
|
||||
<connections>
|
||||
<outlet property="dataSource" destination="Yx6-Rv-4Rt" id="7fu-R9-uFa"/>
|
||||
<outlet property="delegate" destination="Yx6-Rv-4Rt" id="uFG-i3-vV9"/>
|
||||
</connections>
|
||||
</tableView>
|
||||
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
|
||||
<size key="freeformSize" width="320" height="200"/>
|
||||
</tableViewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="KX6-mw-unc" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="516" y="533"/>
|
||||
</scene>
|
||||
</scenes>
|
||||
<simulatedMetricsContainer key="defaultSimulatedMetrics">
|
||||
<simulatedStatusBarMetrics key="statusBar"/>
|
||||
<simulatedOrientationMetrics key="orientation"/>
|
||||
<simulatedScreenMetrics key="destination" type="retina4"/>
|
||||
</simulatedMetricsContainer>
|
||||
</document>
|
|
@ -1,53 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 2014 Apple Inc. All Rights Reserved.
|
||||
See LICENSE.txt for this sample’s licensing information
|
||||
|
||||
*/
|
||||
|
||||
import Cocoa
|
||||
import ListerKitOSX
|
||||
|
||||
@objc protocol ListerTodayDocumentDelegate {
|
||||
func listerTodayDocumentDidUpdateContents(document: ListerTodayDocument)
|
||||
}
|
||||
|
||||
class ListerTodayDocument: NSDocument {
|
||||
var list: List!
|
||||
|
||||
weak var delegate: ListerTodayDocumentDelegate?
|
||||
|
||||
override class func autosavesInPlace() -> Bool {
|
||||
return true
|
||||
}
|
||||
|
||||
override func readFromData(data: NSData, ofType typeName: String, error outError: NSErrorPointer) -> Bool {
|
||||
if let deserializedList = NSKeyedUnarchiver.unarchiveObjectWithData(data) as List {
|
||||
list = deserializedList
|
||||
return true
|
||||
}
|
||||
|
||||
let error = NSError(domain: NSCocoaErrorDomain, code: NSFileReadCorruptFileError, userInfo: [
|
||||
NSLocalizedDescriptionKey: NSLocalizedString("Could not read file", comment: "Read error description"),
|
||||
NSLocalizedFailureReasonErrorKey: NSLocalizedString("File was in an invalid format", comment: "Read failure reason")
|
||||
])
|
||||
|
||||
outError.memory = error
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
override func dataOfType(typeName: String, error outError: NSErrorPointer) -> NSData? {
|
||||
if let data = NSKeyedArchiver.archivedDataWithRootObject(list) {
|
||||
return data
|
||||
}
|
||||
|
||||
let error = NSError(domain: NSCocoaErrorDomain, code: NSFileWriteUnknownError, userInfo: [
|
||||
NSLocalizedDescriptionKey: NSLocalizedString("Could not save file", comment: "Write error description"),
|
||||
NSLocalizedFailureReasonErrorKey: NSLocalizedString("An unexpected error occured", comment: "Write failure reason")
|
||||
])
|
||||
|
||||
outError.memory = error
|
||||
|
||||
return nil
|
||||
}
|
||||
}
|
|
@ -93,4 +93,4 @@ This sample leverages many features of Swift, including:
|
|||
On OS X, it’s a known issue that the destination view controller’s presentingViewController() returns nil if used in a popover segue. As a workaround, you can use the escape key instead of the enter key when creating new list items in the OS X version of Lister.
|
||||
|
||||
===========================================================================
|
||||
Copyright (C) 2014 Apple Inc. All rights reserved.
|
||||
Copyright (C) 2014 Apple Inc. All rights reserved.
|
Loading…
Reference in New Issue