├── Task Ticker ├── Checklist │ ├── en.lproj │ │ ├── InfoPlist.strings │ │ └── MainStoryboard.storyboard │ ├── Default.png │ ├── Default@2x.png │ ├── Default-568h@2x.png │ ├── Task Ticker-Prefix.pch │ ├── main.m │ └── Task Ticker-Info.plist ├── Icon.png ├── Icon-60.png ├── Icon@2x.png ├── Icon-60@2x.png ├── Icon-Small.png ├── Icon-Small-40.png ├── Icon-Small@2x.png ├── Icon-Small-40@2x.png ├── Resources │ ├── No Icon.png │ ├── No Icon@2x.png │ ├── checkbox.png │ ├── checkbox@2x.png │ ├── list-item-bg.png │ ├── Toggle_Divider.png │ ├── blue-background.jpg │ ├── blue-bar-button.png │ ├── blue-menu-bar.png │ ├── list-item-bg@2x.png │ ├── Toggle_Divider@2x.png │ ├── blue-back-button.png │ ├── blue-menu-bar@2x.png │ ├── checkbox-checked.png │ ├── blue-back-button@2x.png │ ├── blue-background@2x.jpg │ ├── blue-bar-button@2x.png │ ├── checkbox-checked@2x.png │ ├── detaildisclosure-new.png │ └── detaildisclosure-new@2x.png ├── Task Ticker.xcodeproj │ ├── xcuserdata │ │ ├── Kalai.xcuserdatad │ │ │ ├── xcdebugger │ │ │ │ └── Breakpoints.xcbkptlist │ │ │ └── xcschemes │ │ │ │ ├── xcschememanagement.plist │ │ │ │ └── Checklist.xcscheme │ │ ├── parthobiswas.xcuserdatad │ │ │ └── xcschemes │ │ │ │ ├── xcschememanagement.plist │ │ │ │ └── Task Ticker.xcscheme │ │ └── partho.xcuserdatad │ │ │ └── xcschemes │ │ │ ├── xcschememanagement.plist │ │ │ ├── Checklist.xcscheme │ │ │ └── Task Ticker - App Store.xcscheme │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcuserdata │ │ │ ├── Kalai.xcuserdatad │ │ │ ├── UserInterfaceState.xcuserstate │ │ │ └── WorkspaceSettings.xcsettings │ │ │ ├── partho.xcuserdatad │ │ │ ├── UserInterfaceState.xcuserstate │ │ │ └── WorkspaceSettings.xcsettings │ │ │ └── parthobiswas.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ └── project.pbxproj └── Classes │ ├── DataModel.h │ ├── DALinedTextView │ ├── DALinedTextView.h │ └── DALinedTextView.m │ ├── AppDelegate.h │ ├── DatePickerViewController.h │ ├── ChecklistItem.h │ ├── ChecklistViewController.h │ ├── DataModel.m │ ├── UIPickerActionSheet │ ├── UIPickerActionSheet.h │ └── UIPickerActionSheet.m │ ├── DatePickerViewController.m │ ├── AddItemViewController.h │ ├── ChecklistItem.m │ ├── AppDelegate.m │ ├── AddItemViewController.m │ └── ChecklistViewController.m └── README.md /Task Ticker/Checklist/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /Task Ticker/Icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Icon.png -------------------------------------------------------------------------------- /Task Ticker/Icon-60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Icon-60.png -------------------------------------------------------------------------------- /Task Ticker/Icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Icon@2x.png -------------------------------------------------------------------------------- /Task Ticker/Icon-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Icon-60@2x.png -------------------------------------------------------------------------------- /Task Ticker/Icon-Small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Icon-Small.png -------------------------------------------------------------------------------- /Task Ticker/Icon-Small-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Icon-Small-40.png -------------------------------------------------------------------------------- /Task Ticker/Icon-Small@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Icon-Small@2x.png -------------------------------------------------------------------------------- /Task Ticker/Checklist/Default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Checklist/Default.png -------------------------------------------------------------------------------- /Task Ticker/Icon-Small-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Icon-Small-40@2x.png -------------------------------------------------------------------------------- /Task Ticker/Resources/No Icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Resources/No Icon.png -------------------------------------------------------------------------------- /Task Ticker/Checklist/Default@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Checklist/Default@2x.png -------------------------------------------------------------------------------- /Task Ticker/Resources/No Icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Resources/No Icon@2x.png -------------------------------------------------------------------------------- /Task Ticker/Resources/checkbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Resources/checkbox.png -------------------------------------------------------------------------------- /Task Ticker/Resources/checkbox@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Resources/checkbox@2x.png -------------------------------------------------------------------------------- /Task Ticker/Resources/list-item-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Resources/list-item-bg.png -------------------------------------------------------------------------------- /Task Ticker/Checklist/Default-568h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Checklist/Default-568h@2x.png -------------------------------------------------------------------------------- /Task Ticker/Resources/Toggle_Divider.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Resources/Toggle_Divider.png -------------------------------------------------------------------------------- /Task Ticker/Resources/blue-background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Resources/blue-background.jpg -------------------------------------------------------------------------------- /Task Ticker/Resources/blue-bar-button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Resources/blue-bar-button.png -------------------------------------------------------------------------------- /Task Ticker/Resources/blue-menu-bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Resources/blue-menu-bar.png -------------------------------------------------------------------------------- /Task Ticker/Resources/list-item-bg@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Resources/list-item-bg@2x.png -------------------------------------------------------------------------------- /Task Ticker/Resources/Toggle_Divider@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Resources/Toggle_Divider@2x.png -------------------------------------------------------------------------------- /Task Ticker/Resources/blue-back-button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Resources/blue-back-button.png -------------------------------------------------------------------------------- /Task Ticker/Resources/blue-menu-bar@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Resources/blue-menu-bar@2x.png -------------------------------------------------------------------------------- /Task Ticker/Resources/checkbox-checked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Resources/checkbox-checked.png -------------------------------------------------------------------------------- /Task Ticker/Resources/blue-back-button@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Resources/blue-back-button@2x.png -------------------------------------------------------------------------------- /Task Ticker/Resources/blue-background@2x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Resources/blue-background@2x.jpg -------------------------------------------------------------------------------- /Task Ticker/Resources/blue-bar-button@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Resources/blue-bar-button@2x.png -------------------------------------------------------------------------------- /Task Ticker/Resources/checkbox-checked@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Resources/checkbox-checked@2x.png -------------------------------------------------------------------------------- /Task Ticker/Resources/detaildisclosure-new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Resources/detaildisclosure-new.png -------------------------------------------------------------------------------- /Task Ticker/Resources/detaildisclosure-new@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Resources/detaildisclosure-new@2x.png -------------------------------------------------------------------------------- /Task Ticker/Task Ticker.xcodeproj/xcuserdata/Kalai.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /Task Ticker/Task Ticker.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Task Ticker/Task Ticker.xcodeproj/project.xcworkspace/xcuserdata/Kalai.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Task Ticker.xcodeproj/project.xcworkspace/xcuserdata/Kalai.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /Task Ticker/Task Ticker.xcodeproj/project.xcworkspace/xcuserdata/partho.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Task Ticker.xcodeproj/project.xcworkspace/xcuserdata/partho.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /Task Ticker/Task Ticker.xcodeproj/project.xcworkspace/xcuserdata/parthobiswas.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/partho-maple/Task-Ticker_Obj-C/HEAD/Task Ticker/Task Ticker.xcodeproj/project.xcworkspace/xcuserdata/parthobiswas.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /Task Ticker/Checklist/Task Ticker-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'Checklist' target in the 'Checklist' project 3 | // 4 | 5 | #import 6 | 7 | #ifndef __IPHONE_5_0 8 | #warning "This project uses features only available in iOS SDK 5.0 and later." 9 | #endif 10 | 11 | #ifdef __OBJC__ 12 | #import 13 | #import 14 | #endif 15 | -------------------------------------------------------------------------------- /Task Ticker/Checklist/main.m: -------------------------------------------------------------------------------- 1 | 2 | // 3 | // main.m 4 | // Checklist 5 | // 6 | // Created by Partho Biswas on 8/7/13. 7 | // Copyright (c) 2013 Partho Biswas. All rights reserved. 8 | // 9 | 10 | #import 11 | 12 | #import "AppDelegate.h" 13 | 14 | int main(int argc, char *argv[]) 15 | { 16 | @autoreleasepool { 17 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Task Ticker/Classes/DataModel.h: -------------------------------------------------------------------------------- 1 | // 2 | // DataModel.h 3 | // Task List 4 | // 5 | // Created by Partho Biswas on 9/9/12. 6 | // Copyright (c) 2012 Partho Biswas. All rights reserved. 7 | // 8 | 9 | 10 | #import 11 | 12 | @interface DataModel : NSObject 13 | 14 | 15 | 16 | /// We declare nextChecklistItemId method to assign an ID for each notification scheduled. 17 | 18 | + (int)nextChecklistItemId; 19 | 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /Task Ticker/Task Ticker.xcodeproj/project.xcworkspace/xcuserdata/Kalai.xcuserdatad/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges 6 | 7 | SnapshotAutomaticallyBeforeSignificantChanges 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Task Ticker/Task Ticker.xcodeproj/project.xcworkspace/xcuserdata/partho.xcuserdatad/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges 6 | 7 | SnapshotAutomaticallyBeforeSignificantChanges 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Task Ticker/Classes/DALinedTextView/DALinedTextView.h: -------------------------------------------------------------------------------- 1 | // 2 | // DALinedTextView.h 3 | // DALinedTextView 4 | // 5 | // Created by Daniel Amitay on 5/12/13. 6 | // Copyright (c) 2013 Daniel Amitay. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface DALinedTextView : UITextView 12 | 13 | @property (nonatomic, strong) UIColor *horizontalLineColor UI_APPEARANCE_SELECTOR; 14 | @property (nonatomic, strong) UIColor *verticalLineColor UI_APPEARANCE_SELECTOR; 15 | 16 | @property (nonatomic) UIEdgeInsets margins UI_APPEARANCE_SELECTOR; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /Task Ticker/Classes/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // Checklist 4 | // 5 | // Created by Partho Biswas on 8/7/13. 6 | // Copyright (c) 2013 Partho Biswas. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | 16 | ///declare "customizeAppearance" method. once application finished launching, we call customizeAppearance method. customizeAppearance is responsible to theme the app. Implemented in .m file 17 | 18 | -(void)customizeAppearance; 19 | 20 | 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /Task Ticker/Task Ticker.xcodeproj/xcuserdata/Kalai.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Checklist.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | A66CF937178A615500C582E1 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Task Ticker/Task Ticker.xcodeproj/xcuserdata/parthobiswas.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Task Ticker.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | A66CF937178A615500C582E1 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Task Ticker/Task Ticker.xcodeproj/xcuserdata/partho.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Checklist.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | Task Ticker - App Store.xcscheme 13 | 14 | orderHint 15 | 1 16 | 17 | 18 | SuppressBuildableAutocreation 19 | 20 | A66CF937178A615500C582E1 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /Task Ticker/Classes/DatePickerViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // DatePickerViewController.h 3 | // Task List 4 | // 5 | // Created by Partho Biswas on 12/9/12. 6 | // Copyright (c) 2012 Partho Biswas. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | 12 | @class DatePickerViewController; 13 | 14 | @protocol DatePickerViewControllerDelegate 15 | 16 | - (void)datePickerDidCancel:(DatePickerViewController *)picker; 17 | - (void)datePicker:(DatePickerViewController *)picker didPickDate:(NSDate *)date; 18 | 19 | @end 20 | 21 | @interface DatePickerViewController : UIViewController 22 | 23 | @property (nonatomic, strong) IBOutlet UITableView *tableView; 24 | @property (nonatomic, strong) IBOutlet UIDatePicker *datePicker; 25 | @property (nonatomic, weak) id delegate; 26 | @property (nonatomic, strong) NSDate *date; 27 | 28 | - (IBAction)cancel; 29 | - (IBAction)done; 30 | - (IBAction)dateChanged; 31 | 32 | @end 33 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Task Ticker 2 | 3 | 4 | Source code for this app: https://itunes.apple.com/us/app/task-ticker-lite/id717509889?mt=8 5 | 6 | 7 | ***List-making made simple!*** 8 | 9 | Keep ALL your lists in one place.This effective to-do list lets you keep track of everything you need to do. Organise tasks in your own to-do lists. Task Ticker is a very customisable to-do list with lots of settings. Actions can be assigned to buttons and swipe movements to make the app behave like you want. Tick them off when done. 10 | 11 | 12 | 13 | It does the following things: 14 | 15 | 16 | -Organise tasks 17 | 18 | -To do list & Shopping list 19 | 20 | -Get things done (GTD) 21 | 22 | -Organise your schedule by note in calendar 23 | 24 | -Reminder notes on status bar 25 | 26 | -Search notes 27 | 28 | -Powerful Reminder : Time Alarm, All day, Repetition. 29 | 30 | -Quick memo / notes 31 | 32 | -Share notes via SMS, email, twitter 33 | 34 | -Gesture based operation (swipe to cross)
-Designed to be quick and unobtrusive 35 | 36 | 37 | -------------------------------------------------------------------------------- /Task Ticker/Classes/ChecklistItem.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // Checklist 4 | // 5 | // Created by Partho Biswas on 8/7/13. 6 | // Copyright (c) 2013 Partho Biswas. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "DataModel.h" 11 | 12 | 13 | @interface ChecklistItem : NSObject 14 | 15 | ///declare propertis of the items we want to store 16 | 17 | @property (nonatomic, copy) NSString *text; 18 | @property (nonatomic, assign) BOOL checked; 19 | @property (nonatomic, copy) NSString *notes; 20 | 21 | @property (nonatomic, copy) NSString *priority; 22 | @property (nonatomic, copy) NSString *priorityToDisplay; 23 | 24 | @property (nonatomic, copy) NSDate *dueDate; 25 | @property (nonatomic, assign) BOOL shouldRemind; 26 | @property (nonatomic, assign) int itemId; 27 | 28 | 29 | 30 | ///declare method to schedule local notification 31 | - (void)scheduleNotification; 32 | 33 | ///declare method when user tap on an item to mark it as compelted 34 | - (void)toggleChecked; 35 | 36 | 37 | @end -------------------------------------------------------------------------------- /Task Ticker/Classes/ChecklistViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // Checklist 4 | // 5 | // Created by Partho Biswas on 8/7/13. 6 | // Copyright (c) 2013 Partho Biswas. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AddItemViewController.h" 11 | #import 12 | #import 13 | 14 | 15 | 16 | @interface ChecklistViewController : UITableViewController 17 | { 18 | ///declare tableview and banner view for iAd banner 19 | 20 | UITableView *TableView; 21 | 22 | ADBannerView *bannerView; 23 | } 24 | 25 | 26 | //declare property of tableview. So that we can define whether the iAd panel shall be shown as header of table view or footer of table view. 27 | 28 | @property (nonatomic, retain) IBOutlet UITableView *TableView; 29 | 30 | 31 | 32 | ///declare property for activitycontroller to show whenuser tap on search button 33 | @property (nonatomic, strong) UIActivityViewController *activityViewController; 34 | 35 | ///create a property for action to be called when user tap on sharebutton 36 | -(IBAction) shareButtonClicked:(id)sender; 37 | 38 | 39 | 40 | ///declare NSMutableArray property for filtered table data 41 | @property (strong, nonatomic) NSMutableArray* filteredTableData; 42 | 43 | ///declare property for searchbar 44 | @property (weak, nonatomic) IBOutlet UISearchBar *searchBar; 45 | 46 | ///create a property to check the status 47 | @property (nonatomic, assign) bool isFiltered; 48 | 49 | 50 | 51 | 52 | @end 53 | -------------------------------------------------------------------------------- /Task Ticker/Checklist/Task Ticker-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIcons 12 | 13 | CFBundlePrimaryIcon 14 | 15 | CFBundleIconFiles 16 | 17 | Icon-Small-40 18 | Icon-Small 19 | Icon 20 | Icon-60 21 | Icon.png 22 | Icon@2x.png 23 | 24 | 25 | 26 | CFBundleIdentifier 27 | com.CodeClef.Task-Ticker 28 | CFBundleInfoDictionaryVersion 29 | 6.0 30 | CFBundleName 31 | ${PRODUCT_NAME} 32 | CFBundlePackageType 33 | APPL 34 | CFBundleShortVersionString 35 | 1.1 36 | CFBundleSignature 37 | ???? 38 | CFBundleVersion 39 | 1.1 40 | LSRequiresIPhoneOS 41 | 42 | UIMainStoryboardFile 43 | MainStoryboard 44 | UIRequiredDeviceCapabilities 45 | 46 | armv7 47 | 48 | UISupportedInterfaceOrientations 49 | 50 | UIInterfaceOrientationPortrait 51 | UIInterfaceOrientationPortraitUpsideDown 52 | UIInterfaceOrientationLandscapeLeft 53 | UIInterfaceOrientationLandscapeRight 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /Task Ticker/Classes/DataModel.m: -------------------------------------------------------------------------------- 1 | // 2 | // DataModel.m 3 | // Task List 4 | // 5 | // Created by Partho Biswas on 9/9/12. 6 | // Copyright (c) 2012 Partho Biswas. All rights reserved. 7 | // 8 | 9 | #import "DataModel.h" 10 | 11 | 12 | @implementation DataModel 13 | 14 | 15 | 16 | ///register defaults for the application. We declare yes to firsttime and id for location notification to zero. 17 | 18 | - (void)registerDefaults 19 | { 20 | NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys: 21 | [NSNumber numberWithBool:YES], @"FirstTime", 22 | [NSNumber numberWithInt:0], @"ChecklistItemId", 23 | nil]; 24 | [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary]; 25 | } 26 | 27 | 28 | 29 | ///When the app run first time, we need to change the user default for "firstrun" to NO. 30 | 31 | - (void)handleFirstTime 32 | { 33 | BOOL firstTime = [[NSUserDefaults standardUserDefaults] boolForKey:@"FirstTime"]; 34 | if (firstTime) { 35 | 36 | [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"FirstTime"]; 37 | 38 | } 39 | } 40 | 41 | 42 | ///Once loaded we call the following methods to check whether first time or subsequent time loading. 43 | 44 | - (id)init 45 | { 46 | if ((self = [super init])) { 47 | [self registerDefaults]; 48 | [self handleFirstTime]; 49 | } 50 | return self; 51 | } 52 | 53 | 54 | ///Here we assign the ID for first checklist createdto 0 and for each checklist generated subsequently will add incremental of 1. 55 | 56 | + (int)nextChecklistItemId 57 | { 58 | NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 59 | int itemId = [userDefaults integerForKey:@"ChecklistItemId"]; 60 | [userDefaults setInteger:itemId + 1 forKey:@"ChecklistItemId"]; 61 | [userDefaults synchronize]; 62 | return itemId; 63 | } 64 | 65 | 66 | @end 67 | -------------------------------------------------------------------------------- /Task Ticker/Classes/UIPickerActionSheet/UIPickerActionSheet.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIPickerActionSheet.h 3 | // Version 0.1 4 | // 5 | // This code is distributed under the terms and conditions of the MIT license. 6 | // 7 | // Copyright (c) 2013 José Enrique Bolaños Gudiño 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in 17 | // all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 25 | // THE SOFTWARE. 26 | // 27 | 28 | #import 29 | 30 | @protocol UIPickerActionSheetDelegate; 31 | 32 | @interface UIPickerActionSheet : NSObject 33 | 34 | @property (nonatomic, assign) id delegate; 35 | @property (nonatomic, strong) UIView *containerView; 36 | @property (nonatomic, strong) UIActionSheet *sheet; 37 | @property (nonatomic, strong) UIPickerView *picker; 38 | @property (nonatomic, strong) NSArray *items; 39 | @property (nonatomic, strong) id selectedItem; 40 | 41 | - (id)initForView:(UIView*)aView; 42 | - (void)show:(NSArray*)aItems; 43 | 44 | @end 45 | 46 | @protocol UIPickerActionSheetDelegate 47 | @optional 48 | - (void)pickerActionSheet:(UIPickerActionSheet*)aPickerActionSheet didSelectItem:(id)aItem; 49 | - (void)pickerActionSheetDidCancel:(UIPickerActionSheet*)aPickerActionSheet; 50 | @end -------------------------------------------------------------------------------- /Task Ticker/Classes/DatePickerViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // DatePickerViewController.m 3 | // Task List 4 | // 5 | // Created by Partho Biswas on 12/9/12. 6 | // Copyright (c) 2012 Partho Biswas. All rights reserved. 7 | // 8 | 9 | #import "DatePickerViewController.h" 10 | 11 | @interface DatePickerViewController () 12 | 13 | @end 14 | 15 | @implementation DatePickerViewController { 16 | UILabel *dateLabel; 17 | } 18 | 19 | @synthesize tableView; 20 | @synthesize datePicker; 21 | @synthesize delegate; 22 | @synthesize date; 23 | 24 | 25 | - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 26 | { 27 | self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 28 | if (self) { 29 | // Custom initialization 30 | } 31 | return self; 32 | } 33 | 34 | 35 | - (void)viewDidLoad 36 | { 37 | [super viewDidLoad]; 38 | 39 | self.tableView.backgroundView = [[UIImageView alloc] initWithImage: 40 | [UIImage imageNamed:@"backgroundfordatepicker.png"]]; 41 | 42 | self.title = NSLocalizedString(@"Choosedate", nil); 43 | 44 | datePicker.minimumDate = [NSDate date]; 45 | 46 | } 47 | 48 | 49 | 50 | 51 | - (void)viewDidUnload 52 | { 53 | [super viewDidUnload]; 54 | self.tableView = nil; 55 | self.datePicker = nil; 56 | dateLabel = nil; 57 | 58 | 59 | } 60 | 61 | 62 | - (IBAction)cancel 63 | { 64 | [self.delegate datePickerDidCancel:self]; 65 | } 66 | - (IBAction)done 67 | { 68 | [self.delegate datePicker:self didPickDate:self.date]; 69 | } 70 | 71 | 72 | - (void)viewWillAppear:(BOOL)animated 73 | { 74 | [super viewWillAppear:animated]; 75 | [self.datePicker setDate:self.date animated:YES]; 76 | } 77 | 78 | 79 | 80 | - (void)updateDateLabel 81 | { 82 | NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 83 | [formatter setDateStyle:NSDateFormatterFullStyle]; 84 | [formatter setTimeStyle:NSDateFormatterShortStyle]; 85 | dateLabel.text = [formatter stringFromDate:date]; 86 | } 87 | 88 | 89 | - (IBAction)dateChanged 90 | { 91 | self.date = [self.datePicker date]; 92 | [self updateDateLabel]; 93 | } 94 | 95 | 96 | 97 | 98 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 99 | { 100 | return 1; 101 | } 102 | 103 | 104 | 105 | - (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 106 | { 107 | UITableViewCell *cell = [theTableView dequeueReusableCellWithIdentifier:@"DateCell"]; 108 | dateLabel = (UILabel *)[cell viewWithTag:1000]; 109 | [self updateDateLabel]; 110 | return cell; 111 | } 112 | - (NSIndexPath *)tableView:(UITableView *)theTableView willSelectRowAtIndexPath 113 | :(NSIndexPath *)indexPath 114 | { 115 | return nil; 116 | } 117 | 118 | 119 | 120 | - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:( 121 | NSInteger)section 122 | { 123 | return 77; 124 | } 125 | 126 | @end 127 | -------------------------------------------------------------------------------- /Task Ticker/Task Ticker.xcodeproj/xcuserdata/Kalai.xcuserdatad/xcschemes/Checklist.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 51 | 52 | 58 | 59 | 60 | 61 | 62 | 63 | 69 | 70 | 76 | 77 | 78 | 79 | 81 | 82 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /Task Ticker/Task Ticker.xcodeproj/xcuserdata/partho.xcuserdatad/xcschemes/Checklist.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 51 | 52 | 58 | 59 | 60 | 61 | 62 | 63 | 69 | 70 | 76 | 77 | 78 | 79 | 81 | 82 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /Task Ticker/Task Ticker.xcodeproj/xcuserdata/partho.xcuserdatad/xcschemes/Task Ticker - App Store.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 51 | 52 | 58 | 59 | 60 | 61 | 62 | 63 | 69 | 70 | 76 | 77 | 78 | 79 | 81 | 82 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /Task Ticker/Task Ticker.xcodeproj/xcuserdata/parthobiswas.xcuserdatad/xcschemes/Task Ticker.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /Task Ticker/Classes/AddItemViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // Checklist 4 | // 5 | // Created by Partho Biswas on 8/7/13. 6 | // Copyright (c) 2013 Partho Biswas. All rights reserved. 7 | // 8 | 9 | 10 | #import 11 | #import "DatePickerViewController.h" 12 | #import "UIPickerActionSheet.h" 13 | 14 | ///declare delagate methods 15 | 16 | @class AddItemViewController; 17 | @class ChecklistItem; 18 | 19 | /// We pass the creted information to checkviewcontroller using delegate method. 20 | @protocol AddItemViewControllerDelegate 21 | 22 | ///This method declares when user tap on the cancel button, it will dismiss the additem view controller presenting without saving the data 23 | - (void)addItemViewControllerDidCancel:(AddItemViewController *)controller; 24 | 25 | 26 | 27 | ///This method pass the relevant "added" information such as task, notes, whether to remind to checklistview controller 28 | - (void)addItemViewController:(AddItemViewController *)controller didFinishAddingItem:(ChecklistItem *)item; 29 | 30 | 31 | 32 | 33 | ///This method pass the relevant "edited" information such as task, notes, whether to remind to checklistview controller 34 | - (void)addItemViewController:(AddItemViewController *)controller didFinishEditingItem:(ChecklistItem *)item; 35 | @end 36 | 37 | 38 | /// confirm that textfield, datpicker and actionsheet delegates to self 39 | @interface AddItemViewController : UITableViewController 40 | 41 | 42 | /// textField is a field where user key in the task information. 43 | @property (strong, nonatomic) IBOutlet UITextField *textField; 44 | 45 | /// notesField is a field where user key in the additional information. 46 | @property (strong, nonatomic) IBOutlet UITextView *notesField; 47 | 48 | /// We create doneBarButton as IBOutlet so that we can disable the done button if the text field is empty. 49 | @property (nonatomic, strong) IBOutlet UIBarButtonItem *doneBarButton; 50 | 51 | ///confirms delegate method 52 | @property (nonatomic, weak) id delegate; 53 | 54 | ///We declare itemtoedit method to display information for user to edit 55 | @property (nonatomic, strong) ChecklistItem *itemToEdit; 56 | 57 | 58 | ///we need a switch control for user to toggle whether notification is required 59 | @property (nonatomic, strong) IBOutlet UISwitch *switchControl; 60 | 61 | ///this is the notification time which user selects 62 | @property (nonatomic, strong) IBOutlet UILabel *dueDateLabel; 63 | 64 | ///We display the periority as per user selection 65 | @property (nonatomic, strong) IBOutlet UILabel *priorityLabel; 66 | 67 | ///the we present to user whether the priority is low, high or medium but we update as !, !! !!!. therefore we need another label 68 | @property (nonatomic, strong) IBOutlet UILabel *priorityLabelToDisplay; 69 | 70 | ///we use picker action sheet to display priority options. User can choose one of them. If the user didn't select any, priority will be set to none 71 | @property (nonatomic, strong) UIPickerActionSheet *pickerActionSheet; 72 | 73 | 74 | ///create IBActions 75 | 76 | ///We create cancel IBAction. when user tap on cancel button, we dismiss the presenting view controller by calling AddItemViewControllerDelegate using delegate method 77 | - (IBAction)cancel; 78 | 79 | ///We create done IBAction. when user tap done button, we dismiss the presenting view controller by calling didFinishAddingItem using delegate method which will pass the added/edited information to checklistviewcontroller 80 | - (IBAction)done; 81 | 82 | ///We record when the user change the switch 83 | - (IBAction)switchChanged:(UISwitch *)sender; 84 | 85 | ///When user tab on the priority label, we call this method and present uipicker action sheeet with priority options 86 | - (IBAction)priority:(id)sender; 87 | 88 | @end -------------------------------------------------------------------------------- /Task Ticker/Classes/ChecklistItem.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // Checklist 4 | // 5 | // Created by Partho Biswas on 8/7/13. 6 | // Copyright (c) 2013 Partho Biswas. All rights reserved. 7 | // 8 | 9 | #import "ChecklistItem.h" 10 | #import "DataModel.h" 11 | 12 | @implementation ChecklistItem 13 | 14 | ///synthesize the declared properties 15 | 16 | @synthesize text, checked, notes, priority, priorityToDisplay; 17 | @synthesize dueDate, shouldRemind, itemId; 18 | 19 | 20 | ///method to decode 21 | 22 | 23 | - (id)initWithCoder:(NSCoder *)aDecoder 24 | { 25 | if ((self = [super init])) { 26 | self.text = [aDecoder decodeObjectForKey:@"Text"]; 27 | self.notes = [aDecoder decodeObjectForKey:@"Notes"]; 28 | self.priority = [aDecoder decodeObjectForKey:@"Priority"]; 29 | self.priorityToDisplay = [aDecoder decodeObjectForKey:@"PriorityToDisplay"]; 30 | self.checked = [aDecoder decodeBoolForKey:@"Checked"]; 31 | self.dueDate = [aDecoder decodeObjectForKey:@"DueDate"]; 32 | self.shouldRemind = [aDecoder decodeBoolForKey:@"ShouldRemind"]; 33 | self.itemId = [aDecoder decodeIntForKey:@"ItemID"]; 34 | } 35 | return self; 36 | } 37 | 38 | 39 | ///method to encode 40 | 41 | - (void)encodeWithCoder:(NSCoder *)aCoder 42 | { 43 | [aCoder encodeObject:self.text forKey:@"Text"]; 44 | [aCoder encodeObject:self.notes forKey:@"Notes"]; 45 | [aCoder encodeObject:self.priority forKey:@"Priority"]; 46 | [aCoder encodeObject:self.priorityToDisplay forKey:@"PriorityToDisplay"]; 47 | [aCoder encodeBool:self.checked forKey:@"Checked"]; 48 | [aCoder encodeObject:self.dueDate forKey:@"DueDate"]; 49 | [aCoder encodeBool:self.shouldRemind forKey:@"ShouldRemind"]; 50 | [aCoder encodeInt:self.itemId forKey:@"ItemID"]; 51 | } 52 | 53 | 54 | 55 | 56 | ///method that records whether an item is checked 57 | 58 | - (void)toggleChecked 59 | { 60 | self.checked = !self.checked; 61 | } 62 | 63 | 64 | ///We need to assign an id for each item. 65 | 66 | - (id)init 67 | { 68 | if (self = [super init]) { 69 | self.itemId = [DataModel nextChecklistItemId]; 70 | } 71 | return self; 72 | } 73 | 74 | 75 | 76 | ///We need to assign an id for each item so that we can easily identify. 77 | - (UILocalNotification *)notificationForThisItem 78 | { 79 | NSArray *allNotifications = [[UIApplication sharedApplication] scheduledLocalNotifications]; 80 | for (UILocalNotification *notification in allNotifications) { 81 | NSNumber *number = [notification.userInfo objectForKey:@"ItemID"]; 82 | if (number != nil && [number intValue] == self.itemId) { 83 | 84 | return notification; 85 | } 86 | } 87 | return nil; 88 | } 89 | 90 | 91 | ///We schedule notification here for the selected item. If there is any existing notification for this item, we remove them so that only latest alarm time will be fired. 92 | 93 | - (void)scheduleNotification 94 | { 95 | 96 | UILocalNotification *existingNotification = [self notificationForThisItem]; 97 | if (existingNotification != nil) { 98 | 99 | NSLog(@"Found an existing notification %@", existingNotification); 100 | 101 | [[UIApplication sharedApplication] cancelLocalNotification:[self notificationForThisItem]]; 102 | 103 | } 104 | 105 | 106 | 107 | if (self.shouldRemind && [self.dueDate compare:[NSDate date]] != NSOrderedAscending) { 108 | UILocalNotification *localNotification = [[UILocalNotification alloc] init]; 109 | localNotification.fireDate = self.dueDate; 110 | localNotification.timeZone = [NSTimeZone defaultTimeZone]; 111 | localNotification.alertBody = self.text; 112 | localNotification.soundName = UILocalNotificationDefaultSoundName; 113 | localNotification.userInfo = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:self.itemId] forKey:@"ItemID"]; 114 | 115 | 116 | [[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; 117 | 118 | NSLog(@"Scheduled notification %@ for itemId %d", localNotification, self.itemId); 119 | } 120 | } 121 | 122 | 123 | 124 | 125 | - (void)dealloc 126 | { 127 | UILocalNotification *existingNotification = [self notificationForThisItem]; 128 | if (existingNotification != nil) { 129 | // NSLog(@"Removing existing notification %@", existingNotification); 130 | [[UIApplication sharedApplication] cancelLocalNotification: 131 | existingNotification]; 132 | } 133 | } 134 | 135 | 136 | 137 | 138 | 139 | @end 140 | -------------------------------------------------------------------------------- /Task Ticker/Classes/UIPickerActionSheet/UIPickerActionSheet.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIPickerActionSheet.m 3 | // Version 0.1 4 | // 5 | // This code is distributed under the terms and conditions of the MIT license. 6 | // 7 | // Copyright (c) 2013 José Enrique Bolaños Gudiño 8 | // 9 | // Permission is hereby granted, free of charge, to any person obtaining a copy 10 | // of this software and associated documentation files (the "Software"), to deal 11 | // in the Software without restriction, including without limitation the rights 12 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | // copies of the Software, and to permit persons to whom the Software is 14 | // furnished to do so, subject to the following conditions: 15 | // 16 | // The above copyright notice and this permission notice shall be included in 17 | // all copies or substantial portions of the Software. 18 | // 19 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 25 | // THE SOFTWARE. 26 | // 27 | 28 | #import "UIPickerActionSheet.h" 29 | 30 | @interface UIPickerActionSheet () 31 | 32 | - (void)initSheetWithWidth:(CGFloat)aWidth; 33 | 34 | @end 35 | 36 | @implementation UIPickerActionSheet 37 | 38 | - (id)initForView:(UIView*)aView 39 | { 40 | if (self = [super init]) 41 | { 42 | self.containerView = aView; 43 | [self initSheetWithWidth:aView.bounds.size.width]; 44 | } 45 | return self; 46 | } 47 | 48 | - (void)initSheetWithWidth:(CGFloat)aWidth 49 | { 50 | UIActionSheet *sheet = [[UIActionSheet alloc] init]; 51 | 52 | UIToolbar *toolbar = [[UIToolbar alloc] 53 | initWithFrame:CGRectMake(0, 0, aWidth, 0)]; 54 | toolbar.barStyle = UIBarStyleBlackOpaque; 55 | [toolbar sizeToFit]; 56 | 57 | [toolbar setItems:@[ 58 | [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(pickerSheetCancel)], 59 | [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil], 60 | [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(pickerSheetDone)] 61 | ]]; 62 | 63 | UIPickerView *picker = [[UIPickerView alloc] 64 | initWithFrame:CGRectMake(0, toolbar.bounds.size.height, aWidth, 0)]; 65 | picker.showsSelectionIndicator = YES; 66 | picker.delegate = self; 67 | 68 | [sheet addSubview:toolbar]; 69 | [sheet addSubview:picker]; 70 | 71 | self.sheet = sheet; 72 | self.picker = picker; 73 | } 74 | 75 | - (void)show:(NSArray*)aItems 76 | { 77 | self.items = aItems; 78 | 79 | // Do not show if items are invalid... 80 | if (!self.items || self.items.count <= 0) 81 | return; 82 | 83 | [self.sheet showInView:self.containerView]; 84 | 85 | // XXX: Kinda hacky, but seems to be the only way to make it display correctly. 86 | [self.sheet 87 | setBounds:CGRectMake(0, 0, 88 | self.containerView.frame.size.width, 89 | self.sheet.frame.size.height + 478.0)]; 90 | 91 | // Reload and select first item 92 | [self.picker reloadComponent:0]; 93 | [self.picker selectRow:0 inComponent:0 animated:NO]; 94 | [self.picker.delegate pickerView:self.picker didSelectRow:0 inComponent:0]; 95 | } 96 | 97 | - (int)numberOfComponentsInPickerView:(UIPickerView*)aPickerView 98 | { 99 | return 1; 100 | } 101 | 102 | - (int)pickerView:(UIPickerView*)aPickerView numberOfRowsInComponent:(NSInteger)aComponent 103 | { 104 | return self.items.count; 105 | } 106 | 107 | - (NSString*)pickerView:(UIPickerView*)aPickerView titleForRow:(NSInteger)aRow forComponent:(NSInteger)aComponent 108 | { 109 | id item = [self.items objectAtIndex:aRow]; 110 | return [item description]; 111 | } 112 | 113 | - (void)pickerView:(UIPickerView*)aPickerView didSelectRow:(NSInteger)aRow inComponent:(NSInteger)aComponent 114 | { 115 | self.selectedItem = [self.items objectAtIndex:aRow]; 116 | } 117 | 118 | - (void)pickerSheetCancel 119 | { 120 | [self.sheet dismissWithClickedButtonIndex:0 animated:YES]; 121 | if (self.delegate && [self.delegate respondsToSelector:@selector(pickerActionSheetDidCancel:)]) 122 | [self.delegate pickerActionSheetDidCancel:self]; 123 | } 124 | 125 | - (void)pickerSheetDone 126 | { 127 | [self.sheet dismissWithClickedButtonIndex:0 animated:YES]; 128 | if (self.delegate && [self.delegate respondsToSelector:@selector(pickerActionSheet:didSelectItem:)]) 129 | [self.delegate pickerActionSheet:self didSelectItem:self.selectedItem]; 130 | } 131 | 132 | @end 133 | -------------------------------------------------------------------------------- /Task Ticker/Classes/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // Checklist 4 | // 5 | // Created by Partho Biswas on 8/7/13. 6 | // Copyright (c) 2013 Partho Biswas. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | @implementation AppDelegate 12 | 13 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 14 | { 15 | // Override point for customization after application launch. 16 | 17 | 18 | /// once application finished launching, we call customizeAppearance method. customizeAppearance is responsible to theme the app 19 | 20 | //[self customizeAppearance]; 21 | 22 | 23 | return YES; 24 | } 25 | 26 | 27 | /// customizing navigation bar and its items 28 | 29 | -(void)customizeAppearance 30 | { 31 | ///The UINavigationBar class implements a control for navigating hierarchical content. It’s a bar, typically displayed at the top of the screen, containing buttons for navigating up and down a hierarchy. The primary properties are a left (back) button, a center title, and an optional right button. You can specify custom views for each of these. You can modify the appearance of the bar using the barStyle, tintColor, and translucent properties. These properties affect the visual appearance of the bar itself but they also affect the way buttons are displayed in the bar. For example, if you set the translucent property to YES, any buttons in the bar are also made partially opaque. 32 | 33 | ///Customize navigation menu bar 34 | 35 | UIImage* navigationBar = [UIImage imageNamed:@"blue-menu-bar.png"]; 36 | [[UINavigationBar appearance] setBackgroundImage:navigationBar forBarMetrics:UIBarMetricsDefault]; 37 | 38 | 39 | 40 | ///A bar button item is a button specialized for placement on a UIToolbar or UINavigationBar object. It inherits basic button behavior from its abstract superclass, UIBarItem. The UIBarButtonItem defines additional initialization methods and properties for use on toolbars and navigation bars. 41 | 42 | ///Customize back button 43 | 44 | UIImage *backButton = [[UIImage imageNamed:@"blue-back-button.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 14, 0, 4)]; 45 | [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButton forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 46 | 47 | ///Customize bar button 48 | 49 | UIImage *barButton = [[UIImage imageNamed:@"blue-bar-button.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(-1, 5, -1, 5)]; 50 | [[UIBarButtonItem appearance] setBackgroundImage:barButton forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 51 | 52 | ///Following method customize the uinavigation bar title. make changes here if you want to change to another style. 53 | 54 | [[UINavigationBar appearance] setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys: 55 | [UIColor colorWithRed:245.0/255.0 green:245.0/255.0 blue:245.0/255.0 alpha:1.0], UITextAttributeTextColor, 56 | [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8],UITextAttributeTextShadowColor, 57 | [NSValue valueWithUIOffset:UIOffsetMake(0, 3)],UITextAttributeTextShadowOffset, 58 | [UIFont fontWithName:@"HelveticaNeue-CondensedBlack" size:20.0], UITextAttributeFont, nil]]; 59 | 60 | 61 | } 62 | 63 | 64 | - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification 65 | { 66 | 67 | } 68 | 69 | 70 | - (void)applicationWillResignActive:(UIApplication *)application 71 | { 72 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 73 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 74 | } 75 | 76 | - (void)applicationDidEnterBackground:(UIApplication *)application 77 | { 78 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 79 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 80 | } 81 | 82 | 83 | 84 | - (void)applicationWillEnterForeground:(UIApplication *)application 85 | { 86 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 87 | } 88 | 89 | - (void)applicationDidBecomeActive:(UIApplication *)application 90 | { 91 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 92 | } 93 | 94 | - (void)applicationWillTerminate:(UIApplication *)application 95 | { 96 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 97 | } 98 | 99 | @end 100 | -------------------------------------------------------------------------------- /Task Ticker/Classes/DALinedTextView/DALinedTextView.m: -------------------------------------------------------------------------------- 1 | // 2 | // DALinedTextView.m 3 | // DALinedTextView 4 | // 5 | // Created by Daniel Amitay on 5/12/13. 6 | // Copyright (c) 2013 Daniel Amitay. All rights reserved. 7 | // 8 | 9 | #import "DALinedTextView.h" 10 | 11 | #define DEFAULT_HORIZONTAL_COLOR [UIColor colorWithRed:0.722f green:0.910f blue:0.980f alpha:0.7f] 12 | #define DEFAULT_VERTICAL_COLOR [UIColor colorWithRed:0.957f green:0.416f blue:0.365f alpha:0.7f] 13 | #define DEFAULT_MARGINS UIEdgeInsetsMake(10.0f, 10.0f, 0.0f, 10.0f) 14 | 15 | @interface DALinedTextView () 16 | 17 | @property (nonatomic, assign) UIView *webDocumentView; 18 | 19 | @end 20 | 21 | @implementation DALinedTextView 22 | 23 | + (void)initialize 24 | { 25 | if (self == [DALinedTextView class]) 26 | { 27 | id appearance = [self appearance]; 28 | [appearance setContentMode:UIViewContentModeRedraw]; 29 | [appearance setHorizontalLineColor:DEFAULT_HORIZONTAL_COLOR]; 30 | [appearance setVerticalLineColor:DEFAULT_VERTICAL_COLOR]; 31 | [appearance setMargins:DEFAULT_MARGINS]; 32 | } 33 | } 34 | 35 | #pragma mark - Superclass overrides 36 | 37 | - (id)initWithFrame:(CGRect)frame 38 | { 39 | self = [super initWithFrame:frame]; 40 | if (self) 41 | { 42 | // Recycling the font is necessary 43 | // For proper line/text alignment 44 | UIFont *font = self.font; 45 | self.font = nil; 46 | self.font = font; 47 | 48 | // We need to grab the underlying webView 49 | // And resize it along with the margins 50 | self.webDocumentView = [self.subviews objectAtIndex:0]; 51 | self.margins = [self.class.appearance margins]; 52 | } 53 | return self; 54 | } 55 | 56 | - (void)setContentSize:(CGSize)contentSize 57 | { 58 | contentSize = (CGSize) { 59 | .width = contentSize.width - self.margins.left - self.margins.right, 60 | .height = MAX(contentSize.height, self.bounds.size.height - self.margins.top) 61 | }; 62 | self.webDocumentView.frame = (CGRect) { 63 | .origin = self.webDocumentView.frame.origin, 64 | .size = contentSize 65 | }; 66 | [super setContentSize:contentSize]; 67 | } 68 | 69 | - (void)drawRect:(CGRect)rect 70 | { 71 | CGContextRef context = UIGraphicsGetCurrentContext(); 72 | CGContextSetLineWidth(context, 1.0f); 73 | 74 | if (self.horizontalLineColor) 75 | { 76 | CGContextBeginPath(context); 77 | CGContextSetStrokeColorWithColor(context, self.horizontalLineColor.CGColor); 78 | 79 | // Create un-mutated floats outside of the for loop. 80 | // Reduces memory access. 81 | CGFloat baseOffset = 7.0f + self.font.descender; 82 | CGFloat screenScale = [UIScreen mainScreen].scale; 83 | CGFloat boundsX = self.bounds.origin.x; 84 | CGFloat boundsWidth = self.bounds.size.width; 85 | 86 | // Only draw lines that are visible on the screen. 87 | // (As opposed to throughout the entire view's contents) 88 | NSInteger firstVisibleLine = MAX(1, (self.contentOffset.y / self.font.lineHeight)); 89 | NSInteger lastVisibleLine = ceilf((self.contentOffset.y + self.bounds.size.height) / self.font.lineHeight); 90 | for (NSInteger line = firstVisibleLine; line <= lastVisibleLine; ++line) 91 | { 92 | CGFloat linePointY = (baseOffset + (self.font.lineHeight * line)); 93 | // Rounding the point to the nearest pixel. 94 | // Greatly reduces drawing time. 95 | CGFloat roundedLinePointY = roundf(linePointY * screenScale) / screenScale; 96 | CGContextMoveToPoint(context, boundsX, roundedLinePointY); 97 | CGContextAddLineToPoint(context, boundsWidth, roundedLinePointY); 98 | } 99 | CGContextClosePath(context); 100 | CGContextStrokePath(context); 101 | } 102 | 103 | if (self.verticalLineColor) 104 | { 105 | CGContextBeginPath(context); 106 | CGContextSetStrokeColorWithColor(context, self.verticalLineColor.CGColor); 107 | CGContextMoveToPoint(context, -1.0f, self.contentOffset.y); 108 | CGContextAddLineToPoint(context, -1.0f, self.contentOffset.y + self.bounds.size.height); 109 | CGContextClosePath(context); 110 | CGContextStrokePath(context); 111 | } 112 | } 113 | 114 | - (void)setFont:(UIFont *)font 115 | { 116 | [super setFont:font]; 117 | [self setNeedsDisplay]; 118 | } 119 | 120 | #pragma mark - Property methods 121 | 122 | - (void)setHorizontalLineColor:(UIColor *)horizontalLineColor 123 | { 124 | _horizontalLineColor = horizontalLineColor; 125 | [self setNeedsDisplay]; 126 | } 127 | 128 | - (void)setVerticalLineColor:(UIColor *)verticalLineColor 129 | { 130 | _verticalLineColor = verticalLineColor; 131 | [self setNeedsDisplay]; 132 | } 133 | 134 | - (void)setMargins:(UIEdgeInsets)margins 135 | { 136 | _margins = margins; 137 | self.contentInset = (UIEdgeInsets) { 138 | .top = self.margins.top, 139 | .left = self.margins.left, 140 | .bottom = self.margins.bottom, 141 | .right = self.margins.right - self.margins.left 142 | }; 143 | [self setContentSize:self.contentSize]; 144 | } 145 | 146 | @end 147 | -------------------------------------------------------------------------------- /Task Ticker/Classes/AddItemViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // Checklist 4 | // 5 | // Created by Partho Biswas on 8/7/13. 6 | // Copyright (c) 2013 Partho Biswas. All rights reserved. 7 | // 8 | 9 | #import "AddItemViewController.h" 10 | #import "ChecklistItem.h" 11 | 12 | @interface AddItemViewController () 13 | 14 | @end 15 | 16 | @implementation AddItemViewController { 17 | NSString *text; 18 | NSString *notes; 19 | NSString *priority; 20 | NSString *priorityToDisplay; 21 | BOOL shouldRemind; 22 | NSDate *dueDate; 23 | } 24 | 25 | 26 | ///synthesize properties 27 | 28 | @synthesize textField, notesField, doneBarButton; 29 | @synthesize delegate; 30 | @synthesize itemToEdit; 31 | @synthesize switchControl; 32 | @synthesize dueDateLabel, priorityLabel, priorityLabelToDisplay; 33 | 34 | 35 | 36 | ///we display current date and time when we present the additemvewcontroller to user 37 | - (id)initWithCoder:(NSCoder *)aDecoder 38 | { 39 | if ((self = [super initWithCoder:aDecoder])) { 40 | text = @""; 41 | shouldRemind = NO; 42 | dueDate = [NSDate date]; 43 | } 44 | return self; 45 | } 46 | 47 | 48 | /// NSdate formetter to fprmat date and update the label when user picked different date 49 | - (void)updateDueDateLabel 50 | { 51 | NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 52 | [formatter setDateStyle:NSDateFormatterFullStyle]; 53 | [formatter setTimeStyle:NSDateFormatterShortStyle]; 54 | self.dueDateLabel.text = [formatter stringFromDate:dueDate]; 55 | } 56 | 57 | 58 | 59 | ///we enable done bar button only when text field length is more than one character. 60 | - (void)updateDoneBarButton 61 | { 62 | self.doneBarButton.enabled = ([text length] > 0); 63 | } 64 | 65 | 66 | - (void)viewDidLoad 67 | { 68 | [super viewDidLoad]; 69 | 70 | 71 | /// custom background view with our own image 72 | 73 | self.tableView.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"blue-background.jpg"]]; 74 | 75 | 76 | 77 | ///we check whether it is editing mode or adding mode, then set the title and fields appropriately. 78 | 79 | if (self.itemToEdit != nil) { 80 | self.title = @"Edit Item"; 81 | 82 | } else 83 | 84 | self.title = @"Add Item"; 85 | self.textField.text = text; 86 | self.notesField.text = notes; 87 | self.priorityLabel.text = priority; 88 | self.priorityLabelToDisplay.text = priorityToDisplay; 89 | self.switchControl.on = shouldRemind; 90 | [self updateDoneBarButton]; 91 | [self updateDueDateLabel]; 92 | 93 | } 94 | 95 | 96 | 97 | - (void)viewWillAppear:(BOOL)animated 98 | { 99 | [super viewWillAppear:animated]; 100 | 101 | if (self.title != NSLocalizedString(@"Edit Item", nil)) { 102 | [self.textField becomeFirstResponder]; 103 | self.priorityLabelToDisplay.text = @"None"; 104 | self.priorityLabel.text = @""; 105 | 106 | }else 107 | [self.textField resignFirstResponder]; 108 | } 109 | 110 | 111 | 112 | 113 | 114 | /// method to call addItemViewControllerDidCancel method when cancel button pressed 115 | 116 | - (IBAction)cancel 117 | { 118 | [self.delegate addItemViewControllerDidCancel:self]; 119 | } 120 | 121 | 122 | /// method to call didFinishAddingItem method when Done button pressed 123 | 124 | 125 | - (IBAction)done 126 | { 127 | if (self.itemToEdit == nil) { 128 | ChecklistItem *item = [[ChecklistItem alloc] init]; 129 | item.text = self.textField.text; 130 | item.notes = self.notesField.text; 131 | item.checked = NO; 132 | item.priority = self.priorityLabel.text; 133 | item.priorityToDisplay = self.priorityLabelToDisplay.text; 134 | item.checked = NO; 135 | item.shouldRemind = self.switchControl.on; 136 | item.dueDate = dueDate; 137 | [item scheduleNotification]; 138 | [self.delegate addItemViewController:self didFinishAddingItem:item]; 139 | } else { 140 | self.itemToEdit.text = self.textField.text; 141 | self.itemToEdit.notes = self.notesField.text; 142 | self.itemToEdit.priority = self.priorityLabel.text; 143 | self.itemToEdit.priorityToDisplay = self.priorityLabelToDisplay.text; 144 | self.itemToEdit.shouldRemind = self.switchControl.on; 145 | self.itemToEdit.dueDate = dueDate; 146 | [self.itemToEdit scheduleNotification]; 147 | [self.delegate addItemViewController:self didFinishEditingItem:self.itemToEdit]; 148 | } 149 | } 150 | 151 | 152 | 153 | ///we take not when the user tap on the UISwitch and we create local notification only if it is turned on 154 | - (IBAction)switchChanged:(UISwitch *)sender 155 | { 156 | shouldRemind = sender.on; 157 | 158 | 159 | } 160 | 161 | 162 | 163 | ///optionally we can dismiss keyboard if the user starts to scroll the tableview 164 | 165 | - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 166 | { 167 | [self.textField resignFirstResponder]; 168 | [self.notesField resignFirstResponder]; 169 | 170 | } 171 | 172 | 173 | 174 | 175 | ///to prevent the uitableview cell turns blue when user taps on it 176 | 177 | - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath 178 | { 179 | if (indexPath.row == 1) { 180 | return indexPath; 181 | } else { 182 | return nil; 183 | } 184 | } 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | - (void)didReceiveMemoryWarning 193 | { 194 | [super didReceiveMemoryWarning]; 195 | 196 | // Dispose of any resources that can be recreated. 197 | } 198 | 199 | ///release te memory by setting nil to these fields as we no loner need them 200 | 201 | - (void)viewDidUnload 202 | { 203 | [self setTextField:nil]; 204 | [self setNotesField:nil]; 205 | [self setDoneBarButton:nil]; 206 | [self setSwitchControl:nil]; 207 | [self setDueDateLabel:nil]; 208 | [self setPriorityLabel:nil]; 209 | [self setPriorityLabelToDisplay:nil]; 210 | [super viewDidUnload]; 211 | } 212 | 213 | 214 | ///we present stored item if the user editing an item 215 | 216 | - (void)setItemToEdit:(ChecklistItem *)newItem 217 | { 218 | if (itemToEdit != newItem) { 219 | itemToEdit = newItem; 220 | text = itemToEdit.text; 221 | notes = itemToEdit.notes; 222 | priority = itemToEdit.priority; 223 | priorityToDisplay = itemToEdit.priorityToDisplay; 224 | shouldRemind = itemToEdit.shouldRemind; 225 | dueDate = itemToEdit.dueDate; 226 | } 227 | } 228 | 229 | 230 | 231 | 232 | 233 | /// method to check whether the text field has any text in it. if user type a text then it enables the Done bar button. otherwise it will disable the done bar button. therefore the user not able to press the button. this ensures that empty text are not delegated to checklistviewcontroller 234 | 235 | #pragma mark - Table view data source 236 | 237 | - (BOOL)textField:(UITextField *)theTextField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 238 | { 239 | NSString *newText = [theTextField.text stringByReplacingCharactersInRange:range withString:string]; 240 | self.doneBarButton.enabled = ([newText length] > 0); 241 | return YES; 242 | } 243 | 244 | - (BOOL)notesField:(UITextView *)theNotesField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 245 | { 246 | NSString *newText = [theNotesField.text stringByReplacingCharactersInRange:range withString:string]; 247 | self.doneBarButton.enabled = ([newText length] > 0); 248 | return YES; 249 | } 250 | 251 | 252 | 253 | ///we use prepare for segue method to display date picker controller 254 | 255 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 256 | { 257 | if ([segue.identifier isEqualToString:@"PickDate"]) { 258 | DatePickerViewController *controller = segue.destinationViewController; 259 | controller.delegate = self; 260 | controller.date = dueDate; 261 | } 262 | } 263 | 264 | 265 | 266 | ///we use delegate method from date view controller. We don't store any new info if the user press cancel button 267 | - (void)datePickerDidCancel:(DatePickerViewController *)picker 268 | { 269 | [self dismissViewControllerAnimated:YES completion:nil]; 270 | } 271 | 272 | 273 | ///we use delegate method from date view controller. We store the new date when the user press done button 274 | 275 | - (void)datePicker:(DatePickerViewController *)picker didPickDate:(NSDate *)date 276 | { 277 | dueDate = date; 278 | [self updateDueDateLabel]; 279 | [self dismissViewControllerAnimated:YES completion:nil]; 280 | } 281 | 282 | 283 | 284 | ///configure what to display in picker action sheet when the user tap on priority label 285 | 286 | - (IBAction)priority:(id)sender 287 | { 288 | 289 | self.pickerActionSheet = [[UIPickerActionSheet alloc] initForView:self.view]; 290 | self.pickerActionSheet.delegate = self; 291 | 292 | NSArray *items = @[@"None", @"Low", @"Medium", @"High"]; 293 | [self.pickerActionSheet show:items]; 294 | 295 | 296 | 297 | } 298 | 299 | 300 | 301 | ///we don't make any changes if the user didn't select pick any priority 302 | 303 | - (void)pickerActionSheetDidCancel:(UIPickerActionSheet*)aPickerActionSheet 304 | { 305 | // User cancelled 306 | } 307 | 308 | 309 | 310 | ///we update the priority labels according user to user selection in picker list 311 | 312 | - (void)pickerActionSheet:(UIPickerActionSheet*)aPickerActionSheet didSelectItem:(id)aItem 313 | { 314 | 315 | NSString *string = (NSString*)aItem; 316 | 317 | if ([string isEqualToString:@"None"]) { 318 | 319 | self.priorityLabelToDisplay.text = @"None"; 320 | 321 | self.priorityLabel.text = @""; 322 | 323 | } if ([string isEqualToString:@"Low"]) { 324 | 325 | self.priorityLabelToDisplay.text = @"Low"; 326 | 327 | self.priorityLabel.text = @"!"; 328 | 329 | } if ([string isEqualToString:@"Medium"]) { 330 | 331 | self.priorityLabelToDisplay.text = @"Medium"; 332 | 333 | self.priorityLabel.text = @"!!"; 334 | 335 | } if ([string isEqualToString:@"High"]) { 336 | 337 | self.priorityLabelToDisplay.text = @"High"; 338 | 339 | self.priorityLabel.text = @"!!!"; 340 | 341 | } 342 | 343 | } 344 | 345 | 346 | 347 | 348 | @end 349 | -------------------------------------------------------------------------------- /Task Ticker/Classes/ChecklistViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // Checklist 4 | // 5 | // Created by Partho Biswas on 8/7/13. 6 | // Copyright (c) 2013 Partho Biswas. All rights reserved. 7 | // 8 | 9 | #import "ChecklistViewController.h" 10 | 11 | @interface ChecklistViewController () 12 | 13 | @end 14 | 15 | #import "ChecklistItem.h" 16 | 17 | 18 | @implementation ChecklistViewController { 19 | 20 | NSMutableArray *items; 21 | 22 | 23 | } 24 | 25 | ///synthesize the table view so that we can assign the banner view later where to show 26 | 27 | @synthesize TableView; 28 | 29 | 30 | ///synthesize the activitycontroller 31 | @synthesize activityViewController; 32 | 33 | ///synthesize ilteredtabledata, searchbar and filterstatus 34 | @synthesize filteredTableData; 35 | @synthesize searchBar; 36 | @synthesize isFiltered; 37 | 38 | 39 | - (void)viewDidLoad 40 | { 41 | [super viewDidLoad]; 42 | 43 | ///title of view controller 44 | 45 | self.title = @"Checklist"; 46 | 47 | ///table view background with our own custom image 48 | 49 | self.tableView.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"blue-background.jpg"]]; 50 | 51 | ///initialize pull to refresh control 52 | 53 | [self.refreshControl 54 | addTarget:self 55 | action:@selector(refresh) 56 | forControlEvents:UIControlEventValueChanged 57 | ]; 58 | 59 | /// initialize banner view for iAd 60 | 61 | // bannerView = [[ADBannerView alloc] initWithFrame:CGRectZero]; 62 | // [bannerView setAutoresizingMask:UIViewAutoresizingFlexibleWidth]; 63 | // bannerView.delegate = self; 64 | 65 | 66 | /// configure left navigation bar button item as edit button. This edit button has a mechanism of changing its title to "Done" when it pressed 67 | 68 | self.navigationItem.leftBarButtonItem = self.editButtonItem; 69 | 70 | 71 | 72 | ///create add and share buttons to be right bar button of navigation controllers 73 | 74 | UIBarButtonItem *addButton = [[UIBarButtonItem alloc] 75 | initWithBarButtonSystemItem:UIBarButtonSystemItemAdd 76 | target:self 77 | action:@selector(refresh)]; 78 | 79 | UIBarButtonItem *shareButton = [[UIBarButtonItem alloc] 80 | initWithBarButtonSystemItem:UIBarButtonSystemItemAction 81 | target:self 82 | action:@selector(shareButtonClicked:)]; 83 | 84 | 85 | self.navigationItem.rightBarButtonItems = 86 | [NSArray arrayWithObjects:addButton, shareButton, nil]; 87 | 88 | } 89 | 90 | 91 | 92 | 93 | 94 | ///Creates a list of path strings for the specified directories in the specified domains. The list is in the order in which you should search the directories. If expandTilde is YES, tildes are expanded as described in stringByExpandingTildeInPath. 95 | ///we define the plist shall be saved in our own directory 96 | 97 | - (NSString *)documentsDirectory 98 | { 99 | NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 100 | NSString *documentsDirectory = [paths objectAtIndex:0]; 101 | return documentsDirectory; 102 | } 103 | 104 | ///Returns a new string made by appending to the receiver a given string. Note that this method only works with file paths (not, for example, string representations of URLs). 105 | ///we save the plist in the documents director of our application 106 | 107 | - (NSString *)dataFilePath 108 | { 109 | return [[self documentsDirectory] stringByAppendingPathComponent:@"Checklists.plist"]; 110 | } 111 | 112 | 113 | 114 | ///Method to save the data to plist 115 | 116 | - (void)saveChecklistItems 117 | { 118 | NSMutableData *data = [[NSMutableData alloc] init]; 119 | NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 120 | [archiver encodeObject:items forKey:@"ChecklistItems"]; 121 | [archiver finishEncoding]; 122 | [data writeToFile:[self dataFilePath] atomically:YES]; 123 | } 124 | 125 | 126 | ///decode the plist 127 | - (id)initWithCoder:(NSCoder *)aDecoder 128 | { 129 | if ((self = [super initWithCoder:aDecoder])) { 130 | [self loadChecklistItems]; 131 | } 132 | return self; 133 | } 134 | 135 | 136 | 137 | ///we load decoded data to tableview 138 | - (void)loadChecklistItems 139 | { 140 | NSString *path = [self dataFilePath]; 141 | if ([[NSFileManager defaultManager] fileExistsAtPath:path]) 142 | { 143 | NSData *data = [[NSData alloc] initWithContentsOfFile:path]; 144 | NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; 145 | items = [unarchiver decodeObjectForKey:@"ChecklistItems"]; 146 | [unarchiver finishDecoding]; 147 | } 148 | else 149 | { 150 | items = [[NSMutableArray alloc] initWithCapacity:20]; 151 | } 152 | } 153 | 154 | 155 | 156 | 157 | 158 | ///Tells the data source to return the number of rows in a given section of a table view. (required) 159 | /// Number of rows in tableview. we leave it to count it itself and we don't limit it. 160 | ///we check the filter status and then count the rows accordingly 161 | 162 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:( NSInteger)section 163 | { 164 | 165 | int rowCount; 166 | if(self.isFiltered) 167 | rowCount = filteredTableData.count; 168 | else 169 | rowCount = items.count; 170 | 171 | return rowCount; 172 | // return [items count]; 173 | } 174 | 175 | 176 | ///Asks the data source for a cell to insert in a particular location of the table view. (required) 177 | /// here we configure uitableview cell. this will be reused for te whole tableview 178 | ///we supply tableview cell for search table as well 179 | 180 | 181 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 182 | { 183 | static NSString *CellIdentifier = @"ChecklistItem"; 184 | 185 | UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 186 | 187 | 188 | if (cell == nil) 189 | 190 | cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 191 | 192 | ChecklistItem* item; 193 | 194 | if(isFiltered) 195 | item = [filteredTableData objectAtIndex:indexPath.row]; 196 | else 197 | item = [items objectAtIndex:indexPath.row]; 198 | 199 | 200 | // ChecklistItem *item = [items objectAtIndex:indexPath.row]; 201 | 202 | [self configureTextForCell:cell withChecklistItem:item]; 203 | [self configureCheckmarkForCell:cell withChecklistItem:item]; 204 | 205 | return cell; 206 | 207 | } 208 | 209 | ///We use NSPrediction method to search. this will search in both Text and Notes 210 | 211 | -(void)searchBar:(UISearchBar*)searchBar textDidChange:(NSString*)text 212 | { 213 | if(text.length == 0) 214 | { 215 | isFiltered = FALSE; 216 | [self.tableView reloadData]; 217 | 218 | } 219 | else 220 | { 221 | isFiltered = true; 222 | filteredTableData = [[NSMutableArray alloc] init]; 223 | 224 | for (ChecklistItem* item in items) 225 | { 226 | NSRange nameRange = [item.text rangeOfString:text options:NSCaseInsensitiveSearch]; 227 | NSRange descriptionRange = [item.notes rangeOfString:text options:NSCaseInsensitiveSearch]; 228 | if(nameRange.location != NSNotFound || descriptionRange.location != NSNotFound) 229 | { 230 | [filteredTableData addObject:item]; 231 | 232 | } 233 | } 234 | } 235 | 236 | [self.tableView reloadData]; 237 | 238 | 239 | } 240 | 241 | 242 | 243 | ///to dismiss keyboard 244 | - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar 245 | { 246 | [self resignFirstResponder]; 247 | } 248 | 249 | 250 | 251 | 252 | ///we don't show the cancel button of search bar 253 | - (void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller 254 | { 255 | controller.searchBar.showsCancelButton = NO; 256 | } 257 | 258 | 259 | 260 | 261 | ///Tells the delegate that the user tapped the accessory (disclosure) view associated with a given row. 262 | /// we declare the touch event of accessory button of uitableview cell. When user tap on the accessory button, it should bring editing mode 263 | 264 | - (IBAction)accessoryButtonTapped:(id)sender event:(id)event 265 | { 266 | NSSet *touches = [event allTouches]; 267 | UITouch *touch = [touches anyObject]; 268 | CGPoint currentTouchPosition = [touch locationInView:self.tableView]; 269 | NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint: currentTouchPosition]; 270 | if (indexPath != nil) 271 | 272 | { 273 | [self tableView: self.tableView accessoryButtonTappedForRowWithIndexPath: indexPath]; 274 | } 275 | } 276 | 277 | 278 | /// following method configures uitableviewcell when user taps on it. It also toggles when tap again 279 | 280 | - (void)configureCheckmarkForCell:(UITableViewCell *)cell withChecklistItem:(ChecklistItem *)item 281 | { 282 | 283 | 284 | { 285 | if (item.checked) { 286 | 287 | UIButton *checkBox = (UIButton *)[cell viewWithTag:1503]; 288 | checkBox.hidden=FALSE; 289 | 290 | 291 | 292 | UILabel *label = (UILabel *)[cell viewWithTag:1000]; 293 | label.alpha = 0.4; 294 | 295 | UILabel *notesLabel = (UILabel *)[cell viewWithTag:1500]; 296 | notesLabel.alpha = 0.2; 297 | 298 | UIButton *accesoorybutton = (UIButton *)[cell viewWithTag:1005]; 299 | accesoorybutton.hidden=TRUE; 300 | 301 | 302 | UILabel *dueDateLabel = (UILabel *)[cell viewWithTag:1600]; 303 | dueDateLabel.alpha = 0.4; 304 | 305 | UILabel *priorityLabel = (UILabel *)[cell viewWithTag:1200]; 306 | priorityLabel.alpha = 0.4; 307 | 308 | 309 | 310 | 311 | } else { 312 | 313 | 314 | UIButton *checkBox = (UIButton *)[cell viewWithTag:1503]; 315 | checkBox.hidden=TRUE; 316 | 317 | 318 | UILabel *label = (UILabel *)[cell viewWithTag:1000]; 319 | label.alpha = 1.0; 320 | 321 | 322 | UILabel *notesLabel = (UILabel *)[cell viewWithTag:1500]; 323 | notesLabel.alpha = 1.0; 324 | 325 | UIButton *accesoorybutton = (UIButton *)[cell viewWithTag:1005]; 326 | accesoorybutton.hidden=FALSE; 327 | 328 | UILabel *dueDateLabel = (UILabel *)[cell viewWithTag:1600]; 329 | dueDateLabel.alpha = 1.0; 330 | 331 | UILabel *priorityLabel = (UILabel *)[cell viewWithTag:1200]; 332 | priorityLabel.alpha = 1.0; 333 | 334 | } 335 | 336 | } 337 | 338 | 339 | UILabel *notesLabel = (UILabel *)[cell viewWithTag:1500]; 340 | notesLabel.text = item.notes; 341 | 342 | 343 | if (notesLabel.text == nil) { 344 | 345 | 346 | 347 | 348 | } 349 | } 350 | 351 | 352 | 353 | ///Set background of uitable view cell with our own custom image. we also set the seperator style between cell to none 354 | 355 | - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 356 | 357 | cell.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"list-item-bg.png"]]; 358 | 359 | [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone]; 360 | 361 | } 362 | 363 | ///The method allows the delegate to specify rows with varying heights. If this method is implemented, the value it returns overrides the value specified for the rowHeight property of UITableView for the given row. 364 | /// height of uitable view cell which overrides interface builder 365 | 366 | - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 367 | { 368 | return 53; 369 | } 370 | 371 | 372 | 373 | /// following method configures uitableviewcell text when user adds a new item 374 | 375 | - (void)configureTextForCell:(UITableViewCell *)cell withChecklistItem:(ChecklistItem *)item 376 | { 377 | 378 | UILabel *label = (UILabel *)[cell viewWithTag:1000]; 379 | label.text = item.text; 380 | 381 | UILabel *labelwithoutnotes = (UILabel *)[cell viewWithTag:999]; 382 | labelwithoutnotes.text = item.text; 383 | 384 | UILabel *notesLabel = (UILabel *)[cell viewWithTag:1500]; 385 | notesLabel.text = item.notes; 386 | 387 | 388 | UILabel *priorityLabel = (UILabel *)[cell viewWithTag:1200]; 389 | priorityLabel.text = item.priority; 390 | 391 | 392 | if (item.shouldRemind == YES) { 393 | 394 | UILabel *dueDateLabel = (UILabel *)[cell viewWithTag:1600]; 395 | NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 396 | [formatter setDateStyle:NSDateFormatterShortStyle]; 397 | [formatter setTimeStyle:NSDateFormatterShortStyle]; 398 | dueDateLabel.text = [formatter stringFromDate:item.dueDate]; 399 | 400 | } else 401 | { 402 | UILabel *dueDateLabel = (UILabel *)[cell viewWithTag:1600]; 403 | dueDateLabel.text = nil; 404 | 405 | } 406 | 407 | } 408 | 409 | ///The delegate handles selections in this method. One of the things it can do is exclusively assign the check-mark image (UITableViewCellAccessoryCheckmark) to one row in a section (radio-list style). This method isn’t called when the editing property of the table is set to YES (that is, the table view is in editing mode) 410 | ///when the user tap on the particular cell, we treat it as the item is completed and we call cofigurecheckmarkforcell method to display checkmark and update plist. 411 | 412 | - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath 413 | { 414 | UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 415 | 416 | ChecklistItem* item; 417 | 418 | if(isFiltered) 419 | { 420 | item = [filteredTableData objectAtIndex:indexPath.row]; 421 | } 422 | else 423 | { 424 | item = [items objectAtIndex:indexPath.row]; 425 | } 426 | 427 | // ChecklistItem *item = [items objectAtIndex:indexPath.row]; 428 | [item toggleChecked]; 429 | [self configureCheckmarkForCell:cell withChecklistItem:item]; 430 | [self saveChecklistItems]; 431 | 432 | } 433 | 434 | ///A swipe motion across a cell does not cause the display of a Delete button unless the table view'€™s data source implements the tableView:commitEditingStyle:forRowAtIndexPath: method. 435 | ///When users tap the insertion (green plus) control or Delete button associated with a UITableViewCell object in the table view, the table view sends this message to the data source, asking it to commit the change. (If the user taps the deletion (red minus) control, the table view then displays the Delete button to get confirmation.) The data source commits the insertion or deletion by invoking the UITableView methods insertRowsAtIndexPaths:withRowAnimation: or deleteRowsAtIndexPaths:withRowAnimation:, as appropriate. 436 | 437 | ///when user swip left to right or right to left, table view enters into editing mode and prepares to delete the data from table view. once user deleted, we remove that particular item from plist. 438 | 439 | - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 440 | { 441 | [items removeObjectAtIndex:indexPath.row]; 442 | [self saveChecklistItems]; 443 | NSArray *indexPaths = [NSArray arrayWithObject:indexPath]; 444 | [tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationLeft]; 445 | } 446 | 447 | 448 | 449 | 450 | ///The presenting view controller is responsible for dismissing the view controller it presented. If you call this method on the presented view controller itself, it automatically forwards the message to the presenting view controller. 451 | ///dismiss view controller presented 452 | 453 | - (void)addItemViewControllerDidCancel:(AddItemViewController *)controller 454 | { 455 | [self dismissViewControllerAnimated:YES completion:nil]; 456 | } 457 | 458 | 459 | ///Save the added item and dismiss view controller presented 460 | 461 | - (void)addItemViewController:(AddItemViewController *)controller didFinishAddingItem:(ChecklistItem *)item 462 | { 463 | int newRowIndex = [items count]; 464 | [items addObject:item]; 465 | NSIndexPath *indexPath = [NSIndexPath indexPathForRow:newRowIndex inSection:0]; 466 | NSArray *indexPaths = [NSArray arrayWithObject:indexPath]; 467 | [self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationAutomatic]; 468 | [self saveChecklistItems]; 469 | [self dismissViewControllerAnimated:YES completion:nil];} 470 | 471 | 472 | 473 | /// A UIStoryboardSegue object is responsible for performing the visual transition between two view controllers. In addition, segue objects are used to prepare for the transition from one view controller to another. Segue objects contain information about the view controllers involved in a transition. When a segue is triggered, but before the visual transition occurs, the storyboard runtime calls the current view controller’s prepareForSegue:sender: method so that it can pass any needed data to the view controller that is about to be displayed. The UIStoryboardSegue class supports the standard visual transitions available in UIKit. You can also subclass to define custom transitions between the view controllers in your storyboard file. You do not create segue objects directly. Instead, the storyboard runtime creates them when it must perform a segue between two view controllers. You can still initiate a segue programmatically using the performSegueWithIdentifier:sender: method of UIViewController if you want. You might do so to initiate a segue from a source that was added programmatically and therefore not available in Interface Builder. 474 | 475 | /// When the user taps on "Add" button, "additem" segue is triggered and add new item view controller is presented. wen user tap on accessory button, "edititem" is triggered and item view controller is presented in editing mode. 476 | 477 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 478 | { 479 | if ([segue.identifier isEqualToString:@"AddItem"]) { 480 | UINavigationController *navigationController = segue.destinationViewController; 481 | AddItemViewController *controller = (AddItemViewController *)navigationController.topViewController; 482 | controller.delegate = self; 483 | }else if ([segue.identifier isEqualToString:@"EditItem"]) { 484 | UINavigationController *navigationController = segue.destinationViewController; 485 | AddItemViewController *controller = (AddItemViewController *)navigationController.topViewController; 486 | controller.delegate = self; 487 | controller.itemToEdit = sender; 488 | } 489 | } 490 | 491 | ///The delegate usually responds to the tap on the disclosure button (the accessory view) by displaying a new view related to the selected row. This method is not called when an accessory view is set for the row at indexPath. 492 | ///When accessory item is tapped, edit item will be presented of the selected item 493 | 494 | - (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath 495 | { 496 | 497 | ChecklistItem *item = [items objectAtIndex:indexPath.row]; 498 | [self performSegueWithIdentifier:@"EditItem" sender:item]; 499 | 500 | } 501 | 502 | 503 | 504 | ///Save the edited item and dismiss view controller presented 505 | 506 | - (void)addItemViewController:(AddItemViewController *)controller didFinishEditingItem:(ChecklistItem *)item 507 | { 508 | int index = [items indexOfObject:item]; 509 | NSIndexPath *indexPath = [NSIndexPath indexPathForRow:index inSection:0]; 510 | UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; 511 | [self configureTextForCell:cell withChecklistItem:item]; 512 | [self saveChecklistItems]; 513 | [self dismissViewControllerAnimated:YES completion:nil]; 514 | } 515 | 516 | ///A UIRefreshControl object provides a standard control that can be used to initiate the refreshing of a table view’s contents. You link a refresh control to a table through an associated table view controller object. The table view controller handles the work of adding the control to the table’s visual appearance and managing the display of that control in response to appropriate user gestures. In addition to assigning a refresh control to a table view controller’s refreshControl property, you must configure the target and action of the control itself. The control does not initiate the refresh operation directly. Instead, it sends the UIControlEventValueChanged event when a refresh operation should occur. You must assign an action method to this event and use it to perform whatever actions are needed. The UITableViewController object that owns a refresh control is also responsible for setting that control’s frame rectangle. Thus, you do not need to manage the size or position of a refresh control directly in your view hierarchy. 517 | 518 | ///refresh (aka pulltorefresh activated additem identifier. Upon activation, we stop refreshing. 519 | 520 | - (void)refresh 521 | { 522 | [self performSegueWithIdentifier:@"AddItem" sender:self]; 523 | 524 | [self.refreshControl endRefreshing]; 525 | 526 | } 527 | 528 | 529 | ///Define whether reorder is allowed. Set to NO if reorder is not allowed 530 | 531 | - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath 532 | { 533 | return YES; 534 | } 535 | 536 | 537 | 538 | /// Identfy which row is reordered and update the table view and save the plist file. 539 | 540 | - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath 541 | { 542 | id objectToMove = [items objectAtIndex:fromIndexPath.row]; 543 | [items removeObjectAtIndex:fromIndexPath.row]; 544 | [items insertObject:objectToMove atIndex:toIndexPath.row]; 545 | [tableView reloadData]; 546 | [self saveChecklistItems]; 547 | } 548 | 549 | 550 | 551 | ///whent the user tap on the share button, we prepare the list and supply to activitycontroller. activity controller is responsible when user tap on the reletive share option 552 | 553 | -(IBAction) shareButtonClicked:(id)sender 554 | { 555 | NSMutableString *emailBody = [NSMutableString stringWithCapacity:1000]; 556 | 557 | for (ChecklistItem *item in self->items) 558 | { 559 | [emailBody appendString:item.text]; 560 | [emailBody appendString:@"\r\n"]; 561 | } 562 | 563 | 564 | 565 | 566 | self.activityViewController = [[UIActivityViewController alloc] 567 | 568 | initWithActivityItems:@[emailBody] applicationActivities:nil]; 569 | 570 | [self presentViewController:self.activityViewController animated:YES completion:nil]; 571 | 572 | 573 | } 574 | 575 | 576 | 577 | /* 578 | 579 | 580 | ///iAd Implementation 581 | // Comment below code to deactivate iAd in the project 582 | 583 | //========================================================================================================= 584 | 585 | 586 | 587 | /// We set iAd banner to top of table view 588 | 589 | - (void)bannerViewDidLoadAd:(ADBannerView *)banner 590 | { 591 | TableView.tableHeaderView = bannerView; 592 | 593 | 594 | } 595 | 596 | 597 | /// The iAd banner should rotate when device change orientation 598 | 599 | - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 600 | 601 | if (UIInterfaceOrientationIsLandscape(interfaceOrientation)) 602 | bannerView.currentContentSizeIdentifier = 603 | ADBannerContentSizeIdentifierLandscape; 604 | else 605 | bannerView.currentContentSizeIdentifier = 606 | ADBannerContentSizeIdentifierPortrait; 607 | 608 | return YES; 609 | } 610 | 611 | 612 | 613 | - (BOOL)bannerViewActionShouldBegin:(ADBannerView *)banner willLeaveApplication:(BOOL)willLeave 614 | { 615 | return YES; 616 | } 617 | 618 | 619 | - (void)bannerViewActionDidFinish:(ADBannerView *)banner 620 | { 621 | 622 | } 623 | 624 | 625 | ///In the case when iAd fails to load, we remove the empty ad banner from tableview header 626 | 627 | - (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error 628 | { 629 | TableView.tableHeaderView = nil; 630 | 631 | } 632 | 633 | 634 | /// release banner view as no longer need to retain in the memory 635 | 636 | -(void)viewDidUnload 637 | { 638 | bannerView = nil; 639 | 640 | 641 | } 642 | 643 | //========================================================================================================= 644 | 645 | 646 | */ 647 | 648 | 649 | 650 | 651 | 652 | @end 653 | -------------------------------------------------------------------------------- /Task Ticker/Task Ticker.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | A62FD769178F10EC00AA113B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A62FD768178F10EC00AA113B /* Security.framework */; }; 11 | A62FD76B178F10F300AA113B /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A62FD76A178F10F300AA113B /* QuartzCore.framework */; }; 12 | A66CF93C178A615500C582E1 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A66CF93B178A615500C582E1 /* UIKit.framework */; }; 13 | A66CF93E178A615500C582E1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A66CF93D178A615500C582E1 /* Foundation.framework */; }; 14 | A66CF940178A615500C582E1 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A66CF93F178A615500C582E1 /* CoreGraphics.framework */; }; 15 | A66CF946178A615500C582E1 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = A66CF944178A615500C582E1 /* InfoPlist.strings */; }; 16 | A66CF948178A615500C582E1 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = A66CF947178A615500C582E1 /* main.m */; }; 17 | A66CF94E178A615500C582E1 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = A66CF94D178A615500C582E1 /* Default.png */; }; 18 | A66CF950178A615500C582E1 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A66CF94F178A615500C582E1 /* Default@2x.png */; }; 19 | A66CF952178A615500C582E1 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A66CF951178A615500C582E1 /* Default-568h@2x.png */; }; 20 | A66CF955178A615500C582E1 /* MainStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A66CF953178A615500C582E1 /* MainStoryboard.storyboard */; }; 21 | A66CF967178A648200C582E1 /* AddItemViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A66CF960178A648200C582E1 /* AddItemViewController.m */; }; 22 | A66CF968178A648200C582E1 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = A66CF962178A648200C582E1 /* AppDelegate.m */; }; 23 | A66CF969178A648200C582E1 /* ChecklistItem.m in Sources */ = {isa = PBXBuildFile; fileRef = A66CF964178A648200C582E1 /* ChecklistItem.m */; }; 24 | A66CF96A178A648200C582E1 /* ChecklistViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A66CF966178A648200C582E1 /* ChecklistViewController.m */; }; 25 | A66CF96C178A657C00C582E1 /* iAd.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A66CF96B178A657C00C582E1 /* iAd.framework */; }; 26 | A66CF983178A6A1B00C582E1 /* blue-back-button.png in Resources */ = {isa = PBXBuildFile; fileRef = A66CF96E178A6A1B00C582E1 /* blue-back-button.png */; }; 27 | A66CF984178A6A1B00C582E1 /* blue-back-button@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A66CF96F178A6A1B00C582E1 /* blue-back-button@2x.png */; }; 28 | A66CF985178A6A1B00C582E1 /* blue-background.jpg in Resources */ = {isa = PBXBuildFile; fileRef = A66CF970178A6A1B00C582E1 /* blue-background.jpg */; }; 29 | A66CF986178A6A1B00C582E1 /* blue-background@2x.jpg in Resources */ = {isa = PBXBuildFile; fileRef = A66CF971178A6A1B00C582E1 /* blue-background@2x.jpg */; }; 30 | A66CF987178A6A1B00C582E1 /* blue-bar-button.png in Resources */ = {isa = PBXBuildFile; fileRef = A66CF972178A6A1B00C582E1 /* blue-bar-button.png */; }; 31 | A66CF988178A6A1B00C582E1 /* blue-bar-button@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A66CF973178A6A1B00C582E1 /* blue-bar-button@2x.png */; }; 32 | A66CF989178A6A1B00C582E1 /* blue-menu-bar.png in Resources */ = {isa = PBXBuildFile; fileRef = A66CF974178A6A1B00C582E1 /* blue-menu-bar.png */; }; 33 | A66CF98A178A6A1B00C582E1 /* blue-menu-bar@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A66CF975178A6A1B00C582E1 /* blue-menu-bar@2x.png */; }; 34 | A66CF98B178A6A1B00C582E1 /* checkbox-checked.png in Resources */ = {isa = PBXBuildFile; fileRef = A66CF976178A6A1B00C582E1 /* checkbox-checked.png */; }; 35 | A66CF98C178A6A1B00C582E1 /* checkbox-checked@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A66CF977178A6A1B00C582E1 /* checkbox-checked@2x.png */; }; 36 | A66CF98D178A6A1B00C582E1 /* checkbox.png in Resources */ = {isa = PBXBuildFile; fileRef = A66CF978178A6A1B00C582E1 /* checkbox.png */; }; 37 | A66CF98E178A6A1B00C582E1 /* checkbox@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A66CF979178A6A1B00C582E1 /* checkbox@2x.png */; }; 38 | A66CF994178A6A1B00C582E1 /* list-item-bg.png in Resources */ = {isa = PBXBuildFile; fileRef = A66CF97F178A6A1B00C582E1 /* list-item-bg.png */; }; 39 | A66CF995178A6A1B00C582E1 /* list-item-bg@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A66CF980178A6A1B00C582E1 /* list-item-bg@2x.png */; }; 40 | A66CF996178A6A1B00C582E1 /* Toggle_Divider.png in Resources */ = {isa = PBXBuildFile; fileRef = A66CF981178A6A1B00C582E1 /* Toggle_Divider.png */; }; 41 | A66CF997178A6A1B00C582E1 /* Toggle_Divider@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A66CF982178A6A1B00C582E1 /* Toggle_Divider@2x.png */; }; 42 | A66CF99A178A6B7E00C582E1 /* detaildisclosure-new.png in Resources */ = {isa = PBXBuildFile; fileRef = A66CF998178A6B7E00C582E1 /* detaildisclosure-new.png */; }; 43 | A66CF99B178A6B7E00C582E1 /* detaildisclosure-new@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A66CF999178A6B7E00C582E1 /* detaildisclosure-new@2x.png */; }; 44 | A66CF99F178A6E7500C582E1 /* DALinedTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = A66CF99E178A6E7500C582E1 /* DALinedTextView.m */; }; 45 | A66CF9A1178AFFD100C582E1 /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = A66CF9A0178AFFD100C582E1 /* Icon.png */; }; 46 | A66CF9A3178AFFD600C582E1 /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A66CF9A2178AFFD600C582E1 /* Icon@2x.png */; }; 47 | A69DD75317978C8D00FDC3C9 /* No Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = A69DD75117978C8D00FDC3C9 /* No Icon.png */; }; 48 | A69DD75417978C8D00FDC3C9 /* No Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A69DD75217978C8D00FDC3C9 /* No Icon@2x.png */; }; 49 | A69DD75717978D9B00FDC3C9 /* DatePickerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A69DD75617978D9B00FDC3C9 /* DatePickerViewController.m */; }; 50 | A69DD75B1797917F00FDC3C9 /* UIPickerActionSheet.m in Sources */ = {isa = PBXBuildFile; fileRef = A69DD75A1797917F00FDC3C9 /* UIPickerActionSheet.m */; }; 51 | A69DD75E1797C2B200FDC3C9 /* DataModel.m in Sources */ = {isa = PBXBuildFile; fileRef = A69DD75D1797C2B200FDC3C9 /* DataModel.m */; }; 52 | AEA1F7EE17F65DF90046656E /* Icon-60.png in Resources */ = {isa = PBXBuildFile; fileRef = AEA1F7EC17F65DF90046656E /* Icon-60.png */; }; 53 | AEA1F7EF17F65DF90046656E /* Icon-Small-40.png in Resources */ = {isa = PBXBuildFile; fileRef = AEA1F7ED17F65DF90046656E /* Icon-Small-40.png */; }; 54 | /* End PBXBuildFile section */ 55 | 56 | /* Begin PBXFileReference section */ 57 | A62FD768178F10EC00AA113B /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; 58 | A62FD76A178F10F300AA113B /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 59 | A66CF938178A615500C582E1 /* Task Ticker.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Task Ticker.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 60 | A66CF93B178A615500C582E1 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 61 | A66CF93D178A615500C582E1 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 62 | A66CF93F178A615500C582E1 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 63 | A66CF943178A615500C582E1 /* Task Ticker-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Task Ticker-Info.plist"; sourceTree = ""; }; 64 | A66CF945178A615500C582E1 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 65 | A66CF947178A615500C582E1 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = main.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 66 | A66CF949178A615500C582E1 /* Task Ticker-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Task Ticker-Prefix.pch"; sourceTree = ""; }; 67 | A66CF94D178A615500C582E1 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = ""; }; 68 | A66CF94F178A615500C582E1 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = ""; }; 69 | A66CF951178A615500C582E1 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; 70 | A66CF954178A615500C582E1 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard.storyboard; sourceTree = ""; }; 71 | A66CF95F178A648200C582E1 /* AddItemViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = AddItemViewController.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 72 | A66CF960178A648200C582E1 /* AddItemViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = AddItemViewController.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 73 | A66CF961178A648200C582E1 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = AppDelegate.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 74 | A66CF962178A648200C582E1 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = AppDelegate.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 75 | A66CF963178A648200C582E1 /* ChecklistItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = ChecklistItem.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 76 | A66CF964178A648200C582E1 /* ChecklistItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = ChecklistItem.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 77 | A66CF965178A648200C582E1 /* ChecklistViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = ChecklistViewController.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 78 | A66CF966178A648200C582E1 /* ChecklistViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = ChecklistViewController.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 79 | A66CF96B178A657C00C582E1 /* iAd.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = iAd.framework; path = System/Library/Frameworks/iAd.framework; sourceTree = SDKROOT; }; 80 | A66CF96E178A6A1B00C582E1 /* blue-back-button.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "blue-back-button.png"; sourceTree = ""; }; 81 | A66CF96F178A6A1B00C582E1 /* blue-back-button@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "blue-back-button@2x.png"; sourceTree = ""; }; 82 | A66CF970178A6A1B00C582E1 /* blue-background.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "blue-background.jpg"; sourceTree = ""; }; 83 | A66CF971178A6A1B00C582E1 /* blue-background@2x.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "blue-background@2x.jpg"; sourceTree = ""; }; 84 | A66CF972178A6A1B00C582E1 /* blue-bar-button.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "blue-bar-button.png"; sourceTree = ""; }; 85 | A66CF973178A6A1B00C582E1 /* blue-bar-button@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "blue-bar-button@2x.png"; sourceTree = ""; }; 86 | A66CF974178A6A1B00C582E1 /* blue-menu-bar.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "blue-menu-bar.png"; sourceTree = ""; }; 87 | A66CF975178A6A1B00C582E1 /* blue-menu-bar@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "blue-menu-bar@2x.png"; sourceTree = ""; }; 88 | A66CF976178A6A1B00C582E1 /* checkbox-checked.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "checkbox-checked.png"; sourceTree = ""; }; 89 | A66CF977178A6A1B00C582E1 /* checkbox-checked@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "checkbox-checked@2x.png"; sourceTree = ""; }; 90 | A66CF978178A6A1B00C582E1 /* checkbox.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = checkbox.png; sourceTree = ""; }; 91 | A66CF979178A6A1B00C582E1 /* checkbox@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "checkbox@2x.png"; sourceTree = ""; }; 92 | A66CF97F178A6A1B00C582E1 /* list-item-bg.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "list-item-bg.png"; sourceTree = ""; }; 93 | A66CF980178A6A1B00C582E1 /* list-item-bg@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "list-item-bg@2x.png"; sourceTree = ""; }; 94 | A66CF981178A6A1B00C582E1 /* Toggle_Divider.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Toggle_Divider.png; sourceTree = ""; }; 95 | A66CF982178A6A1B00C582E1 /* Toggle_Divider@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Toggle_Divider@2x.png"; sourceTree = ""; }; 96 | A66CF998178A6B7E00C582E1 /* detaildisclosure-new.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "detaildisclosure-new.png"; sourceTree = ""; }; 97 | A66CF999178A6B7E00C582E1 /* detaildisclosure-new@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "detaildisclosure-new@2x.png"; sourceTree = ""; }; 98 | A66CF99D178A6E7500C582E1 /* DALinedTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DALinedTextView.h; sourceTree = ""; }; 99 | A66CF99E178A6E7500C582E1 /* DALinedTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DALinedTextView.m; sourceTree = ""; }; 100 | A66CF9A0178AFFD100C582E1 /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Icon.png; sourceTree = ""; }; 101 | A66CF9A2178AFFD600C582E1 /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon@2x.png"; sourceTree = ""; }; 102 | A69DD75117978C8D00FDC3C9 /* No Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "No Icon.png"; sourceTree = ""; }; 103 | A69DD75217978C8D00FDC3C9 /* No Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "No Icon@2x.png"; sourceTree = ""; }; 104 | A69DD75517978D9B00FDC3C9 /* DatePickerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = DatePickerViewController.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 105 | A69DD75617978D9B00FDC3C9 /* DatePickerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = DatePickerViewController.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 106 | A69DD7591797917F00FDC3C9 /* UIPickerActionSheet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIPickerActionSheet.h; sourceTree = ""; }; 107 | A69DD75A1797917F00FDC3C9 /* UIPickerActionSheet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UIPickerActionSheet.m; sourceTree = ""; }; 108 | A69DD75C1797C2B200FDC3C9 /* DataModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = DataModel.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 109 | A69DD75D1797C2B200FDC3C9 /* DataModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = DataModel.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 110 | AEA1F7EC17F65DF90046656E /* Icon-60.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-60.png"; sourceTree = ""; }; 111 | AEA1F7ED17F65DF90046656E /* Icon-Small-40.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-Small-40.png"; sourceTree = ""; }; 112 | AEB3DAEB17F5ECD000FFB4CA /* Icon-60@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-60@2x.png"; sourceTree = ""; }; 113 | AEB3DAEC17F5ECF600FFB4CA /* Icon-Small.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-Small.png"; sourceTree = ""; }; 114 | AEB3DAED17F5ED0500FFB4CA /* Icon-Small@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-Small@2x.png"; sourceTree = ""; }; 115 | AEB3DAEE17F5ED1300FFB4CA /* Icon-Small-40@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-Small-40@2x.png"; sourceTree = ""; }; 116 | /* End PBXFileReference section */ 117 | 118 | /* Begin PBXFrameworksBuildPhase section */ 119 | A66CF935178A615500C582E1 /* Frameworks */ = { 120 | isa = PBXFrameworksBuildPhase; 121 | buildActionMask = 2147483647; 122 | files = ( 123 | A62FD76B178F10F300AA113B /* QuartzCore.framework in Frameworks */, 124 | A62FD769178F10EC00AA113B /* Security.framework in Frameworks */, 125 | A66CF96C178A657C00C582E1 /* iAd.framework in Frameworks */, 126 | A66CF93C178A615500C582E1 /* UIKit.framework in Frameworks */, 127 | A66CF93E178A615500C582E1 /* Foundation.framework in Frameworks */, 128 | A66CF940178A615500C582E1 /* CoreGraphics.framework in Frameworks */, 129 | ); 130 | runOnlyForDeploymentPostprocessing = 0; 131 | }; 132 | /* End PBXFrameworksBuildPhase section */ 133 | 134 | /* Begin PBXGroup section */ 135 | A66CF92F178A615500C582E1 = { 136 | isa = PBXGroup; 137 | children = ( 138 | AEA1F7EC17F65DF90046656E /* Icon-60.png */, 139 | AEA1F7ED17F65DF90046656E /* Icon-Small-40.png */, 140 | AEB3DAEE17F5ED1300FFB4CA /* Icon-Small-40@2x.png */, 141 | AEB3DAED17F5ED0500FFB4CA /* Icon-Small@2x.png */, 142 | AEB3DAEC17F5ECF600FFB4CA /* Icon-Small.png */, 143 | AEB3DAEB17F5ECD000FFB4CA /* Icon-60@2x.png */, 144 | A66CF9A2178AFFD600C582E1 /* Icon@2x.png */, 145 | A66CF9A0178AFFD100C582E1 /* Icon.png */, 146 | A66CF96D178A6A1B00C582E1 /* Resources */, 147 | A66CF95E178A648200C582E1 /* Classes */, 148 | A66CF941178A615500C582E1 /* Task Ticker */, 149 | A66CF93A178A615500C582E1 /* Frameworks */, 150 | A66CF939178A615500C582E1 /* Products */, 151 | ); 152 | sourceTree = ""; 153 | }; 154 | A66CF939178A615500C582E1 /* Products */ = { 155 | isa = PBXGroup; 156 | children = ( 157 | A66CF938178A615500C582E1 /* Task Ticker.app */, 158 | ); 159 | name = Products; 160 | sourceTree = ""; 161 | }; 162 | A66CF93A178A615500C582E1 /* Frameworks */ = { 163 | isa = PBXGroup; 164 | children = ( 165 | A62FD76A178F10F300AA113B /* QuartzCore.framework */, 166 | A62FD768178F10EC00AA113B /* Security.framework */, 167 | A66CF96B178A657C00C582E1 /* iAd.framework */, 168 | A66CF93B178A615500C582E1 /* UIKit.framework */, 169 | A66CF93D178A615500C582E1 /* Foundation.framework */, 170 | A66CF93F178A615500C582E1 /* CoreGraphics.framework */, 171 | ); 172 | name = Frameworks; 173 | sourceTree = ""; 174 | }; 175 | A66CF941178A615500C582E1 /* Task Ticker */ = { 176 | isa = PBXGroup; 177 | children = ( 178 | A66CF953178A615500C582E1 /* MainStoryboard.storyboard */, 179 | A66CF942178A615500C582E1 /* Supporting Files */, 180 | ); 181 | name = "Task Ticker"; 182 | path = Checklist; 183 | sourceTree = ""; 184 | }; 185 | A66CF942178A615500C582E1 /* Supporting Files */ = { 186 | isa = PBXGroup; 187 | children = ( 188 | A66CF943178A615500C582E1 /* Task Ticker-Info.plist */, 189 | A66CF944178A615500C582E1 /* InfoPlist.strings */, 190 | A66CF947178A615500C582E1 /* main.m */, 191 | A66CF949178A615500C582E1 /* Task Ticker-Prefix.pch */, 192 | A66CF94D178A615500C582E1 /* Default.png */, 193 | A66CF94F178A615500C582E1 /* Default@2x.png */, 194 | A66CF951178A615500C582E1 /* Default-568h@2x.png */, 195 | ); 196 | name = "Supporting Files"; 197 | sourceTree = ""; 198 | }; 199 | A66CF95E178A648200C582E1 /* Classes */ = { 200 | isa = PBXGroup; 201 | children = ( 202 | A69DD7581797917F00FDC3C9 /* UIPickerActionSheet */, 203 | A69DD75517978D9B00FDC3C9 /* DatePickerViewController.h */, 204 | A69DD75617978D9B00FDC3C9 /* DatePickerViewController.m */, 205 | A66CF99C178A6E7500C582E1 /* DALinedTextView */, 206 | A66CF961178A648200C582E1 /* AppDelegate.h */, 207 | A66CF962178A648200C582E1 /* AppDelegate.m */, 208 | A66CF965178A648200C582E1 /* ChecklistViewController.h */, 209 | A66CF966178A648200C582E1 /* ChecklistViewController.m */, 210 | A66CF95F178A648200C582E1 /* AddItemViewController.h */, 211 | A66CF960178A648200C582E1 /* AddItemViewController.m */, 212 | A66CF963178A648200C582E1 /* ChecklistItem.h */, 213 | A66CF964178A648200C582E1 /* ChecklistItem.m */, 214 | A69DD75C1797C2B200FDC3C9 /* DataModel.h */, 215 | A69DD75D1797C2B200FDC3C9 /* DataModel.m */, 216 | ); 217 | path = Classes; 218 | sourceTree = ""; 219 | }; 220 | A66CF96D178A6A1B00C582E1 /* Resources */ = { 221 | isa = PBXGroup; 222 | children = ( 223 | A69DD75117978C8D00FDC3C9 /* No Icon.png */, 224 | A69DD75217978C8D00FDC3C9 /* No Icon@2x.png */, 225 | A66CF998178A6B7E00C582E1 /* detaildisclosure-new.png */, 226 | A66CF999178A6B7E00C582E1 /* detaildisclosure-new@2x.png */, 227 | A66CF96E178A6A1B00C582E1 /* blue-back-button.png */, 228 | A66CF96F178A6A1B00C582E1 /* blue-back-button@2x.png */, 229 | A66CF970178A6A1B00C582E1 /* blue-background.jpg */, 230 | A66CF971178A6A1B00C582E1 /* blue-background@2x.jpg */, 231 | A66CF972178A6A1B00C582E1 /* blue-bar-button.png */, 232 | A66CF973178A6A1B00C582E1 /* blue-bar-button@2x.png */, 233 | A66CF974178A6A1B00C582E1 /* blue-menu-bar.png */, 234 | A66CF975178A6A1B00C582E1 /* blue-menu-bar@2x.png */, 235 | A66CF976178A6A1B00C582E1 /* checkbox-checked.png */, 236 | A66CF977178A6A1B00C582E1 /* checkbox-checked@2x.png */, 237 | A66CF978178A6A1B00C582E1 /* checkbox.png */, 238 | A66CF979178A6A1B00C582E1 /* checkbox@2x.png */, 239 | A66CF97F178A6A1B00C582E1 /* list-item-bg.png */, 240 | A66CF980178A6A1B00C582E1 /* list-item-bg@2x.png */, 241 | A66CF981178A6A1B00C582E1 /* Toggle_Divider.png */, 242 | A66CF982178A6A1B00C582E1 /* Toggle_Divider@2x.png */, 243 | ); 244 | path = Resources; 245 | sourceTree = ""; 246 | }; 247 | A66CF99C178A6E7500C582E1 /* DALinedTextView */ = { 248 | isa = PBXGroup; 249 | children = ( 250 | A66CF99D178A6E7500C582E1 /* DALinedTextView.h */, 251 | A66CF99E178A6E7500C582E1 /* DALinedTextView.m */, 252 | ); 253 | path = DALinedTextView; 254 | sourceTree = ""; 255 | }; 256 | A69DD7581797917F00FDC3C9 /* UIPickerActionSheet */ = { 257 | isa = PBXGroup; 258 | children = ( 259 | A69DD7591797917F00FDC3C9 /* UIPickerActionSheet.h */, 260 | A69DD75A1797917F00FDC3C9 /* UIPickerActionSheet.m */, 261 | ); 262 | path = UIPickerActionSheet; 263 | sourceTree = ""; 264 | }; 265 | /* End PBXGroup section */ 266 | 267 | /* Begin PBXNativeTarget section */ 268 | A66CF937178A615500C582E1 /* Task Ticker */ = { 269 | isa = PBXNativeTarget; 270 | buildConfigurationList = A66CF95B178A615500C582E1 /* Build configuration list for PBXNativeTarget "Task Ticker" */; 271 | buildPhases = ( 272 | A66CF934178A615500C582E1 /* Sources */, 273 | A66CF935178A615500C582E1 /* Frameworks */, 274 | A66CF936178A615500C582E1 /* Resources */, 275 | ); 276 | buildRules = ( 277 | ); 278 | dependencies = ( 279 | ); 280 | name = "Task Ticker"; 281 | productName = Checklist; 282 | productReference = A66CF938178A615500C582E1 /* Task Ticker.app */; 283 | productType = "com.apple.product-type.application"; 284 | }; 285 | /* End PBXNativeTarget section */ 286 | 287 | /* Begin PBXProject section */ 288 | A66CF930178A615500C582E1 /* Project object */ = { 289 | isa = PBXProject; 290 | attributes = { 291 | LastUpgradeCheck = 0460; 292 | ORGANIZATIONNAME = "Partho Biswas"; 293 | TargetAttributes = { 294 | A66CF937178A615500C582E1 = { 295 | DevelopmentTeam = CL96XN5QY7; 296 | }; 297 | }; 298 | }; 299 | buildConfigurationList = A66CF933178A615500C582E1 /* Build configuration list for PBXProject "Task Ticker" */; 300 | compatibilityVersion = "Xcode 3.2"; 301 | developmentRegion = English; 302 | hasScannedForEncodings = 0; 303 | knownRegions = ( 304 | en, 305 | ); 306 | mainGroup = A66CF92F178A615500C582E1; 307 | productRefGroup = A66CF939178A615500C582E1 /* Products */; 308 | projectDirPath = ""; 309 | projectRoot = ""; 310 | targets = ( 311 | A66CF937178A615500C582E1 /* Task Ticker */, 312 | ); 313 | }; 314 | /* End PBXProject section */ 315 | 316 | /* Begin PBXResourcesBuildPhase section */ 317 | A66CF936178A615500C582E1 /* Resources */ = { 318 | isa = PBXResourcesBuildPhase; 319 | buildActionMask = 2147483647; 320 | files = ( 321 | A66CF946178A615500C582E1 /* InfoPlist.strings in Resources */, 322 | A66CF94E178A615500C582E1 /* Default.png in Resources */, 323 | A66CF950178A615500C582E1 /* Default@2x.png in Resources */, 324 | A66CF952178A615500C582E1 /* Default-568h@2x.png in Resources */, 325 | A66CF955178A615500C582E1 /* MainStoryboard.storyboard in Resources */, 326 | A66CF983178A6A1B00C582E1 /* blue-back-button.png in Resources */, 327 | A66CF984178A6A1B00C582E1 /* blue-back-button@2x.png in Resources */, 328 | A66CF985178A6A1B00C582E1 /* blue-background.jpg in Resources */, 329 | A66CF986178A6A1B00C582E1 /* blue-background@2x.jpg in Resources */, 330 | A66CF987178A6A1B00C582E1 /* blue-bar-button.png in Resources */, 331 | A66CF988178A6A1B00C582E1 /* blue-bar-button@2x.png in Resources */, 332 | AEA1F7EF17F65DF90046656E /* Icon-Small-40.png in Resources */, 333 | A66CF989178A6A1B00C582E1 /* blue-menu-bar.png in Resources */, 334 | A66CF98A178A6A1B00C582E1 /* blue-menu-bar@2x.png in Resources */, 335 | A66CF98B178A6A1B00C582E1 /* checkbox-checked.png in Resources */, 336 | A66CF98C178A6A1B00C582E1 /* checkbox-checked@2x.png in Resources */, 337 | A66CF98D178A6A1B00C582E1 /* checkbox.png in Resources */, 338 | A66CF98E178A6A1B00C582E1 /* checkbox@2x.png in Resources */, 339 | A66CF994178A6A1B00C582E1 /* list-item-bg.png in Resources */, 340 | A66CF995178A6A1B00C582E1 /* list-item-bg@2x.png in Resources */, 341 | A66CF996178A6A1B00C582E1 /* Toggle_Divider.png in Resources */, 342 | A66CF997178A6A1B00C582E1 /* Toggle_Divider@2x.png in Resources */, 343 | A66CF99A178A6B7E00C582E1 /* detaildisclosure-new.png in Resources */, 344 | A66CF99B178A6B7E00C582E1 /* detaildisclosure-new@2x.png in Resources */, 345 | A66CF9A1178AFFD100C582E1 /* Icon.png in Resources */, 346 | A66CF9A3178AFFD600C582E1 /* Icon@2x.png in Resources */, 347 | A69DD75317978C8D00FDC3C9 /* No Icon.png in Resources */, 348 | AEA1F7EE17F65DF90046656E /* Icon-60.png in Resources */, 349 | A69DD75417978C8D00FDC3C9 /* No Icon@2x.png in Resources */, 350 | ); 351 | runOnlyForDeploymentPostprocessing = 0; 352 | }; 353 | /* End PBXResourcesBuildPhase section */ 354 | 355 | /* Begin PBXSourcesBuildPhase section */ 356 | A66CF934178A615500C582E1 /* Sources */ = { 357 | isa = PBXSourcesBuildPhase; 358 | buildActionMask = 2147483647; 359 | files = ( 360 | A66CF948178A615500C582E1 /* main.m in Sources */, 361 | A66CF967178A648200C582E1 /* AddItemViewController.m in Sources */, 362 | A66CF968178A648200C582E1 /* AppDelegate.m in Sources */, 363 | A66CF969178A648200C582E1 /* ChecklistItem.m in Sources */, 364 | A66CF96A178A648200C582E1 /* ChecklistViewController.m in Sources */, 365 | A66CF99F178A6E7500C582E1 /* DALinedTextView.m in Sources */, 366 | A69DD75717978D9B00FDC3C9 /* DatePickerViewController.m in Sources */, 367 | A69DD75B1797917F00FDC3C9 /* UIPickerActionSheet.m in Sources */, 368 | A69DD75E1797C2B200FDC3C9 /* DataModel.m in Sources */, 369 | ); 370 | runOnlyForDeploymentPostprocessing = 0; 371 | }; 372 | /* End PBXSourcesBuildPhase section */ 373 | 374 | /* Begin PBXVariantGroup section */ 375 | A66CF944178A615500C582E1 /* InfoPlist.strings */ = { 376 | isa = PBXVariantGroup; 377 | children = ( 378 | A66CF945178A615500C582E1 /* en */, 379 | ); 380 | name = InfoPlist.strings; 381 | sourceTree = ""; 382 | }; 383 | A66CF953178A615500C582E1 /* MainStoryboard.storyboard */ = { 384 | isa = PBXVariantGroup; 385 | children = ( 386 | A66CF954178A615500C582E1 /* en */, 387 | ); 388 | name = MainStoryboard.storyboard; 389 | sourceTree = ""; 390 | }; 391 | /* End PBXVariantGroup section */ 392 | 393 | /* Begin XCBuildConfiguration section */ 394 | A66CF959178A615500C582E1 /* Debug */ = { 395 | isa = XCBuildConfiguration; 396 | buildSettings = { 397 | ALWAYS_SEARCH_USER_PATHS = NO; 398 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 399 | CLANG_CXX_LIBRARY = "libc++"; 400 | CLANG_ENABLE_OBJC_ARC = YES; 401 | CLANG_WARN_CONSTANT_CONVERSION = YES; 402 | CLANG_WARN_EMPTY_BODY = YES; 403 | CLANG_WARN_ENUM_CONVERSION = YES; 404 | CLANG_WARN_INT_CONVERSION = YES; 405 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 406 | CODE_SIGN_IDENTITY = "iPhone Distribution: Partho Biswas (CL96XN5QY7)"; 407 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Partho Biswas (CL96XN5QY7)"; 408 | COPY_PHASE_STRIP = NO; 409 | GCC_C_LANGUAGE_STANDARD = gnu99; 410 | GCC_DYNAMIC_NO_PIC = NO; 411 | GCC_OPTIMIZATION_LEVEL = 0; 412 | GCC_PREPROCESSOR_DEFINITIONS = ( 413 | "DEBUG=1", 414 | "$(inherited)", 415 | ); 416 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 417 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 418 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 419 | GCC_WARN_UNUSED_VARIABLE = YES; 420 | IPHONEOS_DEPLOYMENT_TARGET = 6.1; 421 | ONLY_ACTIVE_ARCH = YES; 422 | PROVISIONING_PROFILE = "265D8A4D-1DD8-4DC4-82BA-C7423B2FCE24"; 423 | SDKROOT = iphoneos; 424 | }; 425 | name = Debug; 426 | }; 427 | A66CF95A178A615500C582E1 /* Release */ = { 428 | isa = XCBuildConfiguration; 429 | buildSettings = { 430 | ALWAYS_SEARCH_USER_PATHS = NO; 431 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 432 | CLANG_CXX_LIBRARY = "libc++"; 433 | CLANG_ENABLE_OBJC_ARC = YES; 434 | CLANG_WARN_CONSTANT_CONVERSION = YES; 435 | CLANG_WARN_EMPTY_BODY = YES; 436 | CLANG_WARN_ENUM_CONVERSION = YES; 437 | CLANG_WARN_INT_CONVERSION = YES; 438 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 439 | CODE_SIGN_IDENTITY = "iPhone Distribution: Partho Biswas (CL96XN5QY7)"; 440 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Partho Biswas (CL96XN5QY7)"; 441 | COPY_PHASE_STRIP = YES; 442 | GCC_C_LANGUAGE_STANDARD = gnu99; 443 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 444 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 445 | GCC_WARN_UNUSED_VARIABLE = YES; 446 | IPHONEOS_DEPLOYMENT_TARGET = 6.1; 447 | OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; 448 | PROVISIONING_PROFILE = "265D8A4D-1DD8-4DC4-82BA-C7423B2FCE24"; 449 | SDKROOT = iphoneos; 450 | VALIDATE_PRODUCT = YES; 451 | }; 452 | name = Release; 453 | }; 454 | A66CF95C178A615500C582E1 /* Debug */ = { 455 | isa = XCBuildConfiguration; 456 | buildSettings = { 457 | CODE_SIGN_IDENTITY = "iPhone Distribution: Partho Biswas (CL96XN5QY7)"; 458 | FRAMEWORK_SEARCH_PATHS = ( 459 | "$(inherited)", 460 | "\"$(SRCROOT)\"", 461 | ); 462 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 463 | GCC_PREFIX_HEADER = "Checklist/Task Ticker-Prefix.pch"; 464 | INFOPLIST_FILE = "Checklist/Task Ticker-Info.plist"; 465 | PRODUCT_NAME = "Task Ticker"; 466 | PROVISIONING_PROFILE = "265D8A4D-1DD8-4DC4-82BA-C7423B2FCE24"; 467 | WRAPPER_EXTENSION = app; 468 | }; 469 | name = Debug; 470 | }; 471 | A66CF95D178A615500C582E1 /* Release */ = { 472 | isa = XCBuildConfiguration; 473 | buildSettings = { 474 | CODE_SIGN_IDENTITY = "iPhone Distribution: Partho Biswas (CL96XN5QY7)"; 475 | FRAMEWORK_SEARCH_PATHS = ( 476 | "$(inherited)", 477 | "\"$(SRCROOT)\"", 478 | ); 479 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 480 | GCC_PREFIX_HEADER = "Checklist/Task Ticker-Prefix.pch"; 481 | INFOPLIST_FILE = "Checklist/Task Ticker-Info.plist"; 482 | PRODUCT_NAME = "Task Ticker"; 483 | PROVISIONING_PROFILE = "265D8A4D-1DD8-4DC4-82BA-C7423B2FCE24"; 484 | VALIDATE_PRODUCT = NO; 485 | WRAPPER_EXTENSION = app; 486 | }; 487 | name = Release; 488 | }; 489 | AEA1F7EA17F65C4F0046656E /* App Store */ = { 490 | isa = XCBuildConfiguration; 491 | buildSettings = { 492 | ALWAYS_SEARCH_USER_PATHS = NO; 493 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 494 | CLANG_CXX_LIBRARY = "libc++"; 495 | CLANG_ENABLE_OBJC_ARC = YES; 496 | CLANG_WARN_CONSTANT_CONVERSION = YES; 497 | CLANG_WARN_EMPTY_BODY = YES; 498 | CLANG_WARN_ENUM_CONVERSION = YES; 499 | CLANG_WARN_INT_CONVERSION = YES; 500 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 501 | CODE_SIGN_IDENTITY = "iPhone Distribution: Partho Biswas (CL96XN5QY7)"; 502 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Partho Biswas (CL96XN5QY7)"; 503 | COPY_PHASE_STRIP = YES; 504 | GCC_C_LANGUAGE_STANDARD = gnu99; 505 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 506 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 507 | GCC_WARN_UNUSED_VARIABLE = YES; 508 | IPHONEOS_DEPLOYMENT_TARGET = 6.1; 509 | OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; 510 | PROVISIONING_PROFILE = "265D8A4D-1DD8-4DC4-82BA-C7423B2FCE24"; 511 | SDKROOT = iphoneos; 512 | VALIDATE_PRODUCT = YES; 513 | }; 514 | name = "App Store"; 515 | }; 516 | AEA1F7EB17F65C4F0046656E /* App Store */ = { 517 | isa = XCBuildConfiguration; 518 | buildSettings = { 519 | CODE_SIGN_IDENTITY = "iPhone Distribution: Partho Biswas (CL96XN5QY7)"; 520 | FRAMEWORK_SEARCH_PATHS = ( 521 | "$(inherited)", 522 | "\"$(SRCROOT)\"", 523 | ); 524 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 525 | GCC_PREFIX_HEADER = "Checklist/Task Ticker-Prefix.pch"; 526 | INFOPLIST_FILE = "Checklist/Task Ticker-Info.plist"; 527 | PRODUCT_NAME = "Task Ticker"; 528 | PROVISIONING_PROFILE = "265D8A4D-1DD8-4DC4-82BA-C7423B2FCE24"; 529 | WRAPPER_EXTENSION = app; 530 | }; 531 | name = "App Store"; 532 | }; 533 | /* End XCBuildConfiguration section */ 534 | 535 | /* Begin XCConfigurationList section */ 536 | A66CF933178A615500C582E1 /* Build configuration list for PBXProject "Task Ticker" */ = { 537 | isa = XCConfigurationList; 538 | buildConfigurations = ( 539 | A66CF959178A615500C582E1 /* Debug */, 540 | A66CF95A178A615500C582E1 /* Release */, 541 | AEA1F7EA17F65C4F0046656E /* App Store */, 542 | ); 543 | defaultConfigurationIsVisible = 0; 544 | defaultConfigurationName = Release; 545 | }; 546 | A66CF95B178A615500C582E1 /* Build configuration list for PBXNativeTarget "Task Ticker" */ = { 547 | isa = XCConfigurationList; 548 | buildConfigurations = ( 549 | A66CF95C178A615500C582E1 /* Debug */, 550 | A66CF95D178A615500C582E1 /* Release */, 551 | AEA1F7EB17F65C4F0046656E /* App Store */, 552 | ); 553 | defaultConfigurationIsVisible = 0; 554 | defaultConfigurationName = Release; 555 | }; 556 | /* End XCConfigurationList section */ 557 | }; 558 | rootObject = A66CF930178A615500C582E1 /* Project object */; 559 | } 560 | -------------------------------------------------------------------------------- /Task Ticker/Checklist/en.lproj/MainStoryboard.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 61 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 89 | 98 | 108 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 313 | 325 | 334 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | --------------------------------------------------------------------------------