2
0

Fix removal of questions. Blast you Core Data.

This commit is contained in:
Maarten Billemont 2014-09-22 22:32:31 -04:00
parent b3ec7a848d
commit fe5828c724
12 changed files with 287 additions and 140 deletions

3
.gitmodules vendored
View File

@ -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

1
External/KCOrderedAccessorFix vendored Submodule

@ -0,0 +1 @@
Subproject commit e1955221bf52d53736e7d3e7d38465c509e02562

View File

@ -18,6 +18,8 @@
<string>github.com:Lyndir/Lyndir.git</string>
<key>2FE140B36B7D26140DC8D5E5C639DC5900EFCF35</key>
<string>git://github.com/lhunath/uicolor-utilities.git</string>
<key>304AD0F97EA7B4893D91DFB8C3413D4E627B9472</key>
<string>https://github.com/CFKevinRef/KCOrderedAccessorFix.git</string>
<key>3E67FB08419C920516AAC3B00DAAF23073B8CF77</key>
<string>git://github.com/lhunath/RHStatusItemView.git</string>
<key>4DDCFFD91B41F00326AD14553BD66CFD366ABD91</key>
@ -41,6 +43,8 @@
<string>../..</string>
<key>2FE140B36B7D26140DC8D5E5C639DC5900EFCF35</key>
<string>../External/Pearl/External/uicolor-utilities</string>
<key>304AD0F97EA7B4893D91DFB8C3413D4E627B9472</key>
<string>../External/KCOrderedAccessorFix/</string>
<key>3E67FB08419C920516AAC3B00DAAF23073B8CF77</key>
<string>../External/RHStatusItemView</string>
<key>4DDCFFD91B41F00326AD14553BD66CFD366ABD91</key>
@ -84,6 +88,14 @@
<key>IDESourceControlWCCName</key>
<string>jrswizzle</string>
</dict>
<dict>
<key>IDESourceControlRepositoryExtensionIdentifierKey</key>
<string>public.vcs.git</string>
<key>IDESourceControlWCCIdentifierKey</key>
<string>304AD0F97EA7B4893D91DFB8C3413D4E627B9472</string>
<key>IDESourceControlWCCName</key>
<string>KCOrderedAccessorFix</string>
</dict>
<dict>
<key>IDESourceControlRepositoryExtensionIdentifierKey</key>
<string>public.vcs.git</string>

View File

@ -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]

View File

@ -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

View File

@ -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 {

View File

@ -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 {

View File

@ -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 <Foundation/Foundation.h>
@interface MPPopoverSegue : UIStoryboardSegue
@interface MPOverlayViewController : UIViewController
@end
@interface MPOverlaySegue : UIStoryboardSegue
@end

View File

@ -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 <lhunath@lyndir.com>
* @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

View File

@ -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 <lhunath@lyndir.com>
* @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

View File

@ -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 = "<group>"; };
93D39067C0AFDC581794E2B8 /* NSArray+Indexing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSArray+Indexing.m"; sourceTree = "<group>"; };
@ -410,13 +424,13 @@
93D3924EE15017F8A12CB436 /* MPPasswordsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasswordsViewController.m; sourceTree = "<group>"; };
93D392876BE5C011DE73B43F /* MPPopdownSegue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPopdownSegue.h; sourceTree = "<group>"; };
93D393310223DDB35218467A /* MPCombinedViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPCombinedViewController.m; sourceTree = "<group>"; };
93D3937712BF1B67623E5764 /* MPPopoverSegue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPopoverSegue.m; sourceTree = "<group>"; };
93D393B97158D7BE9332EA53 /* NSDictionary+Indexing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDictionary+Indexing.h"; sourceTree = "<group>"; };
93D393BB973253D4BAAC84AA /* PearlEMail.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlEMail.m; sourceTree = "<group>"; };
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 = "<group>"; };
93D394482BB07F90E8FD1314 /* UIResponder+PearlFirstResponder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIResponder+PearlFirstResponder.h"; sourceTree = "<group>"; };
93D394C78C7B879C9AD9152C /* MPAppDelegate_InApp.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAppDelegate_InApp.m; sourceTree = "<group>"; };
93D395105935859D71679931 /* MPOverlayViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPOverlayViewController.m; sourceTree = "<group>"; };
93D3956915634581E737B38C /* PearlNavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlNavigationController.m; sourceTree = "<group>"; };
93D3957D76F71A652716EECC /* MPStoreViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPStoreViewController.m; sourceTree = "<group>"; };
93D396D04E57792A54D437AC /* NSArray+Indexing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSArray+Indexing.h"; sourceTree = "<group>"; };
@ -435,7 +449,6 @@
93D399F244BB522A317811BB /* MPFixable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPFixable.h; sourceTree = "<group>"; };
93D39A1DDFA09AE2E14D26DC /* UIResponder+PearlFirstResponder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIResponder+PearlFirstResponder.m"; sourceTree = "<group>"; };
93D39A28369954D147E239BA /* MPSetupViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPSetupViewController.m; sourceTree = "<group>"; };
93D39A41340CF778E00D0E6D /* MPPopoverSegue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPopoverSegue.h; sourceTree = "<group>"; };
93D39A4759186F6D2D34AA6B /* PearlSizedTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlSizedTextView.h; sourceTree = "<group>"; };
93D39A813CA9D7E192261ED2 /* MPFixable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPFixable.m; sourceTree = "<group>"; };
93D39AA10CD00D05937671B1 /* UITextView+PearlAttributes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UITextView+PearlAttributes.h"; sourceTree = "<group>"; };
@ -444,6 +457,7 @@
93D39B050DD5F55E9794EFD4 /* MPPopdownSegue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPopdownSegue.m; sourceTree = "<group>"; };
93D39B1D8177A86C5B9EDDE3 /* PearlUICollectionView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlUICollectionView.h; sourceTree = "<group>"; };
93D39B381350802A194BF332 /* MPAvatarCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAvatarCell.m; sourceTree = "<group>"; };
93D39B455A71EC98C749E623 /* MPOverlayViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPOverlayViewController.h; sourceTree = "<group>"; };
93D39BAA71DE51B4D8A1286C /* MPCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPCell.m; sourceTree = "<group>"; };
93D39C426E03358384018E85 /* MPAnswersViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAnswersViewController.m; sourceTree = "<group>"; };
93D39C44361BE57AF0B3071F /* MPPasswordsSegue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordsSegue.h; sourceTree = "<group>"; };
@ -526,6 +540,9 @@
DA32D00719CF4735004F3F0E /* MasterPassword 6.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "MasterPassword 6.xcdatamodel"; sourceTree = "<group>"; };
DA32D01819D046E1004F3F0E /* PearlFixedTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlFixedTableView.m; sourceTree = "<group>"; };
DA32D01919D046E1004F3F0E /* PearlFixedTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlFixedTableView.h; sourceTree = "<group>"; };
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 = "<group>"; };
DA32D03A19D111EB004F3F0E /* NSManagedObjectModel+KCOrderedAccessorFix.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSManagedObjectModel+KCOrderedAccessorFix.m"; sourceTree = "<group>"; };
DA3509FC15F101A500C14A8E /* PearlQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlQueue.h; sourceTree = "<group>"; };
DA3509FD15F101A500C14A8E /* PearlQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlQueue.m; sourceTree = "<group>"; };
DA38D6A218CCB5BF009AEB3E /* Storyboard.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Storyboard.storyboard; sourceTree = "<group>"; };
@ -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 = "<group>";
};
DA32D03719D111EB004F3F0E /* KCOrderedAccessorFix */ = {
isa = PBXGroup;
children = (
DA32D03919D111EB004F3F0E /* NSManagedObjectModel+KCOrderedAccessorFix.h */,
DA32D03A19D111EB004F3F0E /* NSManagedObjectModel+KCOrderedAccessorFix.m */,
);
path = KCOrderedAccessorFix;
sourceTree = "<group>";
};
DA5BFA39147E415C00F98B1E = {
isa = PBXGroup;
children = (
@ -1493,6 +1527,7 @@
DAC6325D1486805C0075AEA5 /* libuicolor-utilities.a */,
DAC6326C148680650075AEA5 /* libjrswizzle.a */,
DAFC5655172C573B00CB5CC5 /* libInAppSettingsKit.a */,
DA32D02019D111C6004F3F0E /* libKCOrderedAccessorFix.a */,
);
name = Products;
sourceTree = "<group>";
@ -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 = "<group>";
@ -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 = (

View File

@ -501,7 +501,7 @@
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="hNt-WS-DuE" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="116.5" y="-468.5"/>
<point key="canvasLocation" x="-635.5" y="-468.5"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="bzn-yi-kMJ">
@ -512,14 +512,36 @@
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<connections>
<segue destination="Ac5-na-hOV" kind="relationship" relationship="rootViewController" id="7h0-mv-UM6"/>
<segue destination="Ec4-G7-5Td" kind="modal" identifier="setup" id="CsD-w4-Lhp"/>
<segue destination="Sd5-eW-Cx2" kind="modal" identifier="web" id="GZk-I4-JyH"/>
<segue destination="75s-Nx-bFx" kind="relationship" relationship="rootViewController" id="dw4-WI-jrU"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="OhM-cb-bMF" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="116.5" y="463.5"/>
<point key="canvasLocation" x="-635.5" y="463.5"/>
</scene>
<!--Overlay View Controller-->
<scene sceneID="qoN-BR-PG3">
<objects>
<viewController id="75s-Nx-bFx" customClass="MPOverlayViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="Y5O-uw-2Ej"/>
<viewControllerLayoutGuide type="bottom" id="oyZ-Ts-gaF"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="c4P-nn-PjR">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</view>
<navigationItem key="navigationItem" id="V6W-ql-3TD"/>
<connections>
<segue destination="Ac5-na-hOV" kind="custom" identifier="root" customClass="MPOverlaySegue" id="UKS-gd-oD2"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="fQY-fV-sIe" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="84.5" y="463.5"/>
</scene>
<!--Combined View Controller-->
<scene sceneID="KiK-hf-Mfd">
@ -558,7 +580,7 @@
<nil key="simulatedTopBarMetrics"/>
<connections>
<outlet property="usersView" destination="jDK-5y-QRP" id="cuP-gN-eBE"/>
<segue destination="osn-5H-SWW" kind="custom" identifier="emergency" customClass="MPPopoverSegue" id="gtX-Cx-AA2"/>
<segue destination="osn-5H-SWW" kind="custom" identifier="emergency" customClass="MPOverlaySegue" id="gtX-Cx-AA2"/>
<segue destination="nkY-z6-8jd" kind="custom" identifier="passwords" customClass="MPPasswordsSegue" id="Ozp-YT-Utx"/>
</connections>
</viewController>
@ -1240,7 +1262,7 @@
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<segue destination="aow-In-vb8" kind="custom" identifier="answers" customClass="MPPopoverSegue" id="5Wo-YZ-8HZ"/>
<segue destination="aow-In-vb8" kind="custom" identifier="answers" customClass="MPOverlaySegue" id="5Wo-YZ-8HZ"/>
</connections>
</button>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" alpha="0.5" contentMode="left" text="1" textAlignment="right" lineBreakMode="tailTruncation" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="PKP-M9-T8E" userLabel="Counter">
@ -2148,7 +2170,7 @@ Suspendisse potenti. Etiam ut nisi id augue tempor ultrices et sit amet sapien.
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="sCQ-j4-a2p" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="116.5" y="1319.5"/>
<point key="canvasLocation" x="-635.5" y="1319.5"/>
</scene>
<!--Security-->
<scene sceneID="GSG-87-pnH">
@ -2236,7 +2258,7 @@ However, it means that anyone who finds your device unlocked can do the same.</s
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="HhJ-mB-A8g" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="116.5" y="2175.5"/>
<point key="canvasLocation" x="-635.5" y="2175.5"/>
</scene>
<!--About-->
<scene sceneID="p3O-pB-vAg">
@ -2412,7 +2434,7 @@ See </string>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="xht-w2-261" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="116.5" y="2995.5"/>
<point key="canvasLocation" x="-635.5" y="2995.5"/>
</scene>
<!--Store-->
<scene sceneID="j3J-72-mva">
@ -2772,9 +2794,13 @@ See </string>
<segue destination="iXL-Dr-gEZ" kind="unwind" identifier="unwind-popover" unwindAction="unwindToCombined:" id="uvN-tM-jSz"/>
</connections>
</button>
<toolbar opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" barStyle="black" translatesAutoresizingMaskIntoConstraints="NO" id="CqV-Mw-g16">
<rect key="frame" x="0.0" y="294" width="375" height="373"/>
<items/>
</toolbar>
<tableView opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" placeholderIntrinsicWidth="infinite" placeholderIntrinsicHeight="373" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" translatesAutoresizingMaskIntoConstraints="NO" id="vKY-AK-ugj" customClass="PearlFixedTableView">
<rect key="frame" x="0.0" y="294" width="375" height="373"/>
<color key="backgroundColor" red="0.12549020350000001" green="0.1411764771" blue="0.14901961389999999" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<inset key="scrollIndicatorInsets" minX="0.0" minY="64" maxX="0.0" maxY="49"/>
<color key="separatorColor" red="0.37254901959999998" green="0.3921568627" blue="0.42745098040000001" alpha="1" colorSpace="calibratedRGB"/>
<prototypes>
@ -2927,10 +2953,14 @@ See </string>
</subviews>
<color key="backgroundColor" cocoaTouchSystemColor="viewFlipsideBackgroundColor"/>
<constraints>
<constraint firstItem="CqV-Mw-g16" firstAttribute="bottom" secondItem="vKY-AK-ugj" secondAttribute="bottom" id="30y-ji-78v"/>
<constraint firstAttribute="trailing" secondItem="vKY-AK-ugj" secondAttribute="trailing" id="5Nj-ev-quC"/>
<constraint firstItem="vKY-AK-ugj" firstAttribute="top" relation="greaterThanOrEqual" secondItem="i3q-t5-XCA" secondAttribute="top" constant="200" id="F0k-Ku-5zl"/>
<constraint firstItem="CqV-Mw-g16" firstAttribute="trailing" secondItem="vKY-AK-ugj" secondAttribute="trailing" id="E2C-Rh-xat"/>
<constraint firstItem="vKY-AK-ugj" firstAttribute="top" relation="greaterThanOrEqual" secondItem="i3q-t5-XCA" secondAttribute="top" constant="100" id="F0k-Ku-5zl"/>
<constraint firstItem="CqV-Mw-g16" firstAttribute="leading" secondItem="vKY-AK-ugj" secondAttribute="leading" id="J9c-YW-ANL"/>
<constraint firstItem="vKY-AK-ugj" firstAttribute="leading" secondItem="i3q-t5-XCA" secondAttribute="leading" id="RZC-h2-KpP"/>
<constraint firstAttribute="trailing" secondItem="JMb-s5-kLc" secondAttribute="trailing" id="Tz3-kq-5jq"/>
<constraint firstItem="CqV-Mw-g16" firstAttribute="top" secondItem="vKY-AK-ugj" secondAttribute="top" id="U40-id-tLK"/>
<constraint firstItem="9uS-oI-qfo" firstAttribute="top" secondItem="vKY-AK-ugj" secondAttribute="bottom" id="WiT-cf-a89"/>
<constraint firstItem="JMb-s5-kLc" firstAttribute="top" secondItem="i3q-t5-XCA" secondAttribute="top" id="ZIm-Ua-ZtR"/>
<constraint firstItem="JMb-s5-kLc" firstAttribute="leading" secondItem="i3q-t5-XCA" secondAttribute="leading" id="cjI-Sn-WaM"/>
@ -2977,8 +3007,8 @@ See </string>
<simulatedScreenMetrics key="destination" type="retina47"/>
</simulatedMetricsContainer>
<inferredMetricsTieBreakers>
<segue reference="Ql4-wf-T8u"/>
<segue reference="gtb-zE-u9H"/>
<segue reference="GZk-I4-JyH"/>
<segue reference="k2G-nL-x3l"/>
</inferredMetricsTieBreakers>
<color key="tintColor" name="controlLightHighlightColor" catalog="System" colorSpace="catalog"/>
</document>