From fe5828c72476e0fbdb2224c886f0016b2f12a07d Mon Sep 17 00:00:00 2001 From: Maarten Billemont Date: Mon, 22 Sep 2014 22:32:31 -0400 Subject: [PATCH] Fix removal of questions. Blast you Core Data. --- .gitmodules | 3 + External/KCOrderedAccessorFix | 1 + .../xcshareddata/MasterPassword.xccheckout | 12 ++ MasterPassword/ObjC/MPAppDelegate_Store.m | 10 +- .../ObjC/iOS/MPAnswersViewController.m | 58 +++++---- .../ObjC/iOS/MPCombinedViewController.m | 13 +- .../ObjC/iOS/MPEmergencyViewController.m | 12 -- ...poverSegue.h => MPOverlayViewController.h} | 11 +- .../ObjC/iOS/MPOverlayViewController.m | 80 ++++++++++++ MasterPassword/ObjC/iOS/MPPopoverSegue.m | 57 --------- .../project.pbxproj | 116 +++++++++++++++--- MasterPassword/ObjC/iOS/Storyboard.storyboard | 54 ++++++-- 12 files changed, 287 insertions(+), 140 deletions(-) create mode 160000 External/KCOrderedAccessorFix rename MasterPassword/ObjC/iOS/{MPPopoverSegue.h => MPOverlayViewController.h} (69%) create mode 100644 MasterPassword/ObjC/iOS/MPOverlayViewController.m delete mode 100644 MasterPassword/ObjC/iOS/MPPopoverSegue.m diff --git a/.gitmodules b/.gitmodules index 8b03e0d0..d50d17c4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,3 +10,6 @@ [submodule "External/RHStatusItemView"] path = External/RHStatusItemView url = git://github.com/lhunath/RHStatusItemView.git +[submodule "External/KCOrderedAccessorFix"] + path = External/KCOrderedAccessorFix + url = https://github.com/CFKevinRef/KCOrderedAccessorFix.git diff --git a/External/KCOrderedAccessorFix b/External/KCOrderedAccessorFix new file mode 160000 index 00000000..e1955221 --- /dev/null +++ b/External/KCOrderedAccessorFix @@ -0,0 +1 @@ +Subproject commit e1955221bf52d53736e7d3e7d38465c509e02562 diff --git a/MasterPassword.xcworkspace/xcshareddata/MasterPassword.xccheckout b/MasterPassword.xcworkspace/xcshareddata/MasterPassword.xccheckout index 9c5c4d58..f11d1ee6 100644 --- a/MasterPassword.xcworkspace/xcshareddata/MasterPassword.xccheckout +++ b/MasterPassword.xcworkspace/xcshareddata/MasterPassword.xccheckout @@ -18,6 +18,8 @@ github.com:Lyndir/Lyndir.git 2FE140B36B7D26140DC8D5E5C639DC5900EFCF35 git://github.com/lhunath/uicolor-utilities.git + 304AD0F97EA7B4893D91DFB8C3413D4E627B9472 + https://github.com/CFKevinRef/KCOrderedAccessorFix.git 3E67FB08419C920516AAC3B00DAAF23073B8CF77 git://github.com/lhunath/RHStatusItemView.git 4DDCFFD91B41F00326AD14553BD66CFD366ABD91 @@ -41,6 +43,8 @@ ../.. 2FE140B36B7D26140DC8D5E5C639DC5900EFCF35 ../External/Pearl/External/uicolor-utilities + 304AD0F97EA7B4893D91DFB8C3413D4E627B9472 + ../External/KCOrderedAccessorFix/ 3E67FB08419C920516AAC3B00DAAF23073B8CF77 ../External/RHStatusItemView 4DDCFFD91B41F00326AD14553BD66CFD366ABD91 @@ -84,6 +88,14 @@ IDESourceControlWCCName jrswizzle + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + 304AD0F97EA7B4893D91DFB8C3413D4E627B9472 + IDESourceControlWCCName + KCOrderedAccessorFix + IDESourceControlRepositoryExtensionIdentifierKey public.vcs.git diff --git a/MasterPassword/ObjC/MPAppDelegate_Store.m b/MasterPassword/ObjC/MPAppDelegate_Store.m index 6c80f7ea..5cdc7dbe 100644 --- a/MasterPassword/ObjC/MPAppDelegate_Store.m +++ b/MasterPassword/ObjC/MPAppDelegate_Store.m @@ -8,6 +8,7 @@ #import "MPAppDelegate_Store.h" #import "MPGeneratedSiteEntity.h" +#import "NSManagedObjectModel+KCOrderedAccessorFix.h" #if TARGET_OS_IPHONE #define STORE_OPTIONS NSPersistentStoreFileProtectionKey : NSFileProtectionComplete, @@ -147,9 +148,12 @@ PearlAssociatedObjectProperty( NSManagedObjectContext*, MainManagedObjectContext [self migrateStore]; // Create a new store coordinator. - if (!self.persistentStoreCoordinator) - self.persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: - [NSManagedObjectModel mergedModelFromBundles:nil]]; + if (!self.persistentStoreCoordinator) { + NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil]; + [model kc_generateOrderedSetAccessors]; + self.persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model]; + } + NSError *error = nil; NSURL *localStoreURL = [self localStoreURL]; if (![[NSFileManager defaultManager] createDirectoryAtURL:[localStoreURL URLByDeletingLastPathComponent] diff --git a/MasterPassword/ObjC/iOS/MPAnswersViewController.m b/MasterPassword/ObjC/iOS/MPAnswersViewController.m index 1c0bfccc..7c5a52d1 100644 --- a/MasterPassword/ObjC/iOS/MPAnswersViewController.m +++ b/MasterPassword/ObjC/iOS/MPAnswersViewController.m @@ -36,18 +36,6 @@ self.view.backgroundColor = [UIColor clearColor]; } -- (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender { - - return [self respondsToSelector:action]; -} - -#pragma mark - Actions - -- (IBAction)unwindToCombined:(UIStoryboardSegue *)sender { - - dbg( @"unwindToCombined:%@", sender ); -} - #pragma mark - State - (void)setSite:(MPSiteEntity *)site { @@ -55,6 +43,13 @@ _siteOID = [site objectID]; _multiple = [site.questions count] > 0; [self.tableView reloadData]; + [self updateAnimated:NO]; +} + +- (void)setMultiple:(BOOL)multiple animated:(BOOL)animated { + + _multiple = multiple; + [self updateAnimated:animated]; } - (MPSiteEntity *)siteInContext:(NSManagedObjectContext *)context { @@ -131,14 +126,14 @@ [UIPasteboard generalPasteboard].string = ((MPGlobalAnswersCell *)cell).answerField.text; } else if ([cell isKindOfClass:[MPMultipleAnswersCell class]]) { - [[NSOperationQueue mainQueue] addOperationWithBlock:^{ - if (!_multiple) { - _multiple = YES; - cell.accessoryType = UITableViewCellAccessoryCheckmark; - [tableView reloadSections:[NSIndexSet indexSetWithIndex:1] - withRowAnimation:UITableViewRowAnimationAutomatic]; - } - else if (_multiple && [site.questions count]) + if (!_multiple) + [self setMultiple:YES animated:YES]; + + else if (_multiple) { + if (![site.questions count]) + [self setMultiple:NO animated:YES]; + + else [PearlAlert showAlertWithTitle:@"Remove Site Questions?" message: @"Do you want to remove the questions you have configured for this site?" viewStyle:UIAlertViewStyleDefault initAlert:nil @@ -150,15 +145,10 @@ MPSiteEntity *site_ = [self siteInContext:context]; [site_ removeQuestions:site_.questions]; [context saveToStore]; - PearlMainQueue( ^{ - _multiple = NO; - cell.accessoryType = UITableViewCellAccessoryNone; - [tableView reloadSections:[NSIndexSet indexSetWithIndex:1] - withRowAnimation:UITableViewRowAnimationAutomatic]; - } ); + [self setMultiple:NO animated:YES]; }]; } cancelTitle:@"Cancel" otherTitles:@"Remove Questions", nil]; - }]; + } } else if ([cell isKindOfClass:[MPSendAnswersCell class]]) { NSString *body; @@ -191,6 +181,20 @@ [tableView deselectRowAtIndexPath:indexPath animated:YES]; } +#pragma mark - Private + +- (void)updateAnimated:(BOOL)animated { + + PearlMainQueue( ^{ + UITableViewCell *multipleAnswersCell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForItem:2 inSection:0]]; + multipleAnswersCell.accessoryType = _multiple? UITableViewCellAccessoryCheckmark: UITableViewCellAccessoryNone; + + [[NSOperationQueue mainQueue] addOperationWithBlock:^{ + [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:1] withRowAnimation:UITableViewRowAnimationAutomatic]; + }]; + } ); +} + @end @implementation MPGlobalAnswersCell diff --git a/MasterPassword/ObjC/iOS/MPCombinedViewController.m b/MasterPassword/ObjC/iOS/MPCombinedViewController.m index dcdad03f..dbb245e8 100644 --- a/MasterPassword/ObjC/iOS/MPCombinedViewController.m +++ b/MasterPassword/ObjC/iOS/MPCombinedViewController.m @@ -19,7 +19,6 @@ #import "MPCombinedViewController.h" #import "MPUsersViewController.h" #import "MPPasswordsViewController.h" -#import "MPPopoverSegue.h" #import "MPEmergencyViewController.h" #import "MPPasswordsSegue.h" @@ -34,6 +33,8 @@ MPPasswordsViewController *_passwordsVC; } +#pragma mark - Life + - (void)viewDidLoad { [super viewDidLoad]; @@ -99,16 +100,14 @@ [self performSegueWithIdentifier:@"emergency" sender:self]; } -- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController - fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier { +#pragma mark - Actions - if ([identifier isEqualToString:@"unwind-popover"]) - return [[MPPopoverSegue alloc] initWithIdentifier:identifier source:fromViewController destination:toViewController]; +- (IBAction)unwindToCombined:(UIStoryboardSegue *)sender { - return nil; + dbg( @"unwindToCombined:%@", sender ); } -#pragma mark - Properties +#pragma mark - State - (void)setMode:(MPCombinedMode)mode { diff --git a/MasterPassword/ObjC/iOS/MPEmergencyViewController.m b/MasterPassword/ObjC/iOS/MPEmergencyViewController.m index 5e82f128..785e1c9d 100644 --- a/MasterPassword/ObjC/iOS/MPEmergencyViewController.m +++ b/MasterPassword/ObjC/iOS/MPEmergencyViewController.m @@ -53,18 +53,6 @@ [self reset]; } -- (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender { - - return [self respondsToSelector:action]; -} - -#pragma mark - Actions - -- (IBAction)unwindToCombined:(UIStoryboardSegue *)sender { - - dbg(@"unwindToCombined:%@", sender); -} - #pragma mark - UITextFieldDelegate - (BOOL)textFieldShouldReturn:(UITextField *)textField { diff --git a/MasterPassword/ObjC/iOS/MPPopoverSegue.h b/MasterPassword/ObjC/iOS/MPOverlayViewController.h similarity index 69% rename from MasterPassword/ObjC/iOS/MPPopoverSegue.h rename to MasterPassword/ObjC/iOS/MPOverlayViewController.h index 84c80791..5f2090d7 100644 --- a/MasterPassword/ObjC/iOS/MPPopoverSegue.h +++ b/MasterPassword/ObjC/iOS/MPOverlayViewController.h @@ -9,15 +9,18 @@ */ // -// MPPopoverSegue.h -// MPPopoverSegue +// MPOverlayViewController.h +// MPOverlayViewController // -// Created by lhunath on 2014-04-09. +// Created by lhunath on 2014-09-22. // Copyright, lhunath (Maarten Billemont) 2014. All rights reserved. // #import -@interface MPPopoverSegue : UIStoryboardSegue +@interface MPOverlayViewController : UIViewController +@end + +@interface MPOverlaySegue : UIStoryboardSegue @end diff --git a/MasterPassword/ObjC/iOS/MPOverlayViewController.m b/MasterPassword/ObjC/iOS/MPOverlayViewController.m new file mode 100644 index 00000000..ea95b357 --- /dev/null +++ b/MasterPassword/ObjC/iOS/MPOverlayViewController.m @@ -0,0 +1,80 @@ +/** + * Copyright Maarten Billemont (http://www.lhunath.com, lhunath@lyndir.com) + * + * See the enclosed file LICENSE for license information (LGPLv3). If you did + * not receive this file, see http://www.gnu.org/licenses/lgpl-3.0.txt + * + * @author Maarten Billemont + * @license http://www.gnu.org/licenses/lgpl-3.0.txt + */ + +// +// MPOverlayViewController.h +// MPOverlayViewController +// +// Created by lhunath on 2014-09-22. +// Copyright, lhunath (Maarten Billemont) 2014. All rights reserved. +// + +#import "MPOverlayViewController.h" + + +@implementation MPOverlayViewController + +- (void)viewWillAppear:(BOOL)animated { + + [super viewWillAppear:animated]; + + if (![self.childViewControllers count]) + [self performSegueWithIdentifier:@"root" sender:self]; +} + +- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController + fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier { + + return [[MPOverlaySegue alloc] initWithIdentifier:identifier source:fromViewController destination:toViewController]; +} + +@end + +@implementation MPOverlaySegue + +- (void)perform { + + UIViewController *sourceViewController = self.sourceViewController; + UIViewController *destinationViewController = self.destinationViewController; + MPOverlayViewController *containerViewController = self.sourceViewController; + while (![containerViewController isKindOfClass:[MPOverlayViewController class]]) + containerViewController = (id)containerViewController.parentViewController; + NSAssert( [containerViewController isKindOfClass:[MPOverlayViewController class]], + @"Not an overlay container: %@", containerViewController ); + + if (!destinationViewController.parentViewController) { + // Winding + [containerViewController addChildViewController:destinationViewController]; + [containerViewController.view addSubview:destinationViewController.view]; + CGRectSetY( destinationViewController.view.frame, containerViewController.view.frame.size.height ); + [UIView transitionWithView:containerViewController.view duration:0.3f + options:UIViewAnimationOptionAllowAnimatedContent animations:^{ + CGRectSetY( destinationViewController.view.frame, 0 ); + } completion:^(BOOL finished) { + if (finished) + [destinationViewController didMoveToParentViewController:containerViewController]; + }]; + } + else { + // Unwinding + [sourceViewController willMoveToParentViewController:nil]; + [UIView transitionWithView:containerViewController.view duration:0.3f + options:UIViewAnimationOptionAllowAnimatedContent animations:^{ + CGRectSetY( sourceViewController.view.bounds, containerViewController.view.frame.size.height ); + } completion:^(BOOL finished) { + if (finished) { + [sourceViewController.view removeFromSuperview]; + [sourceViewController removeFromParentViewController]; + } + }]; + } +} + +@end diff --git a/MasterPassword/ObjC/iOS/MPPopoverSegue.m b/MasterPassword/ObjC/iOS/MPPopoverSegue.m deleted file mode 100644 index 3aa1d5ee..00000000 --- a/MasterPassword/ObjC/iOS/MPPopoverSegue.m +++ /dev/null @@ -1,57 +0,0 @@ -/** -* Copyright Maarten Billemont (http://www.lhunath.com, lhunath@lyndir.com) -* -* See the enclosed file LICENSE for license information (LGPLv3). If you did -* not receive this file, see http://www.gnu.org/licenses/lgpl-3.0.txt -* -* @author Maarten Billemont -* @license http://www.gnu.org/licenses/lgpl-3.0.txt -*/ - -// -// MPPopoverSegue.h -// MPPopoverSegue -// -// Created by lhunath on 2014-04-09. -// Copyright, lhunath (Maarten Billemont) 2014. All rights reserved. -// - -#import "MPPopoverSegue.h" - -@implementation MPPopoverSegue { -} - -- (void)perform { - - UIViewController *sourceViewController = self.sourceViewController; - UIViewController *destinationViewController = self.destinationViewController; - - if ([sourceViewController parentViewController] != destinationViewController) { - // Winding - [sourceViewController addChildViewController:destinationViewController]; - [sourceViewController.view addSubview:destinationViewController.view]; - CGRectSetY( destinationViewController.view.bounds, sourceViewController.view.frame.size.height ); - [UIView transitionWithView:sourceViewController.view duration:0.3f - options:UIViewAnimationOptionAllowAnimatedContent animations:^{ - CGRectSetY( destinationViewController.view.bounds, 0 ); - } completion:^(BOOL finished) { - if (finished) - [destinationViewController didMoveToParentViewController:sourceViewController]; - }]; - } - else { - // Unwinding - [sourceViewController willMoveToParentViewController:nil]; - [UIView transitionWithView:sourceViewController.parentViewController.view duration:0.3f - options:UIViewAnimationOptionAllowAnimatedContent animations:^{ - CGRectSetY( sourceViewController.view.bounds, sourceViewController.parentViewController.view.frame.size.height ); - } completion:^(BOOL finished) { - if (finished) { - [sourceViewController.view removeFromSuperview]; - [sourceViewController removeFromParentViewController]; - } - }]; - } -} - -@end diff --git a/MasterPassword/ObjC/iOS/MasterPassword-iOS.xcodeproj/project.pbxproj b/MasterPassword/ObjC/iOS/MasterPassword-iOS.xcodeproj/project.pbxproj index 4c9b2a29..e8a6d37d 100644 --- a/MasterPassword/ObjC/iOS/MasterPassword-iOS.xcodeproj/project.pbxproj +++ b/MasterPassword/ObjC/iOS/MasterPassword-iOS.xcodeproj/project.pbxproj @@ -9,7 +9,6 @@ /* Begin PBXBuildFile section */ 93D390C1B93F9D3AE37DD0A5 /* MPAnswersViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39C426E03358384018E85 /* MPAnswersViewController.m */; }; 93D391ECBD9BD2C64115B5DD /* PearlSizedTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39156E806BB78E04F78B9 /* PearlSizedTextView.m */; }; - 93D391ED37C9F687FA51EAA1 /* MPPopoverSegue.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D3937712BF1B67623E5764 /* MPPopoverSegue.m */; }; 93D3922A53E41A54832E90D9 /* PearlOverlay.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D390FADEB325D8D54A957D /* PearlOverlay.m */; }; 93D39262A8A97DB748213309 /* PearlEMail.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D393BB973253D4BAAC84AA /* PearlEMail.m */; }; 93D392A8777DC30C11361647 /* UITextView+PearlAttributes.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D39AA10CD00D05937671B1 /* UITextView+PearlAttributes.h */; }; @@ -35,6 +34,7 @@ 93D399246DC90F50913A1287 /* UIResponder+PearlFirstResponder.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39A1DDFA09AE2E14D26DC /* UIResponder+PearlFirstResponder.m */; }; 93D3992FA1546E01F498F665 /* PearlNavigationController.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D398567FD02DB2647B8CF3 /* PearlNavigationController.h */; }; 93D399433EA75E50656040CB /* Twitter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 93D394077F8FAB8167647187 /* Twitter.framework */; }; + 93D399D7E08A142776A74CB8 /* MPOverlayViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D395105935859D71679931 /* MPOverlayViewController.m */; }; 93D39A53D76CA70786423458 /* UICollectionView+PearlReloadFromArray.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D39246FC21C6E63E35D615 /* UICollectionView+PearlReloadFromArray.h */; }; 93D39A5FF670957C0AF8298D /* MPPasswordCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39DEA995041A13DC9CAF7 /* MPPasswordCell.m */; }; 93D39A8EA1C49CE43B63F47B /* PearlUICollectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39D8A953779B35403AF6E /* PearlUICollectionView.m */; }; @@ -121,6 +121,8 @@ DA32D00A19CF5C55004F3F0E /* icon_question@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DABD37FF1711E29600CF925C /* icon_question@2x.png */; }; DA32D01A19D046E1004F3F0E /* PearlFixedTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = DA32D01819D046E1004F3F0E /* PearlFixedTableView.m */; }; DA32D01B19D046E1004F3F0E /* PearlFixedTableView.h in Headers */ = {isa = PBXBuildFile; fileRef = DA32D01919D046E1004F3F0E /* PearlFixedTableView.h */; }; + DA32D03C19D111EB004F3F0E /* NSManagedObjectModel+KCOrderedAccessorFix.m in Sources */ = {isa = PBXBuildFile; fileRef = DA32D03A19D111EB004F3F0E /* NSManagedObjectModel+KCOrderedAccessorFix.m */; }; + DA32D03E19D11293004F3F0E /* libKCOrderedAccessorFix.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DA32D02019D111C6004F3F0E /* libKCOrderedAccessorFix.a */; }; DA3509FE15F101A500C14A8E /* PearlQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = DA3509FC15F101A500C14A8E /* PearlQueue.h */; }; DA3509FF15F101A500C14A8E /* PearlQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = DA3509FD15F101A500C14A8E /* PearlQueue.m */; }; DA38D6A318CCB5BF009AEB3E /* Storyboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DA38D6A218CCB5BF009AEB3E /* Storyboard.storyboard */; }; @@ -395,6 +397,18 @@ DAFE4A63150399FF003ABA94 /* NSDateFormatter+RFC3339.h in Headers */ = {isa = PBXBuildFile; fileRef = DAFE4A63150399FF003ABA93 /* NSDateFormatter+RFC3339.h */; }; /* End PBXBuildFile section */ +/* Begin PBXCopyFilesBuildPhase section */ + DA32D01E19D111C6004F3F0E /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "include/$(PRODUCT_NAME)"; + dstSubfolderSpec = 16; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ 93D390519405B76CC6A57C4F /* MPCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPCell.h; sourceTree = ""; }; 93D39067C0AFDC581794E2B8 /* NSArray+Indexing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSArray+Indexing.m"; sourceTree = ""; }; @@ -410,13 +424,13 @@ 93D3924EE15017F8A12CB436 /* MPPasswordsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasswordsViewController.m; sourceTree = ""; }; 93D392876BE5C011DE73B43F /* MPPopdownSegue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPopdownSegue.h; sourceTree = ""; }; 93D393310223DDB35218467A /* MPCombinedViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPCombinedViewController.m; sourceTree = ""; }; - 93D3937712BF1B67623E5764 /* MPPopoverSegue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPopoverSegue.m; sourceTree = ""; }; 93D393B97158D7BE9332EA53 /* NSDictionary+Indexing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDictionary+Indexing.h"; sourceTree = ""; }; 93D393BB973253D4BAAC84AA /* PearlEMail.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlEMail.m; sourceTree = ""; }; 93D394077F8FAB8167647187 /* Twitter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Twitter.framework; path = System/Library/Frameworks/Twitter.framework; sourceTree = SDKROOT; }; 93D3942A356B639724157982 /* PearlOverlay.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlOverlay.h; sourceTree = ""; }; 93D394482BB07F90E8FD1314 /* UIResponder+PearlFirstResponder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIResponder+PearlFirstResponder.h"; sourceTree = ""; }; 93D394C78C7B879C9AD9152C /* MPAppDelegate_InApp.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAppDelegate_InApp.m; sourceTree = ""; }; + 93D395105935859D71679931 /* MPOverlayViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPOverlayViewController.m; sourceTree = ""; }; 93D3956915634581E737B38C /* PearlNavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlNavigationController.m; sourceTree = ""; }; 93D3957D76F71A652716EECC /* MPStoreViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPStoreViewController.m; sourceTree = ""; }; 93D396D04E57792A54D437AC /* NSArray+Indexing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSArray+Indexing.h"; sourceTree = ""; }; @@ -435,7 +449,6 @@ 93D399F244BB522A317811BB /* MPFixable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPFixable.h; sourceTree = ""; }; 93D39A1DDFA09AE2E14D26DC /* UIResponder+PearlFirstResponder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIResponder+PearlFirstResponder.m"; sourceTree = ""; }; 93D39A28369954D147E239BA /* MPSetupViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPSetupViewController.m; sourceTree = ""; }; - 93D39A41340CF778E00D0E6D /* MPPopoverSegue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPopoverSegue.h; sourceTree = ""; }; 93D39A4759186F6D2D34AA6B /* PearlSizedTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlSizedTextView.h; sourceTree = ""; }; 93D39A813CA9D7E192261ED2 /* MPFixable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPFixable.m; sourceTree = ""; }; 93D39AA10CD00D05937671B1 /* UITextView+PearlAttributes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UITextView+PearlAttributes.h"; sourceTree = ""; }; @@ -444,6 +457,7 @@ 93D39B050DD5F55E9794EFD4 /* MPPopdownSegue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPopdownSegue.m; sourceTree = ""; }; 93D39B1D8177A86C5B9EDDE3 /* PearlUICollectionView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlUICollectionView.h; sourceTree = ""; }; 93D39B381350802A194BF332 /* MPAvatarCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAvatarCell.m; sourceTree = ""; }; + 93D39B455A71EC98C749E623 /* MPOverlayViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPOverlayViewController.h; sourceTree = ""; }; 93D39BAA71DE51B4D8A1286C /* MPCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPCell.m; sourceTree = ""; }; 93D39C426E03358384018E85 /* MPAnswersViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAnswersViewController.m; sourceTree = ""; }; 93D39C44361BE57AF0B3071F /* MPPasswordsSegue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordsSegue.h; sourceTree = ""; }; @@ -526,6 +540,9 @@ DA32D00719CF4735004F3F0E /* MasterPassword 6.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "MasterPassword 6.xcdatamodel"; sourceTree = ""; }; DA32D01819D046E1004F3F0E /* PearlFixedTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlFixedTableView.m; sourceTree = ""; }; DA32D01919D046E1004F3F0E /* PearlFixedTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlFixedTableView.h; sourceTree = ""; }; + DA32D02019D111C6004F3F0E /* libKCOrderedAccessorFix.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libKCOrderedAccessorFix.a; sourceTree = BUILT_PRODUCTS_DIR; }; + DA32D03919D111EB004F3F0E /* NSManagedObjectModel+KCOrderedAccessorFix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSManagedObjectModel+KCOrderedAccessorFix.h"; sourceTree = ""; }; + DA32D03A19D111EB004F3F0E /* NSManagedObjectModel+KCOrderedAccessorFix.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSManagedObjectModel+KCOrderedAccessorFix.m"; sourceTree = ""; }; DA3509FC15F101A500C14A8E /* PearlQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlQueue.h; sourceTree = ""; }; DA3509FD15F101A500C14A8E /* PearlQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlQueue.m; sourceTree = ""; }; DA38D6A218CCB5BF009AEB3E /* Storyboard.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Storyboard.storyboard; sourceTree = ""; }; @@ -1376,10 +1393,18 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + DA32D01D19D111C6004F3F0E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; DA5BFA41147E415C00F98B1E /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + DA32D03E19D11293004F3F0E /* libKCOrderedAccessorFix.a in Frameworks */, DA04E33E14B1E70400ECA4F3 /* MobileCoreServices.framework in Frameworks */, DAE2725A19C93B8E007C5262 /* StoreKit.framework in Frameworks */, DAE2725919C93B80007C5262 /* libInAppSettingsKit.a in Frameworks */, @@ -1470,6 +1495,15 @@ path = Guide; sourceTree = ""; }; + DA32D03719D111EB004F3F0E /* KCOrderedAccessorFix */ = { + isa = PBXGroup; + children = ( + DA32D03919D111EB004F3F0E /* NSManagedObjectModel+KCOrderedAccessorFix.h */, + DA32D03A19D111EB004F3F0E /* NSManagedObjectModel+KCOrderedAccessorFix.m */, + ); + path = KCOrderedAccessorFix; + sourceTree = ""; + }; DA5BFA39147E415C00F98B1E = { isa = PBXGroup; children = ( @@ -1493,6 +1527,7 @@ DAC6325D1486805C0075AEA5 /* libuicolor-utilities.a */, DAC6326C148680650075AEA5 /* libjrswizzle.a */, DAFC5655172C573B00CB5CC5 /* libInAppSettingsKit.a */, + DA32D02019D111C6004F3F0E /* libKCOrderedAccessorFix.a */, ); name = Products; sourceTree = ""; @@ -2342,8 +2377,6 @@ 93D3971FE104BB4052484151 /* MPUsersViewController.h */, 93D39BAA71DE51B4D8A1286C /* MPCell.m */, 93D390519405B76CC6A57C4F /* MPCell.h */, - 93D3937712BF1B67623E5764 /* MPPopoverSegue.m */, - 93D39A41340CF778E00D0E6D /* MPPopoverSegue.h */, 93D39E7A12CC352B2825AA66 /* MPPasswordsSegue.m */, 93D39C44361BE57AF0B3071F /* MPPasswordsSegue.h */, 93D39B050DD5F55E9794EFD4 /* MPPopdownSegue.m */, @@ -2356,6 +2389,8 @@ 93D39F556F2F142740A65E59 /* MPWebViewController.h */, 93D39CC01630D0421205C4C4 /* MPNavigationController.m */, 93D3970502644794E8A027BE /* MPNavigationController.h */, + 93D395105935859D71679931 /* MPOverlayViewController.m */, + 93D39B455A71EC98C749E623 /* MPOverlayViewController.h */, ); path = iOS; sourceTree = ""; @@ -2376,6 +2411,7 @@ DACA22121705DDC5002C6C22 /* External */ = { isa = PBXGroup; children = ( + DA32D03719D111EB004F3F0E /* KCOrderedAccessorFix */, DAA141181922FED80032B392 /* iOS */, DAFC5662172C57EC00CB5CC5 /* InAppSettingsKit */, DAC77CAF148291A600BCF976 /* Pearl */, @@ -2786,6 +2822,23 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ + DA32D01F19D111C6004F3F0E /* KCOrderedAccessorFix */ = { + isa = PBXNativeTarget; + buildConfigurationList = DA32D03419D111C7004F3F0E /* Build configuration list for PBXNativeTarget "KCOrderedAccessorFix" */; + buildPhases = ( + DA32D01C19D111C6004F3F0E /* Sources */, + DA32D01D19D111C6004F3F0E /* Frameworks */, + DA32D01E19D111C6004F3F0E /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = KCOrderedAccessorFix; + productName = KCOrderedAccessorFix; + productReference = DA32D02019D111C6004F3F0E /* libKCOrderedAccessorFix.a */; + productType = "com.apple.product-type.library.static"; + }; DA5BFA43147E415C00F98B1E /* MasterPassword */ = { isa = PBXNativeTarget; buildConfigurationList = DA5BFA6D147E415C00F98B1E /* Build configuration list for PBXNativeTarget "MasterPassword" */; @@ -2882,6 +2935,9 @@ LastUpgradeCheck = 0600; ORGANIZATIONNAME = Lyndir; TargetAttributes = { + DA32D01F19D111C6004F3F0E = { + CreatedOnToolsVersion = 6.0; + }; DA5BFA43147E415C00F98B1E = { DevelopmentTeam = HL3Q45LX9N; SystemCapabilities = { @@ -3003,6 +3059,7 @@ DAC6325C1486805C0075AEA5 /* uicolor-utilities */, DAC6326B148680650075AEA5 /* jrswizzle */, DAFC5654172C573B00CB5CC5 /* InAppSettingsKit */, + DA32D01F19D111C6004F3F0E /* KCOrderedAccessorFix */, ); }; /* End PBXProject section */ @@ -3203,6 +3260,14 @@ /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + DA32D01C19D111C6004F3F0E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DA32D03C19D111EB004F3F0E /* NSManagedObjectModel+KCOrderedAccessorFix.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; DA5BFA40147E415C00F98B1E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -3235,7 +3300,6 @@ 93D39A5FF670957C0AF8298D /* MPPasswordCell.m in Sources */, 93D398ECD7D1A0DEDDADF516 /* MPEmergencyViewController.m in Sources */, DA32D00819CF4735004F3F0E /* MasterPassword.xcdatamodeld in Sources */, - 93D391ED37C9F687FA51EAA1 /* MPPopoverSegue.m in Sources */, 93D394B5036C882B33C71872 /* MPPasswordsSegue.m in Sources */, 93D39673DDC085BE72C34D7C /* MPPopdownSegue.m in Sources */, 93D39BA1EA3CAAC8A220B4A6 /* MPAppSettingsViewController.m in Sources */, @@ -3248,6 +3312,7 @@ DA32CFF019CF1C8F004F3F0E /* MPUserEntity.m in Sources */, 93D39D38356F59DBEF934D70 /* MPAppDelegate_InApp.m in Sources */, 93D390C1B93F9D3AE37DD0A5 /* MPAnswersViewController.m in Sources */, + 93D399D7E08A142776A74CB8 /* MPOverlayViewController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3396,6 +3461,24 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + DA32D02E19D111C7004F3F0E /* Debug-iOS */ = { + isa = XCBuildConfiguration; + buildSettings = { + }; + name = "Debug-iOS"; + }; + DA32D02F19D111C7004F3F0E /* AdHoc-iOS */ = { + isa = XCBuildConfiguration; + buildSettings = { + }; + name = "AdHoc-iOS"; + }; + DA32D03019D111C7004F3F0E /* AppStore-iOS */ = { + isa = XCBuildConfiguration; + buildSettings = { + }; + name = "AppStore-iOS"; + }; DA5BFA6B147E415C00F98B1E /* Debug-iOS */ = { isa = XCBuildConfiguration; buildSettings = { @@ -3747,11 +3830,7 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_ARC = NO; - DSTROOT = /tmp/jrswizzle.dst; GCC_WARN_INHIBIT_ALL_WARNINGS = YES; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; }; name = "AppStore-iOS"; }; @@ -3783,11 +3862,7 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_ARC = NO; - DSTROOT = /tmp/jrswizzle.dst; GCC_WARN_INHIBIT_ALL_WARNINGS = YES; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; }; name = "Debug-iOS"; }; @@ -3795,11 +3870,7 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_OBJC_ARC = NO; - DSTROOT = /tmp/jrswizzle.dst; GCC_WARN_INHIBIT_ALL_WARNINGS = YES; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; }; name = "AdHoc-iOS"; }; @@ -3862,6 +3933,15 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + DA32D03419D111C7004F3F0E /* Build configuration list for PBXNativeTarget "KCOrderedAccessorFix" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DA32D02E19D111C7004F3F0E /* Debug-iOS */, + DA32D02F19D111C7004F3F0E /* AdHoc-iOS */, + DA32D03019D111C7004F3F0E /* AppStore-iOS */, + ); + defaultConfigurationIsVisible = 0; + }; DA5BFA3E147E415C00F98B1E /* Build configuration list for PBXProject "MasterPassword-iOS" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/MasterPassword/ObjC/iOS/Storyboard.storyboard b/MasterPassword/ObjC/iOS/Storyboard.storyboard index 098fadcc..45edf3c4 100644 --- a/MasterPassword/ObjC/iOS/Storyboard.storyboard +++ b/MasterPassword/ObjC/iOS/Storyboard.storyboard @@ -501,7 +501,7 @@ - + @@ -512,14 +512,36 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + @@ -558,7 +580,7 @@ - + @@ -1240,7 +1262,7 @@ - + @@ -2236,7 +2258,7 @@ However, it means that anyone who finds your device unlocked can do the same. - + @@ -2412,7 +2434,7 @@ See - + @@ -2772,9 +2794,13 @@ See + + + + - + @@ -2927,10 +2953,14 @@ See + - + + + + @@ -2977,8 +3007,8 @@ See - - + +