Compare commits

...

24 Commits

Author SHA1 Message Date
Ryan Olson 8aece0a266 Update README 2015-12-14 08:31:42 -08:00
Ryan Olson 81b27b6918 Modify approach to toggling views and menu modals.
This approach seems to eliminate some of the status bar issues we were seeing.
2015-12-13 23:21:43 -08:00
Ryan Olson 727943c4b3 Merge pull request #92 from WangHengHeng/master
- (void)toggle***Tool - It is not necessary to 'dismiss' when 'present'
2015-12-13 23:12:41 -08:00
Ryan Olson 9f2c032157 List FLEX.h in the public headers in the podspec 2015-12-13 23:06:40 -08:00
Ryan Olson d6a5b1af8d Bump podspec iOS version to 8.0 2015-12-13 23:03:09 -08:00
Ryan Olson dda9dd5beb Move to UISearchController in FLEXSystemLogTableViewController 2015-12-13 22:55:57 -08:00
Ryan Olson 888887f09a Move to UISearchController in FLEXNetworkHistoryTableViewController 2015-12-13 22:46:46 -08:00
Ryan Olson b70a1a2f48 Move to UISearchController in FLEXFileBrowserTableViewController 2015-12-13 22:15:45 -08:00
Ryan Olson 54730c368c Use FLEX.framework in example project
Bump example project deployment target to iOS 8 so we can link to the dynamic framework.
2015-12-13 21:09:20 -08:00
Ryan Olson 21672e6f8d Merge pull request #93 from tttpeng/master
Add a sqlite database browser
2015-12-12 19:11:12 -08:00
Taavo 4ffc992872 Fix some problems about database browser 2015-12-06 04:32:26 +08:00
tttpeng 8eea2ec652 Remove useless methods, About sqlite browser 2015-12-02 12:00:40 +08:00
王 原闯 3df01ee7bb dismiss previous present viewController before present a new one 2015-12-02 10:53:55 +08:00
Ryan Olson d0ad6e4319 Merge pull request #94 from untouchable741/master
Support searching for view pointer address in FLEXHierarchyTableViewC…
2015-12-01 08:26:43 -08:00
Tai Vuong 37aec6dacc Support searching for view pointer address in FLEXHierarchyTableViewController 2015-12-01 22:32:24 +07:00
王 原闯 cdc5aae4b7 - (void)toggle***Tool - It is not necessary to 'dismiss' when 'present' 2015-11-30 18:01:19 +08:00
tttpeng fd2b89fd24 Add sqlite database browser 2015-11-30 17:36:41 +08:00
Ryan Olson f1683e54c3 Add support for force touch in the simulator 2015-11-16 11:37:57 -08:00
Ryan Olson c66dd2e7d3 Merge pull request #85 from dlo/master
Use Objective-C 2.0 subscripting
2015-11-09 06:29:55 -08:00
Ryan Olson 5a5b921bbf Merge pull request #89 from revolter/patch-1
Update FLEXManager.m
2015-11-09 06:27:26 -08:00
Iulian Onofrei 30cc65bd9d Update FLEXManager.m
Fix help screen typo
2015-11-09 11:18:29 +02:00
Dan Loewenherz 29a45aa02d use Objective-C 2.0 subscripting for dictionaries 2015-10-31 17:37:45 -05:00
Dan Loewenherz 08b25ea8d3 use Objective-C 2.0 subscripting for arrays 2015-10-31 17:35:47 -05:00
Ryan Olson 7ffcb83563 Bump version in FLEX.podspec 2015-10-28 20:05:54 -07:00
45 changed files with 1544 additions and 812 deletions
@@ -31,7 +31,7 @@
inputView.targetSize = FLEXArgumentInputViewSizeSmall;
if (fieldIndex < [customTitles count]) {
inputView.title = [customTitles objectAtIndex:fieldIndex];
inputView.title = customTitles[fieldIndex];
} else {
inputView.title = [NSString stringWithFormat:@"%@ field %lu (%@)", structName, (unsigned long)fieldIndex, prettyTypeEncoding];
}
@@ -72,7 +72,7 @@
[FLEXRuntimeUtility enumerateTypesInStructEncoding:structTypeEncoding usingBlock:^(NSString *structName, const char *fieldTypeEncoding, NSString *prettyTypeEncoding, NSUInteger fieldIndex, NSUInteger fieldOffset) {
void *fieldPointer = unboxedValue + fieldOffset;
FLEXArgumentInputView *inputView = [self.argumentInputViews objectAtIndex:fieldIndex];
FLEXArgumentInputView *inputView = self.argumentInputViews[fieldIndex];
if (fieldTypeEncoding[0] == @encode(id)[0] || fieldTypeEncoding[0] == @encode(Class)[0]) {
inputView.inputValue = (__bridge id)fieldPointer;
@@ -102,7 +102,7 @@
[FLEXRuntimeUtility enumerateTypesInStructEncoding:structTypeEncoding usingBlock:^(NSString *structName, const char *fieldTypeEncoding, NSString *prettyTypeEncoding, NSUInteger fieldIndex, NSUInteger fieldOffset) {
void *fieldPointer = unboxedStruct + fieldOffset;
FLEXArgumentInputView *inputView = [self.argumentInputViews objectAtIndex:fieldIndex];
FLEXArgumentInputView *inputView = self.argumentInputViews[fieldIndex];
if (fieldTypeEncoding[0] == @encode(id)[0] || fieldTypeEncoding[0] == @encode(Class)[0]) {
// Object fields
@@ -331,9 +331,9 @@ typedef NS_ENUM(NSUInteger, FLEXExplorerMode) {
{
NSUInteger indexOfView = [self.viewsAtTapPoint indexOfObject:object];
if (indexOfView != NSNotFound) {
UIView *view = [self.viewsAtTapPoint objectAtIndex:indexOfView];
UIView *view = self.viewsAtTapPoint[indexOfView];
NSValue *key = [NSValue valueWithNonretainedObject:view];
UIView *outline = [self.outlineViewsForVisibleViews objectForKey:key];
UIView *outline = self.outlineViewsForVisibleViews[key];
if (outline) {
outline.frame = [self frameInLocalCoordinatesForView:view];
}
@@ -841,13 +841,20 @@ typedef NS_ENUM(NSUInteger, FLEXExplorerMode) {
if (viewsModalShown) {
[self resignKeyAndDismissViewControllerAnimated:YES completion:nil];
} else {
[self resignKeyAndDismissViewControllerAnimated:NO completion:nil];
NSArray *allViews = [self allViewsInHierarchy];
NSDictionary *depthsForViews = [self hierarchyDepthsForViews:allViews];
FLEXHierarchyTableViewController *hierarchyTVC = [[FLEXHierarchyTableViewController alloc] initWithViews:allViews viewsAtTap:self.viewsAtTapPoint selectedView:self.selectedView depths:depthsForViews];
hierarchyTVC.delegate = self;
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:hierarchyTVC];
[self makeKeyAndPresentViewController:navigationController animated:YES completion:nil];
void (^presentBlock)() = ^{
NSArray *allViews = [self allViewsInHierarchy];
NSDictionary *depthsForViews = [self hierarchyDepthsForViews:allViews];
FLEXHierarchyTableViewController *hierarchyTVC = [[FLEXHierarchyTableViewController alloc] initWithViews:allViews viewsAtTap:self.viewsAtTapPoint selectedView:self.selectedView depths:depthsForViews];
hierarchyTVC.delegate = self;
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:hierarchyTVC];
[self makeKeyAndPresentViewController:navigationController animated:YES completion:nil];
};
if (self.presentedViewController) {
[self resignKeyAndDismissViewControllerAnimated:NO completion:presentBlock];
} else {
presentBlock();
}
}
}
@@ -858,12 +865,19 @@ typedef NS_ENUM(NSUInteger, FLEXExplorerMode) {
if (menuModalShown) {
[self resignKeyAndDismissViewControllerAnimated:YES completion:nil];
} else {
[self resignKeyAndDismissViewControllerAnimated:NO completion:nil];
FLEXGlobalsTableViewController *globalsViewController = [[FLEXGlobalsTableViewController alloc] init];
globalsViewController.delegate = self;
[FLEXGlobalsTableViewController setApplicationWindow:[[UIApplication sharedApplication] keyWindow]];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:globalsViewController];
[self makeKeyAndPresentViewController:navigationController animated:YES completion:nil];
void (^presentBlock)() = ^{
FLEXGlobalsTableViewController *globalsViewController = [[FLEXGlobalsTableViewController alloc] init];
globalsViewController.delegate = self;
[FLEXGlobalsTableViewController setApplicationWindow:[[UIApplication sharedApplication] keyWindow]];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:globalsViewController];
[self makeKeyAndPresentViewController:navigationController animated:YES completion:nil];
};
if (self.presentedViewController) {
[self resignKeyAndDismissViewControllerAnimated:NO completion:presentBlock];
} else {
presentBlock();
}
}
}
+1 -1
View File
@@ -171,7 +171,7 @@
[self registerSimulatorShortcutWithKey:@"g" modifiers:0 action:^{
[self showExplorerIfNeeded];
[self.explorerViewController toggleMenuTool];
} description:@"Toggle FLEX globlas menu"];
} description:@"Toggle FLEX globals menu"];
[self registerSimulatorShortcutWithKey:@"v" modifiers:0 action:^{
[self showExplorerIfNeeded];
@@ -0,0 +1,26 @@
//
// PTDatabaseManager.h
// Derived from:
//
// FMDatabase.h
// FMDB( https://github.com/ccgus/fmdb )
//
// Created by Peng Tao on 15/11/23.
//
// Licensed to Flying Meat Inc. under one or more contributor license agreements.
// See the LICENSE file distributed with this work for the terms under
// which Flying Meat Inc. licenses this file to you.
#import <Foundation/Foundation.h>
@interface FLEXDatabaseManager : NSObject
- (instancetype)initWithPath:(NSString*)aPath;
- (BOOL)open;
- (NSArray *)queryAllTables;
- (NSArray *)queryAllColumnsWithTableName:(NSString *)tableName;
- (NSArray *)queryAllDataWithTableName:(NSString *)tableName;
@end
@@ -0,0 +1,195 @@
//
// PTDatabaseManager.m
// PTDatabaseReader
//
// Created by Peng Tao on 15/11/23.
// Copyright © 2015年 Peng Tao. All rights reserved.
//
#import "FLEXDatabaseManager.h"
#import <sqlite3.h>
static NSString *const QUERY_TABLENAMES_SQL = @"SELECT name FROM sqlite_master WHERE type='table' ORDER BY name";
@implementation FLEXDatabaseManager
{
sqlite3* _db;
NSString* _databasePath;
}
- (instancetype)initWithPath:(NSString*)aPath
{
self = [super init];
if (self) {
_databasePath = [aPath copy];
}
return self;
}
- (BOOL)open {
if (_db) {
return YES;
}
int err = sqlite3_open([_databasePath UTF8String], &_db);
if(err != SQLITE_OK) {
NSLog(@"error opening!: %d", err);
return NO;
}
return YES;
}
- (BOOL)close {
if (!_db) {
return YES;
}
int rc;
BOOL retry;
BOOL triedFinalizingOpenStatements = NO;
do {
retry = NO;
rc = sqlite3_close(_db);
if (SQLITE_BUSY == rc || SQLITE_LOCKED == rc) {
if (!triedFinalizingOpenStatements) {
triedFinalizingOpenStatements = YES;
sqlite3_stmt *pStmt;
while ((pStmt = sqlite3_next_stmt(_db, nil)) !=0) {
NSLog(@"Closing leaked statement");
sqlite3_finalize(pStmt);
retry = YES;
}
}
}
else if (SQLITE_OK != rc) {
NSLog(@"error closing!: %d", rc);
}
}
while (retry);
_db = nil;
return YES;
}
- (NSArray *)queryAllTables
{
return [self executeQuery:QUERY_TABLENAMES_SQL];
}
- (NSArray *)queryAllColumnsWithTableName:(NSString *)tableName
{
NSString *sql = [NSString stringWithFormat:@"PRAGMA table_info('%@')",tableName];
NSArray *resultArray = [self executeQuery:sql];
NSMutableArray *array = [NSMutableArray array];
for (NSDictionary *dict in resultArray) {
[array addObject:dict[@"name"]];
}
return array;
}
- (NSArray *)queryAllDataWithTableName:(NSString *)tableName
{
NSString *sql = [NSString stringWithFormat:@"SELECT * FROM %@",tableName];
return [self executeQuery:sql];
}
#pragma mark -
#pragma mark - Private
- (NSArray *)executeQuery:(NSString *)sql
{
[self open];
NSMutableArray *resultArray = [NSMutableArray array];
sqlite3_stmt *pstmt;
if (sqlite3_prepare_v2(_db, [sql UTF8String], -1, &pstmt, 0) == SQLITE_OK) {
while (sqlite3_step(pstmt) == SQLITE_ROW) {
NSUInteger num_cols = (NSUInteger)sqlite3_data_count(pstmt);
if (num_cols > 0) {
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:num_cols];
int columnCount = sqlite3_column_count(pstmt);
int columnIdx = 0;
for (columnIdx = 0; columnIdx < columnCount; columnIdx++) {
NSString *columnName = [NSString stringWithUTF8String:sqlite3_column_name(pstmt, columnIdx)];
id objectValue = [self objectForColumnIndex:columnIdx stmt:pstmt];
[dict setObject:objectValue forKey:columnName];
}
[resultArray addObject:dict];
}
}
}
[self close];
return resultArray;
}
- (id)objectForColumnIndex:(int)columnIdx stmt:(sqlite3_stmt*)stmt {
int columnType = sqlite3_column_type(stmt, columnIdx);
id returnValue = nil;
if (columnType == SQLITE_INTEGER) {
returnValue = [NSNumber numberWithLongLong:sqlite3_column_int64(stmt, columnIdx)];
}
else if (columnType == SQLITE_FLOAT) {
returnValue = [NSNumber numberWithDouble:sqlite3_column_double(stmt, columnIdx)];
}
else if (columnType == SQLITE_BLOB) {
returnValue = [self dataForColumnIndex:columnIdx stmt:stmt];
}
else {
//default to a string for everything else
returnValue = [self stringForColumnIndex:columnIdx stmt:stmt];
}
if (returnValue == nil) {
returnValue = [NSNull null];
}
return returnValue;
}
- (NSString *)stringForColumnIndex:(int)columnIdx stmt:(sqlite3_stmt *)stmt {
if (sqlite3_column_type(stmt, columnIdx) == SQLITE_NULL || (columnIdx < 0)) {
return nil;
}
const char *c = (const char *)sqlite3_column_text(stmt, columnIdx);
if (!c) {
// null row.
return nil;
}
return [NSString stringWithUTF8String:c];
}
- (NSData *)dataForColumnIndex:(int)columnIdx stmt:(sqlite3_stmt *)stmt{
if (sqlite3_column_type(stmt, columnIdx) == SQLITE_NULL || (columnIdx < 0)) {
return nil;
}
const char *dataBuffer = sqlite3_column_blob(stmt, columnIdx);
int dataSize = sqlite3_column_bytes(stmt, columnIdx);
if (dataBuffer == NULL) {
return nil;
}
return [NSData dataWithBytes:(const void *)dataBuffer length:(NSUInteger)dataSize];
}
@end
@@ -0,0 +1,48 @@
//
// PTMultiColumnTableView.h
// PTMultiColumnTableViewDemo
//
// Created by Peng Tao on 15/11/16.
// Copyright © 2015年 Peng Tao. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "FLEXTableColumnHeader.h"
@class FLEXMultiColumnTableView;
@protocol FLEXMultiColumnTableViewDelegate <NSObject>
@required
- (void)multiColumnTableView:(FLEXMultiColumnTableView *)tableView didTapLabelWithText:(NSString *)text;
- (void)multiColumnTableView:(FLEXMultiColumnTableView *)tableView didTapHeaderWithText:(NSString *)text sortType:(FLEXTableColumnHeaderSortType)sortType;
@end
@protocol FLEXMultiColumnTableViewDataSource <NSObject>
@required
- (NSInteger)numberOfColumnsInTableView:(FLEXMultiColumnTableView *)tableView;
- (NSInteger)numberOfRowsInTableView:(FLEXMultiColumnTableView *)tableView;
- (NSString *)columnNameInColumn:(NSInteger)column;
- (NSString *)rowNameInRow:(NSInteger)row;
- (NSString *)contentAtColumn:(NSInteger)column row:(NSInteger)row;
- (NSArray *)contentAtRow:(NSInteger)row;
- (CGFloat)multiColumnTableView:(FLEXMultiColumnTableView *)tableView widthForContentCellInColumn:(NSInteger)column;
- (CGFloat)multiColumnTableView:(FLEXMultiColumnTableView *)tableView heightForContentCellInRow:(NSInteger)row;
- (CGFloat)heightForTopHeaderInTableView:(FLEXMultiColumnTableView *)tableView;
- (CGFloat)widthForLeftHeaderInTableView:(FLEXMultiColumnTableView *)tableView;
@end
@interface FLEXMultiColumnTableView : UIView
@property (nonatomic, weak) id<FLEXMultiColumnTableViewDataSource>dataSource;
@property (nonatomic, weak) id<FLEXMultiColumnTableViewDelegate>delegate;
- (void)reloadData;
@end
@@ -0,0 +1,341 @@
//
// PTMultiColumnTableView.m
// PTMultiColumnTableViewDemo
//
// Created by Peng Tao on 15/11/16.
// Copyright © 2015年 Peng Tao. All rights reserved.
//
#import "FLEXMultiColumnTableView.h"
#import "FLEXTableContentCell.h"
#import "FLEXTableLeftCell.h"
@interface FLEXMultiColumnTableView ()
<UITableViewDataSource, UITableViewDelegate,UIScrollViewDelegate, FLEXTableContentCellDelegate>
@property (nonatomic, strong) UIScrollView *contentScrollView;
@property (nonatomic, strong) UIScrollView *headerScrollView;
@property (nonatomic, strong) UITableView *leftTableView;
@property (nonatomic, strong) UITableView *contentTableView;
@property (nonatomic, strong) UIView *leftHeader;
@property (nonatomic, strong) NSDictionary *sortStatusDict;
@property (nonatomic, strong) NSArray *rowData;
@end
static const CGFloat kColumnMargin = 1;
@implementation FLEXMultiColumnTableView
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self loadUI];
}
return self;
}
- (void)didMoveToSuperview
{
[super didMoveToSuperview];
[self reloadData];
}
- (void)layoutSubviews
{
[super layoutSubviews];
CGFloat width = self.frame.size.width;
CGFloat height = self.frame.size.height;
CGFloat topheaderHeight = [self topHeaderHeight];
CGFloat leftHeaderWidth = [self leftHeaderWidth];
CGFloat contentWidth = 0.0;
NSInteger rowsCount = [self numberOfColumns];
for (int i = 0; i < rowsCount; i++) {
contentWidth += [self contentWidthForColumn:i];
}
self.leftTableView.frame = CGRectMake(0, topheaderHeight, leftHeaderWidth, height - topheaderHeight);
self.headerScrollView.frame = CGRectMake(leftHeaderWidth, 0, width - leftHeaderWidth, topheaderHeight);
self.headerScrollView.contentSize = CGSizeMake( self.contentTableView.frame.size.width, self.headerScrollView.frame.size.height);
self.contentTableView.frame = CGRectMake(0, 0, contentWidth + [self numberOfColumns] * [self columnMargin] , height - topheaderHeight);
self.contentScrollView.frame = CGRectMake(leftHeaderWidth, topheaderHeight, width - leftHeaderWidth, height - topheaderHeight);
self.contentScrollView.contentSize = self.contentTableView.frame.size;
self.leftHeader.frame = CGRectMake(0, 0, [self leftHeaderWidth], [self topHeaderHeight]);
}
- (void)loadUI
{
[self loadHeaderScrollView];
[self loadContentScrollView];
[self loadLeftView];
}
- (void)reloadData
{
[self loadLeftViewData];
[self loadContentData];
[self loadHeaderData];
}
#pragma mark - UI
- (void)loadHeaderScrollView
{
UIScrollView *headerScrollView = [[UIScrollView alloc] init];
headerScrollView.delegate = self;
self.headerScrollView = headerScrollView;
self.headerScrollView.backgroundColor = [UIColor colorWithWhite:0.803 alpha:0.850];
[self addSubview:headerScrollView];
}
- (void)loadContentScrollView
{
UIScrollView *scrollView = [[UIScrollView alloc] init];
scrollView.bounces = NO;
scrollView.delegate = self;
UITableView *tableView = [[UITableView alloc] init];
tableView.delegate = self;
tableView.dataSource = self;
tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
[self addSubview:scrollView];
[scrollView addSubview:tableView];
self.contentScrollView = scrollView;
self.contentTableView = tableView;
}
- (void)loadLeftView
{
UITableView *leftTableView = [[UITableView alloc] init];
leftTableView.delegate = self;
leftTableView.dataSource = self;
leftTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
self.leftTableView = leftTableView;
[self addSubview:leftTableView];
UIView *leftHeader = [[UIView alloc] init];
leftHeader.backgroundColor = [UIColor colorWithWhite:0.950 alpha:0.668];
self.leftHeader = leftHeader;
[self addSubview:leftHeader];
}
#pragma mark - Data
- (void)loadHeaderData
{
NSArray *subviews = self.headerScrollView.subviews;
for (UIView *subview in subviews) {
[subview removeFromSuperview];
}
CGFloat x = 0.0;
CGFloat w = 0.0;
for (int i = 0; i < [self numberOfColumns] ; i++) {
w = [self contentWidthForColumn:i] + [self columnMargin];
FLEXTableColumnHeader *cell = [[FLEXTableColumnHeader alloc] initWithFrame:CGRectMake(x, 0, w, [self topHeaderHeight] - 1)];
cell.label.text = [self columnTitleForColumn:i];
[self.headerScrollView addSubview:cell];
FLEXTableColumnHeaderSortType type = [self.sortStatusDict[[self columnTitleForColumn:i]] integerValue];
[cell changeSortStatusWithType:type];
UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(contentHeaderTap:)];
[cell addGestureRecognizer:gesture];
cell.userInteractionEnabled = YES;
x = x + w;
}
}
- (void)contentHeaderTap:(UIGestureRecognizer *)gesture
{
FLEXTableColumnHeader *header = (FLEXTableColumnHeader *)gesture.view;
NSString *string = header.label.text;
FLEXTableColumnHeaderSortType currentType = [self.sortStatusDict[string] integerValue];
FLEXTableColumnHeaderSortType newType ;
switch (currentType) {
case FLEXTableColumnHeaderSortTypeNone:
newType = FLEXTableColumnHeaderSortTypeAsc;
break;
case FLEXTableColumnHeaderSortTypeAsc:
newType = FLEXTableColumnHeaderSortTypeDesc;
break;
case FLEXTableColumnHeaderSortTypeDesc:
newType = FLEXTableColumnHeaderSortTypeAsc;
break;
}
self.sortStatusDict = @{header.label.text : @(newType)};
[header changeSortStatusWithType:newType];
[self.delegate multiColumnTableView:self didTapHeaderWithText:string sortType:newType];
}
- (void)loadContentData
{
[self.contentTableView reloadData];
}
- (void)loadLeftViewData
{
[self.leftTableView reloadData];
}
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UIColor *backgroundColor = [UIColor whiteColor];
if (indexPath.row % 2 != 0) {
backgroundColor = [UIColor colorWithWhite:0.950 alpha:0.750];
}
if (tableView != self.leftTableView) {
self.rowData = [self.dataSource contentAtRow:indexPath.row];
FLEXTableContentCell *cell = [FLEXTableContentCell cellWithTableView:tableView
columnNumber:[self numberOfColumns]];
cell.contentView.backgroundColor = backgroundColor;
cell.delegate = self;
for (int i = 0 ; i < cell.labels.count; i++) {
UILabel *label = cell.labels[i];
label.textColor = [UIColor blackColor];
NSString *content = [NSString stringWithFormat:@"%@",self.rowData[i]];
if ([content isEqualToString:@"<null>"]) {
label.textColor = [UIColor lightGrayColor];
content = @"NULL";
}
label.text = content;
label.backgroundColor = backgroundColor;
}
return cell;
}
else {
FLEXTableLeftCell *cell = [FLEXTableLeftCell cellWithTableView:tableView];
cell.contentView.backgroundColor = backgroundColor;
cell.titlelabel.text = [self rowTitleForRow:indexPath.row];
return cell;
}
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [self.dataSource numberOfRowsInTableView:self];
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return [self.dataSource multiColumnTableView:self heightForContentCellInRow:indexPath.row];
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (scrollView == self.contentScrollView) {
self.headerScrollView.contentOffset = scrollView.contentOffset;
}
else if (scrollView == self.headerScrollView) {
self.contentScrollView.contentOffset = scrollView.contentOffset;
}
else if (scrollView == self.leftTableView) {
self.contentTableView.contentOffset = scrollView.contentOffset;
}
else if (scrollView == self.contentTableView) {
self.leftTableView.contentOffset = scrollView.contentOffset;
}
}
#pragma mark -
#pragma mark UITableView Delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (tableView == self.leftTableView) {
[self.contentTableView selectRowAtIndexPath:indexPath
animated:NO
scrollPosition:UITableViewScrollPositionNone];
}
else if (tableView == self.contentTableView) {
[self.leftTableView selectRowAtIndexPath:indexPath
animated:NO
scrollPosition:UITableViewScrollPositionNone];
}
}
#pragma mark -
#pragma mark DataSource Accessor
- (NSInteger)numberOfrows
{
return [self.dataSource numberOfRowsInTableView:self];
}
- (NSInteger)numberOfColumns
{
return [self.dataSource numberOfColumnsInTableView:self];
}
- (NSString *)columnTitleForColumn:(NSInteger)column
{
return [self.dataSource columnNameInColumn:column];
}
- (NSString *)rowTitleForRow:(NSInteger)row
{
return [self.dataSource rowNameInRow:row];
}
- (NSString *)contentAtColumn:(NSInteger)column row:(NSInteger)row;
{
return [self.dataSource contentAtColumn:column row:row];
}
- (CGFloat)contentWidthForColumn:(NSInteger)column
{
return [self.dataSource multiColumnTableView:self widthForContentCellInColumn:column];
}
- (CGFloat)contentHeightForRow:(NSInteger)row
{
return [self.dataSource multiColumnTableView:self heightForContentCellInRow:row];
}
- (CGFloat)topHeaderHeight
{
return [self.dataSource heightForTopHeaderInTableView:self];
}
- (CGFloat)leftHeaderWidth
{
return [self.dataSource widthForLeftHeaderInTableView:self];
}
- (CGFloat)columnMargin
{
return kColumnMargin;
}
- (void)tableContentCell:(FLEXTableContentCell *)tableView labelDidTapWithText:(NSString *)text
{
[self.delegate multiColumnTableView:self didTapLabelWithText:text];
}
@end
@@ -0,0 +1,24 @@
//
// FLEXTableContentHeaderCell.h
// UICatalog
//
// Created by Peng Tao on 15/11/26.
// Copyright © 2015年 f. All rights reserved.
//
#import <UIKit/UIKit.h>
typedef NS_ENUM(NSUInteger, FLEXTableColumnHeaderSortType) {
FLEXTableColumnHeaderSortTypeNone = 0,
FLEXTableColumnHeaderSortTypeAsc,
FLEXTableColumnHeaderSortTypeDesc,
};
@interface FLEXTableColumnHeader : UIView
@property (nonatomic, strong) UILabel *label;
- (void)changeSortStatusWithType:(FLEXTableColumnHeaderSortType)type;
@end
@@ -0,0 +1,60 @@
//
// FLEXTableContentHeaderCell.m
// UICatalog
//
// Created by Peng Tao on 15/11/26.
// Copyright © 2015年 f. All rights reserved.
//
#import "FLEXTableColumnHeader.h"
@implementation FLEXTableColumnHeader
{
UILabel *_arrowLabel;
}
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.backgroundColor = [UIColor whiteColor];
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(5, 0, frame.size.width - 25, frame.size.height)];
label.font = [UIFont systemFontOfSize:13.0];
[self addSubview:label];
self.label = label;
_arrowLabel = [[UILabel alloc] initWithFrame:CGRectMake(frame.size.width - 20, 0, 20, frame.size.height)];
_arrowLabel.font = [UIFont systemFontOfSize:13.0];
[self addSubview:_arrowLabel];
UIView *line = [[UIView alloc] initWithFrame:CGRectMake(frame.size.width - 1, 2, 1, frame.size.height - 4)];
line.backgroundColor = [UIColor colorWithWhite:0.803 alpha:0.850];
[self addSubview:line];
}
return self;
}
- (void)changeSortStatusWithType:(FLEXTableColumnHeaderSortType)type
{
switch (type) {
case FLEXTableColumnHeaderSortTypeNone:
_arrowLabel.text = @"";
break;
case FLEXTableColumnHeaderSortTypeAsc:
_arrowLabel.text = @"⬆️";
break;
case FLEXTableColumnHeaderSortTypeDesc:
_arrowLabel.text = @"⬇️";
break;
}
}
@end
@@ -0,0 +1,27 @@
//
// FLEXTableContentCell.h
// UICatalog
//
// Created by Peng Tao on 15/11/24.
// Copyright © 2015年 f. All rights reserved.
//
#import <UIKit/UIKit.h>
@class FLEXTableContentCell;
@protocol FLEXTableContentCellDelegate <NSObject>
@optional
- (void)tableContentCell:(FLEXTableContentCell *)tableView labelDidTapWithText:(NSString *)text;
@end
@interface FLEXTableContentCell : UITableViewCell
@property (nonatomic, strong)NSArray *labels;
@property (nonatomic, weak) id<FLEXTableContentCellDelegate>delegate;
+ (instancetype)cellWithTableView:(UITableView *)tableView columnNumber:(NSInteger)number;
@end
@@ -0,0 +1,66 @@
//
// FLEXTableContentCell.m
// UICatalog
//
// Created by Peng Tao on 15/11/24.
// Copyright © 2015年 f. All rights reserved.
//
#import "FLEXTableContentCell.h"
#import "FLEXMultiColumnTableView.h"
@interface FLEXTableContentCell ()
@end
@implementation FLEXTableContentCell
+ (instancetype)cellWithTableView:(UITableView *)tableView columnNumber:(NSInteger)number;
{
static NSString *identifier = @"FLEXTableContentCell";
FLEXTableContentCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (!cell) {
cell = [[FLEXTableContentCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
NSMutableArray *labels = [NSMutableArray array];
for (int i = 0; i < number ; i++) {
UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero];
label.backgroundColor = [UIColor whiteColor];
label.font = [UIFont systemFontOfSize:13.0];
label.textAlignment = NSTextAlignmentLeft;
label.backgroundColor = [UIColor greenColor];
[labels addObject:label];
UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:cell
action:@selector(labelDidTap:)];
[label addGestureRecognizer:gesture];
label.userInteractionEnabled = YES;
[cell.contentView addSubview:label];
cell.contentView.backgroundColor = [UIColor whiteColor];
}
cell.labels = labels;
}
return cell;
}
- (void)layoutSubviews
{
[super layoutSubviews];
CGFloat labelWidth = self.contentView.frame.size.width / self.labels.count;
CGFloat labelHeight = self.contentView.frame.size.height;
for (int i = 0; i < self.labels.count; i++) {
UILabel *label = self.labels[i];
label.frame = CGRectMake(labelWidth * i + 5, 0, (labelWidth - 10), labelHeight);
}
}
- (void)labelDidTap:(UIGestureRecognizer *)gesture
{
UILabel *label = (UILabel *)gesture.view;
if ([self.delegate respondsToSelector:@selector(tableContentCell:labelDidTapWithText:)]) {
[self.delegate tableContentCell:self labelDidTapWithText:label.text];
}
}
@end
@@ -0,0 +1,16 @@
//
// PTTableContentViewController.h
// PTDatabaseReader
//
// Created by Peng Tao on 15/11/23.
// Copyright © 2015年 Peng Tao. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface FLEXTableContentViewController : UIViewController
@property (nonatomic, strong) NSArray *columnsArray;
@property (nonatomic, strong) NSArray *contentsArray;
@end
@@ -0,0 +1,184 @@
//
// PTTableContentViewController.m
// PTDatabaseReader
//
// Created by Peng Tao on 15/11/23.
// Copyright © 2015年 Peng Tao. All rights reserved.
//
#import "FLEXTableContentViewController.h"
#import "FLEXMultiColumnTableView.h"
#import "FLEXWebViewController.h"
@interface FLEXTableContentViewController ()<FLEXMultiColumnTableViewDataSource, FLEXMultiColumnTableViewDelegate>
@property (nonatomic, strong)FLEXMultiColumnTableView *multiColumView;
@end
@implementation FLEXTableContentViewController
- (instancetype)init
{
self = [super init];
if (self) {
CGRect rectStatus = [UIApplication sharedApplication].statusBarFrame;
CGFloat y = 64;
if (rectStatus.size.height == 0) {
y = 32;
}
_multiColumView = [[FLEXMultiColumnTableView alloc] initWithFrame:
CGRectMake(0, y, self.view.frame.size.width, self.view.frame.size.height - y)];
_multiColumView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
_multiColumView.backgroundColor = [UIColor whiteColor];
_multiColumView.dataSource = self;
_multiColumView.delegate = self;
self.automaticallyAdjustsScrollViewInsets = NO;
[self.view addSubview:_multiColumView];
}
return self;
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.multiColumView reloadData];
}
#pragma mark -
#pragma mark MultiColumnTableView DataSource
- (NSInteger)numberOfColumnsInTableView:(FLEXMultiColumnTableView *)tableView
{
return self.columnsArray.count;
}
- (NSInteger)numberOfRowsInTableView:(FLEXMultiColumnTableView *)tableView
{
return self.contentsArray.count;
}
- (NSString *)columnNameInColumn:(NSInteger)column
{
return self.columnsArray[column];
}
- (NSString *)rowNameInRow:(NSInteger)row
{
return [NSString stringWithFormat:@"%ld",(long)row];
}
- (NSString *)contentAtColumn:(NSInteger)column row:(NSInteger)row
{
if (self.contentsArray.count > row) {
NSDictionary *dic = self.contentsArray[row];
if (self.contentsArray.count > column) {
return [NSString stringWithFormat:@"%@",[dic objectForKey:self.columnsArray[column]]];
}
}
return @"";
}
- (NSArray *)contentAtRow:(NSInteger)row
{
NSMutableArray *result = [NSMutableArray array];
if (self.contentsArray.count > row) {
NSDictionary *dic = self.contentsArray[row];
for (int i = 0; i < self.columnsArray.count; i ++) {
[result addObject:dic[self.columnsArray[i]]];
}
return result;
}
return nil;
}
- (CGFloat)multiColumnTableView:(FLEXMultiColumnTableView *)tableView
heightForContentCellInRow:(NSInteger)row
{
return 40;
}
- (CGFloat)multiColumnTableView:(FLEXMultiColumnTableView *)tableView
widthForContentCellInColumn:(NSInteger)column
{
return 120;
}
- (CGFloat)heightForTopHeaderInTableView:(FLEXMultiColumnTableView *)tableView
{
return 40;
}
- (CGFloat)widthForLeftHeaderInTableView:(FLEXMultiColumnTableView *)tableView
{
NSString *str = [NSString stringWithFormat:@"%lu",(unsigned long)self.contentsArray.count];
NSDictionary *attrs = @{@"NSFontAttributeName":[UIFont systemFontOfSize:17.0]};
CGSize size = [str boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, 14)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:attrs context:nil].size;
return size.width + 20;
}
#pragma mark -
#pragma mark MultiColumnTableView Delegate
- (void)multiColumnTableView:(FLEXMultiColumnTableView *)tableView didTapLabelWithText:(NSString *)text
{
FLEXWebViewController * detailViewController = [[FLEXWebViewController alloc] initWithText:text];
[self.navigationController pushViewController:detailViewController animated:YES];
}
- (void)multiColumnTableView:(FLEXMultiColumnTableView *)tableView didTapHeaderWithText:(NSString *)text sortType:(FLEXTableColumnHeaderSortType)sortType
{
NSArray *sortContentData = [self.contentsArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
if ([obj1 objectForKey:text] == [NSNull null]) {
return NSOrderedAscending;
}
if ([obj2 objectForKey:text] == [NSNull null]) {
return NSOrderedDescending;
}
NSComparisonResult result = [[obj1 objectForKey:text] compare:[obj2 objectForKey:text]];
return result;
}];
if (sortType == FLEXTableColumnHeaderSortTypeDesc) {
NSEnumerator *contentReverseEvumerator = [sortContentData reverseObjectEnumerator];
sortContentData = [NSArray arrayWithArray:[contentReverseEvumerator allObjects]];
}
self.contentsArray = sortContentData;
[self.multiColumView reloadData];
}
#pragma mark -
#pragma mark About Transition
- (void)willTransitionToTraitCollection:(UITraitCollection *)newCollection
withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinator
{
[super willTransitionToTraitCollection:newCollection
withTransitionCoordinator:coordinator];
[coordinator animateAlongsideTransition:^(id <UIViewControllerTransitionCoordinatorContext> context) {
if (newCollection.verticalSizeClass == UIUserInterfaceSizeClassCompact) {
_multiColumView.frame = CGRectMake(0, 32, self.view.frame.size.width, self.view.frame.size.height - 32);
}
else {
_multiColumView.frame = CGRectMake(0, 64, self.view.frame.size.width, self.view.frame.size.height - 64);
}
[self.view setNeedsLayout];
} completion:nil];
}
@end
@@ -0,0 +1,17 @@
//
// FLEXTableLeftCell.h
// UICatalog
//
// Created by Peng Tao on 15/11/24.
// Copyright © 2015年 f. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface FLEXTableLeftCell : UITableViewCell
@property (nonatomic, strong) UILabel *titlelabel;
+ (instancetype)cellWithTableView:(UITableView *)tableView;
@end
@@ -0,0 +1,35 @@
//
// FLEXTableLeftCell.m
// UICatalog
//
// Created by Peng Tao on 15/11/24.
// Copyright © 2015年 f. All rights reserved.
//
#import "FLEXTableLeftCell.h"
@implementation FLEXTableLeftCell
+ (instancetype)cellWithTableView:(UITableView *)tableView
{
static NSString *identifier = @"FLEXTableLeftCell";
FLEXTableLeftCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (!cell) {
cell = [[FLEXTableLeftCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectZero];
textLabel.textAlignment = NSTextAlignmentCenter;
textLabel.font = [UIFont systemFontOfSize:13.0];
textLabel.backgroundColor = [UIColor clearColor];
[cell.contentView addSubview:textLabel];
cell.titlelabel = textLabel;
}
return cell;
}
- (void)layoutSubviews
{
[super layoutSubviews];
self.titlelabel.frame = self.contentView.frame;
}
@end
@@ -0,0 +1,15 @@
//
// PTTableListViewController.h
// PTDatabaseReader
//
// Created by Peng Tao on 15/11/23.
// Copyright © 2015年 Peng Tao. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface FLEXTableListViewController : UITableViewController
- (instancetype)initWithPath:(NSString *)path;
@end
@@ -0,0 +1,82 @@
//
// PTTableListViewController.m
// PTDatabaseReader
//
// Created by Peng Tao on 15/11/23.
// Copyright © 2015年 Peng Tao. All rights reserved.
//
#import "FLEXTableListViewController.h"
#import "FLEXDatabaseManager.h"
#import "FLEXTableContentViewController.h"
@interface FLEXTableListViewController ()
{
FLEXDatabaseManager *_dbm;
NSString *_databasePath;
}
@property (nonatomic, strong) NSArray *tables;
@end
@implementation FLEXTableListViewController
- (instancetype)initWithPath:(NSString *)path
{
self = [super initWithStyle:UITableViewStyleGrouped];
if (self) {
_databasePath = [path copy];
_dbm = [[FLEXDatabaseManager alloc] initWithPath:path];
[_dbm open];
[self getAllTables];
}
return self;
}
- (void)getAllTables
{
NSArray *resultArray = [_dbm queryAllTables];
NSMutableArray *array = [NSMutableArray array];
for (NSDictionary *dict in resultArray) {
[array addObject:dict[@"name"]];
}
self.tables = array;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.tables.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"FLEXTableListViewControllerCell"];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:@"FLEXTableListViewControllerCell"];
}
cell.textLabel.text = self.tables[indexPath.row];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
FLEXTableContentViewController *contentViewController = [[FLEXTableContentViewController alloc] init];
contentViewController.contentsArray = [_dbm queryAllDataWithTableName:self.tables[indexPath.row]];
contentViewController.columnsArray = [_dbm queryAllColumnsWithTableName:self.tables[indexPath.row]];
contentViewController.title = self.tables[indexPath.row];
[self.navigationController pushViewController:contentViewController animated:YES];
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
return [NSString stringWithFormat:@"%lu tables", (unsigned long)self.tables.count];
}
@end
@@ -0,0 +1,21 @@
FMDB
Copyright (c) 2008-2014 Flying Meat Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
@@ -131,7 +131,7 @@
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *className = [self.filteredClassNames objectAtIndex:indexPath.row];
NSString *className = self.filteredClassNames[indexPath.row];
Class selectedClass = objc_getClass([className UTF8String]);
FLEXObjectExplorerViewController *objectExplorer = [FLEXObjectExplorerFactory explorerViewControllerForObject:selectedClass];
[self.navigationController pushViewController:objectExplorer animated:YES];
@@ -10,7 +10,7 @@
#import "FLEXFileBrowserSearchOperation.h"
@interface FLEXFileBrowserTableViewController : UITableViewController <UISearchDisplayDelegate, FLEXFileBrowserSearchOperationDelegate>
@interface FLEXFileBrowserTableViewController : UITableViewController
- (id)initWithPath:(NSString *)path;
@@ -11,22 +11,19 @@
#import "FLEXUtility.h"
#import "FLEXWebViewController.h"
#import "FLEXImagePreviewViewController.h"
#import "FLEXTableListViewController.h"
@interface FLEXFileBrowserTableViewCell : UITableViewCell
@end
@interface FLEXFileBrowserTableViewController () <FLEXFileBrowserFileOperationControllerDelegate>
@interface FLEXFileBrowserTableViewController () <FLEXFileBrowserFileOperationControllerDelegate, FLEXFileBrowserSearchOperationDelegate, UISearchResultsUpdating, UISearchControllerDelegate>
@property (nonatomic, copy) NSString *path;
@property (nonatomic, copy) NSArray *childPaths;
@property (nonatomic, copy) NSString *searchString;
@property (nonatomic, strong) NSArray *searchPaths;
@property (nonatomic, strong) NSNumber *recursiveSize;
@property (nonatomic, strong) NSNumber *searchPathsSize;
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
@property (nonatomic, strong) UISearchDisplayController *searchController;
#pragma clang diagnostic pop
@property (nonatomic, strong) UISearchController *searchController;
@property (nonatomic) NSOperationQueue *operationQueue;
@property (nonatomic, strong) UIDocumentInteractionController *documentController;
@property (nonatomic, strong) id<FLEXFileBrowserFileOperationController> fileOperationController;
@@ -48,16 +45,10 @@
self.title = [path lastPathComponent];
self.operationQueue = [NSOperationQueue new];
//add search controller
UISearchBar *searchBar = [UISearchBar new];
[searchBar sizeToFit];
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
self.searchController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
#pragma clang diagnostic pop
self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
self.searchController.searchResultsUpdater = self;
self.searchController.delegate = self;
self.searchController.searchResultsDataSource = self;
self.searchController.searchResultsDelegate = self;
self.searchController.dimsBackgroundDuringPresentation = NO;
self.tableView.tableHeaderView = self.searchController.searchBar;
//computing path size
@@ -106,22 +97,20 @@
{
self.searchPaths = searchResult;
self.searchPathsSize = @(size);
[self.searchController.searchResultsTableView reloadData];
[self.tableView reloadData];
}
#pragma mark - UISearchDisplayDelegate
#pragma mark - UISearchResultsUpdating
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController
{
self.searchString = searchString;
[self reloadSearchPaths];
return YES;
[self reloadDisplayedPaths];
}
- (void)searchDisplayController:(UISearchDisplayController *)controller willHideSearchResultsTableView:(UITableView *)tableView
#pragma mark - UISearchControllerDelegate
- (void)willDismissSearchController:(UISearchController *)searchController
{
//confirm to clear all operations
[self.operationQueue cancelAllOperations];
[self reloadChildPaths];
[self.tableView reloadData];
@@ -137,25 +126,14 @@
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (tableView == self.tableView) {
return [self.childPaths count];
} else {
return [self.searchPaths count];
}
return self.searchController.isActive ? [self.searchPaths count] : [self.childPaths count];
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
NSNumber *currentSize = nil;
NSArray *currentPaths = nil;
if (tableView == self.tableView) {
currentSize = self.recursiveSize;
currentPaths = self.childPaths;
} else {
currentSize = self.searchPathsSize;
currentPaths = self.searchPaths;
}
BOOL isSearchActive = self.searchController.isActive;
NSNumber *currentSize = isSearchActive ? self.searchPathsSize : self.recursiveSize;
NSArray *currentPaths = isSearchActive ? self.searchPaths : self.childPaths;
NSString *sizeString = nil;
if (!currentSize) {
@@ -169,14 +147,7 @@
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *fullPath = nil;
if (tableView == self.tableView) {
NSString *subpath = [self.childPaths objectAtIndex:indexPath.row];
fullPath = [self.path stringByAppendingPathComponent:subpath];
} else {
fullPath = [self.searchPaths objectAtIndex:indexPath.row];
}
NSString *fullPath = [self filePathAtIndexPath:indexPath];
NSDictionary *attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:fullPath error:NULL];
BOOL isDirectory = [[attributes fileType] isEqual:NSFileTypeDirectory];
NSString *subtitle = nil;
@@ -217,16 +188,8 @@
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *subpath = nil;
NSString *fullPath = nil;
if (tableView == self.tableView) {
subpath = [self.childPaths objectAtIndex:indexPath.row];
fullPath = [self.path stringByAppendingPathComponent:subpath];
} else {
fullPath = [self.searchPaths objectAtIndex:indexPath.row];
subpath = [fullPath lastPathComponent];
}
NSString *fullPath = [self filePathAtIndexPath:indexPath];
NSString *subpath = [fullPath lastPathComponent];
BOOL isDirectory = NO;
BOOL stillExists = [[NSFileManager defaultManager] fileExistsAtPath:fullPath isDirectory:&isDirectory];
@@ -253,7 +216,10 @@
drillInViewController = [[FLEXWebViewController alloc] initWithText:prettyString];
} else if ([FLEXWebViewController supportsPathExtension:[subpath pathExtension]]) {
drillInViewController = [[FLEXWebViewController alloc] initWithURL:[NSURL fileURLWithPath:fullPath]];
} else {
} else if ([[subpath pathExtension] isEqualToString:@"db"]) {
drillInViewController = [[FLEXTableListViewController alloc] initWithPath:fullPath];
}
else {
NSString *fileString = [NSString stringWithContentsOfFile:fullPath encoding:NSUTF8StringEncoding error:NULL];
if ([fileString length] > 0) {
drillInViewController = [[FLEXWebViewController alloc] initWithText:fileString];
@@ -309,16 +275,8 @@
- (void)fileBrowserRename:(UITableViewCell *)sender
{
NSString *fullPath = nil;
NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
if (indexPath) {
NSString *subpath = [self.childPaths objectAtIndex:indexPath.row];
fullPath = [self.path stringByAppendingPathComponent:subpath];
} else {
indexPath = [self.searchController.searchResultsTableView indexPathForCell:sender];
fullPath = [self.searchPaths objectAtIndex:indexPath.row];
}
NSString *fullPath = [self filePathAtIndexPath:indexPath];
self.fileOperationController = [[FLEXFileBrowserFileRenameOperationController alloc] initWithPath:fullPath];
self.fileOperationController.delegate = self;
@@ -327,17 +285,9 @@
- (void)fileBrowserDelete:(UITableViewCell *)sender
{
NSString *fullPath = nil;
NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
if (indexPath) {
NSString *subpath = [self.childPaths objectAtIndex:indexPath.row];
fullPath = [self.path stringByAppendingPathComponent:subpath];
} else {
indexPath = [self.searchController.searchResultsTableView indexPathForCell:sender];
fullPath = [self.searchPaths objectAtIndex:indexPath.row];
}
NSString *fullPath = [self filePathAtIndexPath:indexPath];
self.fileOperationController = [[FLEXFileBrowserFileDeleteOperationController alloc] initWithPath:fullPath];
self.fileOperationController.delegate = self;
[self.fileOperationController show];
@@ -347,16 +297,20 @@
{
if (self.searchController.isActive) {
[self reloadSearchPaths];
[self.searchController.searchResultsTableView reloadData];
} else {
[self reloadChildPaths];
[self.tableView reloadData];
}
[self.tableView reloadData];
}
- (void)reloadChildPaths
{
self.childPaths = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:self.path error:NULL];
NSMutableArray *childPaths = [NSMutableArray array];
NSArray *subpaths = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:self.path error:NULL];
for (NSString *subpath in subpaths) {
[childPaths addObject:[self.path stringByAppendingPathComponent:subpath]];
}
self.childPaths = childPaths;
}
- (void)reloadSearchPaths
@@ -366,11 +320,16 @@
//clear pre search request and start a new one
[self.operationQueue cancelAllOperations];
FLEXFileBrowserSearchOperation *newOperation = [[FLEXFileBrowserSearchOperation alloc] initWithPath:self.path searchString:self.searchString];
FLEXFileBrowserSearchOperation *newOperation = [[FLEXFileBrowserSearchOperation alloc] initWithPath:self.path searchString:self.searchController.searchBar.text];
newOperation.delegate = self;
[self.operationQueue addOperation:newOperation];
}
- (NSString *)filePathAtIndexPath:(NSIndexPath *)indexPath
{
return self.searchController.isActive ? self.searchPaths[indexPath.row] : self.childPaths[indexPath.row];
}
@end
@@ -100,10 +100,10 @@
cell.detailTextLabel.textColor = [UIColor grayColor];
}
id instance = [self.instances objectAtIndex:indexPath.row];
id instance = self.instances[indexPath.row];
NSString *title = nil;
if ((NSInteger)[self.fieldNames count] > indexPath.row) {
title = [NSString stringWithFormat:@"%@ %@", NSStringFromClass(object_getClass(instance)), [self.fieldNames objectAtIndex:indexPath.row]];
title = [NSString stringWithFormat:@"%@ %@", NSStringFromClass(object_getClass(instance)), self.fieldNames[indexPath.row]];
} else {
title = [NSString stringWithFormat:@"%@ %p", NSStringFromClass(object_getClass(instance)), instance];
}
@@ -118,7 +118,7 @@
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
id instance = [self.instances objectAtIndex:indexPath.row];
id instance = self.instances[indexPath.row];
FLEXObjectExplorerViewController *drillInViewController = [FLEXObjectExplorerFactory explorerViewControllerForObject:instance];
[self.navigationController pushViewController:drillInViewController animated:YES];
}
@@ -100,11 +100,11 @@ static const NSInteger kFLEXLiveObjectsSortByCountIndex = 1;
NSUInteger totalCount = 0;
for (NSString *className in self.allClassNames) {
totalCount += [[self.instanceCountsForClassNames objectForKey:className] unsignedIntegerValue];
totalCount += [self.instanceCountsForClassNames[className] unsignedIntegerValue];
}
NSUInteger filteredCount = 0;
for (NSString *className in self.filteredClassNames) {
filteredCount += [[self.instanceCountsForClassNames objectForKey:className] unsignedIntegerValue];
filteredCount += [self.instanceCountsForClassNames[className] unsignedIntegerValue];
}
if (filteredCount == totalCount) {
@@ -154,8 +154,8 @@ static const NSInteger kFLEXLiveObjectsSortByCountIndex = 1;
self.filteredClassNames = [self.filteredClassNames sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
} else if (self.searchBar.selectedScopeButtonIndex == kFLEXLiveObjectsSortByCountIndex) {
self.filteredClassNames = [self.filteredClassNames sortedArrayUsingComparator:^NSComparisonResult(NSString *className1, NSString *className2) {
NSNumber *count1 = [self.instanceCountsForClassNames objectForKey:className1];
NSNumber *count2 = [self.instanceCountsForClassNames objectForKey:className2];
NSNumber *count1 = self.instanceCountsForClassNames[className1];
NSNumber *count2 = self.instanceCountsForClassNames[className2];
// Reversed for descending counts.
return [count2 compare:count1];
}];
@@ -189,7 +189,7 @@ static const NSInteger kFLEXLiveObjectsSortByCountIndex = 1;
}
NSString *className = self.filteredClassNames[indexPath.row];
NSNumber *count = [self.instanceCountsForClassNames objectForKey:className];
NSNumber *count = self.instanceCountsForClassNames[className];
cell.textLabel.text = [NSString stringWithFormat:@"%@ (%ld)", className, (long)[count integerValue]];
return cell;
@@ -200,7 +200,7 @@ static const NSInteger kFLEXLiveObjectsSortByCountIndex = 1;
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *className = [self.filteredClassNames objectAtIndex:indexPath.row];
NSString *className = self.filteredClassNames[indexPath.row];
FLEXInstancesTableViewController *instancesViewController = [FLEXInstancesTableViewController instancesTableViewControllerForClassName:className];
[self.navigationController pushViewController:instancesViewController animated:YES];
}
@@ -12,12 +12,9 @@
#import "FLEXSystemLogTableViewCell.h"
#import <asl.h>
@interface FLEXSystemLogTableViewController () <UISearchDisplayDelegate>
@interface FLEXSystemLogTableViewController () <UISearchResultsUpdating, UISearchControllerDelegate>
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
@property (nonatomic, strong) UISearchDisplayController *searchController;
#pragma clang diagnostic pop
@property (nonatomic, strong) UISearchController *searchController;
@property (nonatomic, copy) NSArray *logMessages;
@property (nonatomic, copy) NSArray *filteredLogMessages;
@property (nonatomic, strong) NSTimer *logUpdateTimer;
@@ -35,17 +32,10 @@
self.title = @"Loading...";
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@" ⬇︎ " style:UIBarButtonItemStylePlain target:self action:@selector(scrollToLastRow)];
UISearchBar *searchBar = [[UISearchBar alloc] init];
[searchBar sizeToFit];
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
self.searchController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
#pragma clang diagnostic pop
self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
self.searchController.delegate = self;
self.searchController.searchResultsDataSource = self;
self.searchController.searchResultsDelegate = self;
[self.searchController.searchResultsTableView registerClass:[FLEXSystemLogTableViewCell class] forCellReuseIdentifier:kFLEXSystemLogTableViewCellIdentifier];
self.searchController.searchResultsTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
self.searchController.searchResultsUpdater = self;
self.searchController.dimsBackgroundDuringPresentation = NO;
self.tableView.tableHeaderView = self.searchController.searchBar;
[self updateLogMessages];
@@ -108,25 +98,15 @@
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
NSInteger numberOfRows = 0;
if (tableView == self.tableView) {
numberOfRows = [self.logMessages count];
} else if (tableView == self.searchController.searchResultsTableView) {
numberOfRows = [self.filteredLogMessages count];
}
return numberOfRows;
return self.searchController.isActive ? [self.filteredLogMessages count] : [self.logMessages count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
FLEXSystemLogTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kFLEXSystemLogTableViewCellIdentifier forIndexPath:indexPath];
if (tableView == self.tableView) {
cell.logMessage = [self.logMessages objectAtIndex:indexPath.row];
cell.highlightedText = nil;
} else if (tableView == self.searchController.searchResultsTableView) {
cell.logMessage = [self.filteredLogMessages objectAtIndex:indexPath.row];
cell.highlightedText = self.searchController.searchBar.text;
}
cell.logMessage = [self logMessageAtIndexPath:indexPath];
cell.highlightedText = self.searchController.searchBar.text;
if (indexPath.row % 2 == 0) {
cell.backgroundColor = [UIColor colorWithWhite:0.95 alpha:1.0];
} else {
@@ -138,12 +118,7 @@
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
FLEXSystemLogMessage *logMessage = nil;
if (tableView == self.tableView) {
logMessage = [self.logMessages objectAtIndex:indexPath.row];
} else if (tableView == self.searchController.searchResultsTableView) {
logMessage = [self.filteredLogMessages objectAtIndex:indexPath.row];
}
FLEXSystemLogMessage *logMessage = [self logMessageAtIndexPath:indexPath];
return [FLEXSystemLogTableViewCell preferredHeightForLogMessage:logMessage inWidth:self.tableView.bounds.size.width];
}
@@ -162,37 +137,34 @@
- (void)tableView:(UITableView *)tableView performAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender
{
if (action == @selector(copy:)) {
FLEXSystemLogMessage *logMessage = nil;
if (tableView == self.tableView) {
logMessage = [self.logMessages objectAtIndex:indexPath.row];
} else if (tableView == self.searchController.searchResultsTableView) {
logMessage = [self.filteredLogMessages objectAtIndex:indexPath.row];
}
FLEXSystemLogMessage *logMessage = [self logMessageAtIndexPath:indexPath];
NSString *stringToCopy = [FLEXSystemLogTableViewCell displayedTextForLogMessage:logMessage] ?: @"";
[[UIPasteboard generalPasteboard] setString:stringToCopy];
}
}
#pragma mark - Search display delegate
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
- (FLEXSystemLogMessage *)logMessageAtIndexPath:(NSIndexPath *)indexPath
{
return self.searchController.isActive ? self.filteredLogMessages[indexPath.row] : self.logMessages[indexPath.row];
}
#pragma mark - UISearchResultsUpdating
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController
{
NSString *searchString = searchController.searchBar.text;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSArray *filteredLogMessages = [self.logMessages filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(FLEXSystemLogMessage *logMessage, NSDictionary *bindings) {
NSString *displayedText = [FLEXSystemLogTableViewCell displayedTextForLogMessage:logMessage];
return [displayedText rangeOfString:searchString options:NSCaseInsensitiveSearch].length > 0;
}]];
dispatch_async(dispatch_get_main_queue(), ^{
if ([self.searchDisplayController.searchBar.text isEqual:searchString]) {
if ([searchController.searchBar.text isEqual:searchString]) {
self.filteredLogMessages = filteredLogMessages;
[self.searchDisplayController.searchResultsTableView reloadData];
[self.tableView reloadData];
}
});
});
// Reload done after the data fetches asynchronously
return NO;
}
#pragma mark - Log Message Fetching
@@ -14,7 +14,7 @@
#import "FLEXNetworkObserver.h"
#import "FLEXNetworkSettingsTableViewController.h"
@interface FLEXNetworkHistoryTableViewController () <UISearchDisplayDelegate>
@interface FLEXNetworkHistoryTableViewController () <UISearchResultsUpdating, UISearchControllerDelegate>
/// Backing model
@property (nonatomic, copy) NSArray *networkTransactions;
@@ -23,11 +23,9 @@
@property (nonatomic, assign) long long filteredBytesReceived;
@property (nonatomic, assign) BOOL rowInsertInProgress;
@property (nonatomic, assign) BOOL isPresentingSearch;
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
@property (nonatomic, strong) UISearchDisplayController *searchController;
#pragma clang diagnostic pop
@property (nonatomic, strong) UISearchController *searchController;
@end
@@ -60,18 +58,10 @@
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
self.tableView.rowHeight = [FLEXNetworkTransactionTableViewCell preferredCellHeight];
UISearchBar *searchBar = [[UISearchBar alloc] init];
[searchBar sizeToFit];
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
self.searchController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
#pragma clang diagnostic pop
self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
self.searchController.delegate = self;
self.searchController.searchResultsDataSource = self;
self.searchController.searchResultsDelegate = self;
[self.searchController.searchResultsTableView registerClass:[FLEXNetworkTransactionTableViewCell class] forCellReuseIdentifier:kFLEXNetworkTransactionCellIdentifier];
self.searchController.searchResultsTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
self.searchController.searchResultsTableView.rowHeight = [FLEXNetworkTransactionTableViewCell preferredCellHeight];
self.searchController.searchResultsUpdater = self;
self.searchController.dimsBackgroundDuringPresentation = NO;
self.tableView.tableHeaderView = self.searchController.searchBar;
[self updateTransactions];
@@ -112,7 +102,7 @@
bytesReceived += transaction.receivedDataLength;
}
self.bytesReceived = bytesReceived;
[self updateFirstSectionHeaderInTableView:self.tableView];
[self updateFirstSectionHeader];
}
- (void)setFilteredNetworkTransactions:(NSArray *)filteredNetworkTransactions
@@ -130,31 +120,31 @@
filteredBytesReceived += transaction.receivedDataLength;
}
self.filteredBytesReceived = filteredBytesReceived;
[self updateFirstSectionHeaderInTableView:self.searchController.searchResultsTableView];
[self updateFirstSectionHeader];
}
- (void)updateFirstSectionHeaderInTableView:(UITableView *)tableView
- (void)updateFirstSectionHeader
{
UIView *view = [tableView headerViewForSection:0];
UIView *view = [self.tableView headerViewForSection:0];
if ([view isKindOfClass:[UITableViewHeaderFooterView class]]) {
UITableViewHeaderFooterView *headerView = (UITableViewHeaderFooterView *)view;
headerView.textLabel.text = [self headerTextForTableView:tableView];
headerView.textLabel.text = [self headerText];
[headerView setNeedsLayout];
}
}
- (NSString *)headerTextForTableView:(UITableView *)tableView
- (NSString *)headerText
{
NSString *headerText = nil;
if ([FLEXNetworkObserver isEnabled]) {
long long bytesReceived = 0;
NSInteger totalRequests = 0;
if (tableView == self.tableView) {
bytesReceived = self.bytesReceived;
totalRequests = [self.networkTransactions count];
} else if (tableView == self.searchController.searchResultsTableView) {
if (self.searchController.isActive) {
bytesReceived = self.filteredBytesReceived;
totalRequests = [self.filteredNetworkTransactions count];
} else {
bytesReceived = self.bytesReceived;
totalRequests = [self.networkTransactions count];
}
NSString *byteCountText = [NSByteCountFormatter stringFromByteCount:bytesReceived countStyle:NSByteCountFormatterCountStyleBinary];
NSString *requestsText = totalRequests == 1 ? @"Request" : @"Requests";
@@ -179,13 +169,19 @@
if (self.rowInsertInProgress) {
return;
}
if (self.searchController.isActive) {
[self updateTransactions];
[self updateSearchResults];
return;
}
NSInteger existingRowCount = [self.networkTransactions count];
[self updateTransactions];
NSInteger newRowCount = [self.networkTransactions count];
NSInteger addedRowCount = newRowCount - existingRowCount;
if (addedRowCount != 0) {
if (addedRowCount != 0 && !self.isPresentingSearch) {
// Insert animation if we're at the top.
if (self.tableView.contentOffset.y <= 0.0 && addedRowCount > 0) {
[CATransaction begin];
@@ -210,10 +206,6 @@
CGFloat contentHeightChange = self.tableView.contentSize.height - existingContentSize.height;
self.tableView.contentOffset = CGPointMake(self.tableView.contentOffset.x, self.tableView.contentOffset.y + contentHeightChange);
}
if (self.searchController.isActive) {
[self updateSearchResultsWithSearchString:self.searchController.searchBar.text];
}
}
}
@@ -222,38 +214,31 @@
[self updateBytesReceived];
[self updateFilteredBytesReceived];
FLEXNetworkTransaction *transaction = [notification.userInfo objectForKey:kFLEXNetworkRecorderUserInfoTransactionKey];
NSArray *tableViews = @[self.tableView];
if (self.searchController.searchResultsTableView) {
tableViews = [tableViews arrayByAddingObject:self.searchController.searchResultsTableView];
}
FLEXNetworkTransaction *transaction = notification.userInfo[kFLEXNetworkRecorderUserInfoTransactionKey];
// Update both the main table view and search table view if needed.
for (UITableView *tableView in tableViews) {
for (FLEXNetworkTransactionTableViewCell *cell in [tableView visibleCells]) {
if ([cell.transaction isEqual:transaction]) {
// Using -[UITableView reloadRowsAtIndexPaths:withRowAnimation:] is overkill here and kicks off a lot of
// work that can make the table view somewhat unresponseive when lots of updates are streaming in.
// We just need to tell the cell that it needs to re-layout.
[cell setNeedsLayout];
break;
}
for (FLEXNetworkTransactionTableViewCell *cell in [self.tableView visibleCells]) {
if ([cell.transaction isEqual:transaction]) {
// Using -[UITableView reloadRowsAtIndexPaths:withRowAnimation:] is overkill here and kicks off a lot of
// work that can make the table view somewhat unresponseive when lots of updates are streaming in.
// We just need to tell the cell that it needs to re-layout.
[cell setNeedsLayout];
break;
}
[self updateFirstSectionHeaderInTableView:tableView];
}
[self updateFirstSectionHeader];
}
- (void)handleTransactionsClearedNotification:(NSNotification *)notification
{
[self updateTransactions];
[self.tableView reloadData];
[self.searchController.searchResultsTableView reloadData];
}
- (void)handleNetworkObserverEnabledStateChangedNotification:(NSNotification *)notification
{
// Update the header, which displays a warning when network debugging is disabled
[self updateFirstSectionHeaderInTableView:self.tableView];
[self updateFirstSectionHeader];
}
#pragma mark - Table view data source
@@ -265,18 +250,12 @@
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
NSInteger numberOfRows = 0;
if (tableView == self.tableView) {
numberOfRows = [self.networkTransactions count];
} else if (tableView == self.searchController.searchResultsTableView) {
numberOfRows = [self.filteredNetworkTransactions count];
}
return numberOfRows;
return self.searchController.isActive ? [self.filteredNetworkTransactions count] : [self.networkTransactions count];
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
return [self headerTextForTableView:tableView];
return [self headerText];
}
- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section
@@ -335,27 +314,19 @@
- (FLEXNetworkTransaction *)transactionAtIndexPath:(NSIndexPath *)indexPath inTableView:(UITableView *)tableView
{
FLEXNetworkTransaction *transaction = nil;
if (tableView == self.tableView) {
transaction = [self.networkTransactions objectAtIndex:indexPath.row];
} else if (tableView == self.searchController.searchResultsTableView) {
transaction = [self.filteredNetworkTransactions objectAtIndex:indexPath.row];
}
return transaction;
return self.searchController.isActive ? self.filteredNetworkTransactions[indexPath.row] : self.networkTransactions[indexPath.row];
}
#pragma mark - Search display delegate
#pragma mark - UISearchResultsUpdating
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController
{
[self updateSearchResultsWithSearchString:searchString];
// Reload done after the data is filtered asynchronously
return NO;
[self updateSearchResults];
}
- (void)updateSearchResultsWithSearchString:(NSString *)searchString
- (void)updateSearchResults
{
NSString *searchString = self.searchController.searchBar.text;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSArray *filteredNetworkTransactions = [self.networkTransactions filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(FLEXNetworkTransaction *transaction, NSDictionary *bindings) {
return [[transaction.request.URL absoluteString] rangeOfString:searchString options:NSCaseInsensitiveSearch].length > 0;
@@ -363,10 +334,27 @@
dispatch_async(dispatch_get_main_queue(), ^{
if ([self.searchController.searchBar.text isEqual:searchString]) {
self.filteredNetworkTransactions = filteredNetworkTransactions;
[self.searchController.searchResultsTableView reloadData];
[self.tableView reloadData];
}
});
});
}
#pragma mark - UISearchControllerDelegate
- (void)willPresentSearchController:(UISearchController *)searchController
{
self.isPresentingSearch = YES;
}
- (void)didPresentSearchController:(UISearchController *)searchController
{
self.isPresentingSearch = NO;
}
- (void)willDismissSearchController:(UISearchController *)searchController
{
[self.tableView reloadData];
}
@end
+5 -5
View File
@@ -129,7 +129,7 @@ NSString *const kFLEXNetworkRecorderResponseCacheLimitDefaultsKey = @"com.flex.r
NSDate *responseDate = [NSDate date];
dispatch_async(self.queue, ^{
FLEXNetworkTransaction *transaction = [self.networkTransactionsForRequestIdentifiers objectForKey:requestID];
FLEXNetworkTransaction *transaction = self.networkTransactionsForRequestIdentifiers[requestID];
if (!transaction) {
return;
}
@@ -144,7 +144,7 @@ NSString *const kFLEXNetworkRecorderResponseCacheLimitDefaultsKey = @"com.flex.r
- (void)recordDataReceivedWithRequestID:(NSString *)requestID dataLength:(int64_t)dataLength
{
dispatch_async(self.queue, ^{
FLEXNetworkTransaction *transaction = [self.networkTransactionsForRequestIdentifiers objectForKey:requestID];
FLEXNetworkTransaction *transaction = self.networkTransactionsForRequestIdentifiers[requestID];
if (!transaction) {
return;
}
@@ -159,7 +159,7 @@ NSString *const kFLEXNetworkRecorderResponseCacheLimitDefaultsKey = @"com.flex.r
NSDate *finishedDate = [NSDate date];
dispatch_async(self.queue, ^{
FLEXNetworkTransaction *transaction = [self.networkTransactionsForRequestIdentifiers objectForKey:requestID];
FLEXNetworkTransaction *transaction = self.networkTransactionsForRequestIdentifiers[requestID];
if (!transaction) {
return;
}
@@ -215,7 +215,7 @@ NSString *const kFLEXNetworkRecorderResponseCacheLimitDefaultsKey = @"com.flex.r
- (void)recordLoadingFailedWithRequestID:(NSString *)requestID error:(NSError *)error
{
dispatch_async(self.queue, ^{
FLEXNetworkTransaction *transaction = [self.networkTransactionsForRequestIdentifiers objectForKey:requestID];
FLEXNetworkTransaction *transaction = self.networkTransactionsForRequestIdentifiers[requestID];
if (!transaction) {
return;
}
@@ -230,7 +230,7 @@ NSString *const kFLEXNetworkRecorderResponseCacheLimitDefaultsKey = @"com.flex.r
- (void)recordMechanism:(NSString *)mechanism forRequestID:(NSString *)requestID
{
dispatch_async(self.queue, ^{
FLEXNetworkTransaction *transaction = [self.networkTransactionsForRequestIdentifiers objectForKey:requestID];
FLEXNetworkTransaction *transaction = self.networkTransactionsForRequestIdentifiers[requestID];
if (!transaction) {
return;
}
@@ -92,7 +92,7 @@
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
return [self.cells objectAtIndex:indexPath.row];
return self.cells[indexPath.row];
}
#pragma mark - UIActionSheetDelegate
@@ -151,13 +151,13 @@ typedef UIViewController *(^FLEXNetworkDetailRowSelectionFuture)(void);
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
FLEXNetworkDetailSection *sectionModel = [self.sections objectAtIndex:section];
FLEXNetworkDetailSection *sectionModel = self.sections[section];
return [sectionModel.rows count];
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
FLEXNetworkDetailSection *sectionModel = [self.sections objectAtIndex:section];
FLEXNetworkDetailSection *sectionModel = self.sections[section];
return sectionModel.title;
}
@@ -200,8 +200,8 @@ typedef UIViewController *(^FLEXNetworkDetailRowSelectionFuture)(void);
- (FLEXNetworkDetailRow *)rowModelAtIndexPath:(NSIndexPath *)indexPath
{
FLEXNetworkDetailSection *sectionModel = [self.sections objectAtIndex:indexPath.section];
return [sectionModel.rows objectAtIndex:indexPath.row];
FLEXNetworkDetailSection *sectionModel = self.sections[indexPath.section];
return sectionModel.rows[indexPath.row];
}
#pragma mark - Cell Copying
@@ -432,7 +432,7 @@ typedef UIViewController *(^FLEXNetworkDetailRowSelectionFuture)(void);
NSMutableArray *rows = [NSMutableArray arrayWithCapacity:[dictionary count]];
NSArray *sortedKeys = [[dictionary allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
for (NSString *key in sortedKeys) {
NSString *value = [dictionary objectForKey:key];
NSString *value = dictionary[key];
FLEXNetworkDetailRow *row = [[FLEXNetworkDetailRow alloc] init];
row.title = key;
row.detailText = [value description];
@@ -903,7 +903,7 @@ static char const * const kFLEXRequestIDKey = "kFLEXRequestIDKey";
- (FLEXInternalRequestState *)requestStateForRequestID:(NSString *)requestID
{
FLEXInternalRequestState *requestState = [self.requestStatesForRequestIDs objectForKey:requestID];
FLEXInternalRequestState *requestState = self.requestStatesForRequestIDs[requestID];
if (!requestState) {
requestState = [[FLEXInternalRequestState alloc] init];
[self.requestStatesForRequestIDs setObject:requestState forKey:requestID];
@@ -72,7 +72,7 @@
- (id)detailObjectForRowCookie:(id)rowCookie
{
NSUInteger index = [rowCookie unsignedIntegerValue];
return [self.array objectAtIndex:index];
return self.array[index];
}
@end
@@ -43,7 +43,7 @@
- (NSString *)customSectionSubtitleForRowCookie:(id)rowCookie
{
return [FLEXRuntimeUtility descriptionForIvarOrPropertyValue:[self.dictionary objectForKey:rowCookie]];
return [FLEXRuntimeUtility descriptionForIvarOrPropertyValue:self.dictionary[rowCookie]];
}
- (BOOL)customSectionCanDrillIntoRowWithCookie:(id)rowCookie
@@ -53,7 +53,7 @@
- (UIViewController *)customSectionDrillInViewControllerForRowCookie:(id)rowCookie
{
return [FLEXObjectExplorerFactory explorerViewControllerForObject:[self.dictionary objectForKey:rowCookie]];
return [FLEXObjectExplorerFactory explorerViewControllerForObject:self.dictionary[rowCookie]];
}
- (BOOL)shouldShowDescription
@@ -50,7 +50,7 @@
for (NSString *objectTypeString in explorerSubclassesForObjectTypeStrings) {
Class objectClass = NSClassFromString(objectTypeString);
if ([object isKindOfClass:objectClass]) {
explorerClass = [explorerSubclassesForObjectTypeStrings objectForKey:objectTypeString];
explorerClass = explorerSubclassesForObjectTypeStrings[objectTypeString];
break;
}
}
@@ -273,7 +273,7 @@ static const NSInteger kFLEXObjectExplorerScopeIncludeInheritanceIndex = 1;
- (NSString *)titleForPropertyAtIndex:(NSInteger)index
{
FLEXPropertyBox *propertyBox = [self.filteredProperties objectAtIndex:index];
FLEXPropertyBox *propertyBox = self.filteredProperties[index];
return [FLEXRuntimeUtility prettyNameForProperty:propertyBox.property];
}
@@ -281,7 +281,7 @@ static const NSInteger kFLEXObjectExplorerScopeIncludeInheritanceIndex = 1;
{
id value = nil;
if ([self canHaveInstanceState]) {
FLEXPropertyBox *propertyBox = [self.filteredProperties objectAtIndex:index];
FLEXPropertyBox *propertyBox = self.filteredProperties[index];
value = [FLEXRuntimeUtility valueForProperty:propertyBox.property onObject:self.object];
}
return value;
@@ -352,7 +352,7 @@ static const NSInteger kFLEXObjectExplorerScopeIncludeInheritanceIndex = 1;
- (NSString *)titleForIvarAtIndex:(NSInteger)index
{
FLEXIvarBox *ivarBox = [self.filteredIvars objectAtIndex:index];
FLEXIvarBox *ivarBox = self.filteredIvars[index];
return [FLEXRuntimeUtility prettyNameForIvar:ivarBox.ivar];
}
@@ -360,7 +360,7 @@ static const NSInteger kFLEXObjectExplorerScopeIncludeInheritanceIndex = 1;
{
id value = nil;
if ([self canHaveInstanceState]) {
FLEXIvarBox *ivarBox = [self.filteredIvars objectAtIndex:index];
FLEXIvarBox *ivarBox = self.filteredIvars[index];
value = [FLEXRuntimeUtility valueForIvar:ivarBox.ivar onObject:self.object];
}
return value;
@@ -451,13 +451,13 @@ static const NSInteger kFLEXObjectExplorerScopeIncludeInheritanceIndex = 1;
- (NSString *)titleForMethodAtIndex:(NSInteger)index
{
FLEXMethodBox *methodBox = [self.filteredMethods objectAtIndex:index];
FLEXMethodBox *methodBox = self.filteredMethods[index];
return [FLEXRuntimeUtility prettyNameForMethod:methodBox.method isClassMethod:NO];
}
- (NSString *)titleForClassMethodAtIndex:(NSInteger)index
{
FLEXMethodBox *classMethodBox = [self.filteredClassMethods objectAtIndex:index];
FLEXMethodBox *classMethodBox = self.filteredClassMethods[index];
return [FLEXRuntimeUtility prettyNameForMethod:classMethodBox.method isClassMethod:YES];
}
@@ -612,7 +612,7 @@ static const NSInteger kFLEXObjectExplorerScopeIncludeInheritanceIndex = 1;
break;
case FLEXObjectExplorerSectionSuperclasses:
title = NSStringFromClass([self.filteredSuperclasses objectAtIndex:row]);
title = NSStringFromClass(self.filteredSuperclasses[row]);
break;
case FLEXObjectExplorerSectionReferencingInstances:
@@ -669,7 +669,7 @@ static const NSInteger kFLEXObjectExplorerScopeIncludeInheritanceIndex = 1;
case FLEXObjectExplorerSectionProperties: {
if ([self canHaveInstanceState]) {
FLEXPropertyBox *propertyBox = [self.filteredProperties objectAtIndex:row];
FLEXPropertyBox *propertyBox = self.filteredProperties[row];
objc_property_t property = propertyBox.property;
id currentValue = [self valueForPropertyAtIndex:row];
BOOL canEdit = [FLEXPropertyEditorViewController canEditProperty:property currentValue:currentValue];
@@ -680,7 +680,7 @@ static const NSInteger kFLEXObjectExplorerScopeIncludeInheritanceIndex = 1;
case FLEXObjectExplorerSectionIvars: {
if ([self canHaveInstanceState]) {
FLEXIvarBox *ivarBox = [self.filteredIvars objectAtIndex:row];
FLEXIvarBox *ivarBox = self.filteredIvars[row];
Ivar ivar = ivarBox.ivar;
id currentValue = [self valueForIvarAtIndex:row];
BOOL canEdit = [FLEXIvarEditorViewController canEditIvar:ivar currentValue:currentValue];
@@ -790,7 +790,7 @@ static const NSInteger kFLEXObjectExplorerScopeIncludeInheritanceIndex = 1;
break;
case FLEXObjectExplorerSectionProperties: {
FLEXPropertyBox *propertyBox = [self.filteredProperties objectAtIndex:row];
FLEXPropertyBox *propertyBox = self.filteredProperties[row];
objc_property_t property = propertyBox.property;
id currentValue = [self valueForPropertyAtIndex:row];
if ([FLEXPropertyEditorViewController canEditProperty:property currentValue:currentValue]) {
@@ -801,7 +801,7 @@ static const NSInteger kFLEXObjectExplorerScopeIncludeInheritanceIndex = 1;
} break;
case FLEXObjectExplorerSectionIvars: {
FLEXIvarBox *ivarBox = [self.filteredIvars objectAtIndex:row];
FLEXIvarBox *ivarBox = self.filteredIvars[row];
Ivar ivar = ivarBox.ivar;
id currentValue = [self valueForIvarAtIndex:row];
if ([FLEXIvarEditorViewController canEditIvar:ivar currentValue:currentValue]) {
@@ -812,19 +812,19 @@ static const NSInteger kFLEXObjectExplorerScopeIncludeInheritanceIndex = 1;
} break;
case FLEXObjectExplorerSectionMethods: {
FLEXMethodBox *methodBox = [self.filteredMethods objectAtIndex:row];
FLEXMethodBox *methodBox = self.filteredMethods[row];
Method method = methodBox.method;
viewController = [[FLEXMethodCallingViewController alloc] initWithTarget:self.object method:method];
} break;
case FLEXObjectExplorerSectionClassMethods: {
FLEXMethodBox *methodBox = [self.filteredClassMethods objectAtIndex:row];
FLEXMethodBox *methodBox = self.filteredClassMethods[row];
Method method = methodBox.method;
viewController = [[FLEXMethodCallingViewController alloc] initWithTarget:[self.object class] method:method];
} break;
case FLEXObjectExplorerSectionSuperclasses: {
Class superclass = [self.filteredSuperclasses objectAtIndex:row];
Class superclass = self.filteredSuperclasses[row];
viewController = [FLEXObjectExplorerFactory explorerViewControllerForObject:superclass];
} break;
@@ -972,7 +972,7 @@ static const NSInteger kFLEXObjectExplorerScopeIncludeInheritanceIndex = 1;
if ([self.filterText length] > 0) {
filteredIndexSet = [filteredIndexSet indexesPassingTest:^BOOL(NSUInteger index, BOOL *stop) {
BOOL matches = NO;
NSString *rowTitle = [self customSectionTitleForRowCookie:[self.cachedCustomSectionRowCookies objectAtIndex:index]];
NSString *rowTitle = [self customSectionTitleForRowCookie:self.cachedCustomSectionRowCookies[index]];
if ([rowTitle rangeOfString:self.filterText options:NSCaseInsensitiveSearch].location != NSNotFound) {
matches = YES;
}
+67 -7
View File
@@ -19,6 +19,7 @@
@property (nonatomic, strong) NSString *_unmodifiedInput;
@property (nonatomic, assign) UIKeyModifierFlags _modifierFlags;
@property (nonatomic, assign) BOOL _isKeyDown;
@property (nonatomic, assign) long _keyCode;
@end
@@ -64,8 +65,8 @@
@" " : @""};
NSString *prettyKey = nil;
if (self.key && [keyMappings objectForKey:self.key]) {
prettyKey = [keyMappings objectForKey:self.key];
if (self.key && keyMappings[self.key]) {
prettyKey = keyMappings[self.key];
} else {
prettyKey = [self.key uppercaseString];
}
@@ -114,6 +115,10 @@
@property (nonatomic, strong) NSMutableDictionary *actionsForKeyInputs;
@property (nonatomic, assign, getter=isPressingShift) BOOL pressingShift;
@property (nonatomic, assign, getter=isPressingCommand) BOOL pressingCommand;
@property (nonatomic, assign, getter=isPressingControl) BOOL pressingControl;
@end
@implementation FLEXKeyboardShortcutManager
@@ -133,14 +138,52 @@
SEL originalKeyEventSelector = NSSelectorFromString(@"handleKeyUIEvent:");
SEL swizzledKeyEventSelector = [FLEXUtility swizzledSelectorForSelector:originalKeyEventSelector];
void (^sendEventSwizzleBlock)(UIApplication *, UIEvent *) = ^(UIApplication *slf, UIEvent *event) {
void (^handleKeyUIEventSwizzleBlock)(UIApplication *, UIEvent *) = ^(UIApplication *slf, UIEvent *event) {
[[[self class] sharedManager] handleKeyboardEvent:event];
((void(*)(id, SEL, id))objc_msgSend)(slf, swizzledKeyEventSelector, event);
};
[FLEXUtility replaceImplementationOfKnownSelector:originalKeyEventSelector onClass:[UIApplication class] withBlock:sendEventSwizzleBlock swizzledSelector:swizzledKeyEventSelector];
[FLEXUtility replaceImplementationOfKnownSelector:originalKeyEventSelector onClass:[UIApplication class] withBlock:handleKeyUIEventSwizzleBlock swizzledSelector:swizzledKeyEventSelector];
SEL originalSendEventSelector = NSSelectorFromString(@"sendEvent:");
SEL swizzledSendEventSelector = [FLEXUtility swizzledSelectorForSelector:originalSendEventSelector];
void (^sendEventSwizzleBlock)(UIApplication *, UIEvent *) = ^(UIApplication *slf, UIEvent *event) {
if (event.type == UIEventTypeTouches) {
FLEXKeyboardShortcutManager *keyboardManager = [FLEXKeyboardShortcutManager sharedManager];
NSInteger pressureLevel = 0;
if (keyboardManager.isPressingShift) {
pressureLevel++;
}
if (keyboardManager.isPressingCommand) {
pressureLevel++;
}
if (keyboardManager.isPressingControl) {
pressureLevel++;
}
if (pressureLevel > 0) {
for (UITouch *touch in [event allTouches]) {
double adjustedPressureLevel = pressureLevel * 20 * touch.maximumPossibleForce;
[touch setValue:@(adjustedPressureLevel) forKey:@"_pressure"];
}
}
}
((void(*)(id, SEL, id))objc_msgSend)(slf, swizzledSendEventSelector, event);
};
[FLEXUtility replaceImplementationOfKnownSelector:originalSendEventSelector onClass:[UIApplication class] withBlock:sendEventSwizzleBlock swizzledSelector:swizzledSendEventSelector];
SEL originalSupportsTouchPressureSelector = NSSelectorFromString(@"_supportsForceTouch");
SEL swizzledSupportsTouchPressureSelector = [FLEXUtility swizzledSelectorForSelector:originalSupportsTouchPressureSelector];
BOOL (^supportsTouchPressureSwizzleBlock)(UIDevice *) = ^BOOL(UIDevice *slf) {
return YES;
};
[FLEXUtility replaceImplementationOfKnownSelector:originalSupportsTouchPressureSelector onClass:[UIDevice class] withBlock:supportsTouchPressureSwizzleBlock swizzledSelector:swizzledSupportsTouchPressureSelector];
}
- (instancetype)init
@@ -161,6 +204,10 @@
[self.actionsForKeyInputs setObject:action forKey:keyInput];
}
static const long kFLEXControlKeyCode = 0xe0;
static const long kFLEXShiftKeyCode = 0xe1;
static const long kFLEXCommandKeyCode = 0xe3;
- (void)handleKeyboardEvent:(UIEvent *)event
{
if (!self.enabled) {
@@ -171,6 +218,7 @@
NSString *unmodifiedInput = nil;
UIKeyModifierFlags flags = 0;
BOOL isKeyDown = NO;
long keyCode = 0;
if ([event respondsToSelector:@selector(_modifiedInput)]) {
modifiedInput = [event _modifiedInput];
@@ -188,6 +236,10 @@
isKeyDown = [event _isKeyDown];
}
if ([event respondsToSelector:@selector(_keyCode)]) {
keyCode = [event _keyCode];
}
BOOL interactionEnabled = ![[UIApplication sharedApplication] isIgnoringInteractionEvents];
if (isKeyDown && [modifiedInput length] > 0 && interactionEnabled) {
@@ -207,16 +259,16 @@
} else {
FLEXKeyInput *exactMatch = [FLEXKeyInput keyInputForKey:unmodifiedInput flags:flags];
dispatch_block_t actionBlock = [self.actionsForKeyInputs objectForKey:exactMatch];
dispatch_block_t actionBlock = self.actionsForKeyInputs[exactMatch];
if (!actionBlock) {
FLEXKeyInput *shiftMatch = [FLEXKeyInput keyInputForKey:modifiedInput flags:flags&(!UIKeyModifierShift)];
actionBlock = [self.actionsForKeyInputs objectForKey:shiftMatch];
actionBlock = self.actionsForKeyInputs[shiftMatch];
}
if (!actionBlock) {
FLEXKeyInput *capitalMatch = [FLEXKeyInput keyInputForKey:[unmodifiedInput uppercaseString] flags:flags];
actionBlock = [self.actionsForKeyInputs objectForKey:capitalMatch];
actionBlock = self.actionsForKeyInputs[capitalMatch];
}
if (actionBlock) {
@@ -224,6 +276,14 @@
}
}
}
if (keyCode == kFLEXControlKeyCode) {
self.pressingControl = isKeyDown;
} else if (keyCode == kFLEXCommandKeyCode) {
self.pressingCommand = isKeyDown;
} else if (keyCode == kFLEXShiftKeyCode) {
self.pressingShift = isKeyDown;
}
}
- (NSString *)keyboardShortcutsDescription
+10 -10
View File
@@ -49,7 +49,7 @@ const unsigned int kFLEXNumberOfImplicitArgs = 2;
+ (NSString *)typeEncodingForProperty:(objc_property_t)property
{
NSDictionary *attributesDictionary = [self attributesDictionaryForProperty:property];
return [attributesDictionary objectForKey:kFLEXUtilityAttributeTypeEncoding];
return attributesDictionary[kFLEXUtilityAttributeTypeEncoding];
}
+ (BOOL)isReadonlyProperty:(objc_property_t)property
@@ -77,33 +77,33 @@ const unsigned int kFLEXNumberOfImplicitArgs = 2;
NSMutableArray *attributesStrings = [NSMutableArray array];
// Atomicity
if ([attributesDictionary objectForKey:kFLEXUtilityAttributeNonAtomic]) {
if (attributesDictionary[kFLEXUtilityAttributeNonAtomic]) {
[attributesStrings addObject:@"nonatomic"];
} else {
[attributesStrings addObject:@"atomic"];
}
// Storage
if ([attributesDictionary objectForKey:kFLEXUtilityAttributeRetain]) {
if (attributesDictionary[kFLEXUtilityAttributeRetain]) {
[attributesStrings addObject:@"strong"];
} else if ([attributesDictionary objectForKey:kFLEXUtilityAttributeCopy]) {
} else if (attributesDictionary[kFLEXUtilityAttributeCopy]) {
[attributesStrings addObject:@"copy"];
} else if ([attributesDictionary objectForKey:kFLEXUtilityAttributeWeak]) {
} else if (attributesDictionary[kFLEXUtilityAttributeWeak]) {
[attributesStrings addObject:@"weak"];
} else {
[attributesStrings addObject:@"assign"];
}
// Mutability
if ([attributesDictionary objectForKey:kFLEXUtilityAttributeReadOnly]) {
if (attributesDictionary[kFLEXUtilityAttributeReadOnly]) {
[attributesStrings addObject:@"readonly"];
} else {
[attributesStrings addObject:@"readwrite"];
}
// Custom getter/setter
NSString *customGetter = [attributesDictionary objectForKey:kFLEXUtilityAttributeCustomGetter];
NSString *customSetter = [attributesDictionary objectForKey:kFLEXUtilityAttributeCustomSetter];
NSString *customGetter = attributesDictionary[kFLEXUtilityAttributeCustomGetter];
NSString *customSetter = attributesDictionary[kFLEXUtilityAttributeCustomSetter];
if (customGetter) {
[attributesStrings addObject:[NSString stringWithFormat:@"getter=%@", customGetter]];
}
@@ -179,7 +179,7 @@ const unsigned int kFLEXNumberOfImplicitArgs = 2;
for (NSString *attributeName in [attributePairs allKeys]) {
objc_property_attribute_t attribute;
attribute.name = [attributeName UTF8String];
attribute.value = [[attributePairs objectForKey:attributeName] UTF8String];
attribute.value = [attributePairs[attributeName] UTF8String];
attributes[attributeIndex++] = attribute;
}
@@ -316,7 +316,7 @@ const unsigned int kFLEXNumberOfImplicitArgs = 2;
NSUInteger numberOfArguments = [methodSignature numberOfArguments];
for (NSUInteger argumentIndex = kFLEXNumberOfImplicitArgs; argumentIndex < numberOfArguments; argumentIndex++) {
NSUInteger argumentsArrayIndex = argumentIndex - kFLEXNumberOfImplicitArgs;
id argumentObject = [arguments count] > argumentsArrayIndex ? [arguments objectAtIndex:argumentsArrayIndex] : nil;
id argumentObject = [arguments count] > argumentsArrayIndex ? arguments[argumentsArrayIndex] : nil;
// NSNull in the arguments array can be passed as a placeholder to indicate nil. We only need to set the argument if it will be non-nil.
if (argumentObject && ![argumentObject isKindOfClass:[NSNull class]]) {
+1 -1
View File
@@ -251,7 +251,7 @@
id value = [[components lastObject] stringByRemovingPercentEncoding];
// Handle multiple entries under the same key as an array
id existingEntry = [queryDictionary objectForKey:key];
id existingEntry = queryDictionary[key];
if (existingEntry) {
if ([existingEntry isKindOfClass:[NSArray class]]) {
value = [existingEntry arrayByAddingObject:value];
@@ -106,7 +106,10 @@ static const NSInteger kFLEXHierarchyScopeFullHierarchyIndex = 1;
if ([self.searchBar.text length] > 0) {
self.displayedViews = [candidateViews filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(UIView *candidateView, NSDictionary *bindings) {
NSString *title = [FLEXUtility descriptionForView:candidateView includingFrame:NO];
return [title rangeOfString:self.searchBar.text options:NSCaseInsensitiveSearch].location != NSNotFound;
NSString *candidateViewPointerAddress = [NSString stringWithFormat:@"%p", candidateView];
BOOL matchedViewPointerAddress = [candidateViewPointerAddress rangeOfString:self.searchBar.text options:NSCaseInsensitiveSearch].location != NSNotFound;
BOOL matchedViewTitle = [title rangeOfString:self.searchBar.text options:NSCaseInsensitiveSearch].location != NSNotFound;
return matchedViewPointerAddress || matchedViewTitle;
}]];
} else {
self.displayedViews = candidateViews;
@@ -162,7 +165,7 @@ static const NSInteger kFLEXHierarchyScopeFullHierarchyIndex = 1;
cell = [[FLEXHierarchyTableViewCell alloc] initWithReuseIdentifier:CellIdentifier];
}
UIView *view = [self.displayedViews objectAtIndex:indexPath.row];
UIView *view = self.displayedViews[indexPath.row];
NSNumber *depth = [self.depthsForViews objectForKey:[NSValue valueWithNonretainedObject:view]];
UIColor *viewColor = [FLEXUtility consistentRandomColorForObject:view];
cell.textLabel.text = [FLEXUtility descriptionForView:view includingFrame:NO];
@@ -182,13 +185,13 @@ static const NSInteger kFLEXHierarchyScopeFullHierarchyIndex = 1;
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
self.selectedView = [self.displayedViews objectAtIndex:indexPath.row];
self.selectedView = self.displayedViews[indexPath.row];
[self.delegate hierarchyViewController:self didFinishWithSelectedView:self.selectedView];
}
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
UIView *drillInView = [self.displayedViews objectAtIndex:indexPath.row];
UIView *drillInView = self.displayedViews[indexPath.row];
FLEXObjectExplorerViewController *viewExplorer = [FLEXObjectExplorerFactory explorerViewControllerForObject:drillInView];
[self.navigationController pushViewController:viewExplorer animated:YES];
}
+10 -517
View File
@@ -7,8 +7,6 @@
objects = {
/* Begin PBXBuildFile section */
0149BFE2198FAFC700B90A1B /* FLEXFileBrowserSearchOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 0149BFE1198FAFC700B90A1B /* FLEXFileBrowserSearchOperation.m */; };
01985ABC1984DE9500A65332 /* FLEXArgumentInputFontsPickerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 01985ABB1984DE9500A65332 /* FLEXArgumentInputFontsPickerView.m */; };
3EC6487318FF8A5000024205 /* ReadMe.txt in Resources */ = {isa = PBXBuildFile; fileRef = 3EC6487218FF8A5000024205 /* ReadMe.txt */; };
5356823E18F3656900BAAD62 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5356823D18F3656900BAAD62 /* Foundation.framework */; };
5356824018F3656900BAAD62 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5356823F18F3656900BAAD62 /* CoreGraphics.framework */; };
@@ -43,80 +41,13 @@
535682BE18F3670300BAAD62 /* AAPLWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 535682A418F3670300BAAD62 /* AAPLWebViewController.m */; };
535682BF18F3670300BAAD62 /* UIColor+AAPLApplicationSpecific.m in Sources */ = {isa = PBXBuildFile; fileRef = 535682A618F3670300BAAD62 /* UIColor+AAPLApplicationSpecific.m */; };
53874F9918F36B1800510922 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53874F9718F36B1800510922 /* Localizable.strings */; };
650855EB1A9007D5006109A1 /* FLEXArgumentInputDateView.m in Sources */ = {isa = PBXBuildFile; fileRef = 650855EA1A9007D5006109A1 /* FLEXArgumentInputDateView.m */; };
65F8DC6C1A8F11020076F87B /* FLEXFileBrowserFileOperationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 65F8DC6B1A8F11020076F87B /* FLEXFileBrowserFileOperationController.m */; };
679F6A121BD61B2400A8C94C /* FLEXCookiesTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 679F6A111BD61B2400A8C94C /* FLEXCookiesTableViewController.m */; settings = {ASSET_TAGS = (); }; };
9421B88D1A8BBCB200BA3E46 /* FLEXNetworkHistoryTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9421B8801A8BBCB200BA3E46 /* FLEXNetworkHistoryTableViewController.m */; };
9421B88E1A8BBCB200BA3E46 /* FLEXNetworkRecorder.m in Sources */ = {isa = PBXBuildFile; fileRef = 9421B8821A8BBCB200BA3E46 /* FLEXNetworkRecorder.m */; };
9421B88F1A8BBCB200BA3E46 /* FLEXNetworkTransaction.m in Sources */ = {isa = PBXBuildFile; fileRef = 9421B8841A8BBCB200BA3E46 /* FLEXNetworkTransaction.m */; };
9421B8901A8BBCB200BA3E46 /* FLEXNetworkTransactionDetailTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9421B8861A8BBCB200BA3E46 /* FLEXNetworkTransactionDetailTableViewController.m */; };
9421B8911A8BBCB200BA3E46 /* FLEXNetworkTransactionTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 9421B8881A8BBCB200BA3E46 /* FLEXNetworkTransactionTableViewCell.m */; };
9421B8921A8BBCB200BA3E46 /* FLEXNetworkObserver.m in Sources */ = {isa = PBXBuildFile; fileRef = 9421B88B1A8BBCB200BA3E46 /* FLEXNetworkObserver.m */; };
9421B8931A8BBCB200BA3E46 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = 9421B88C1A8BBCB200BA3E46 /* LICENSE */; };
942DCD8A1BAE131500DB5DC2 /* FLEXKeyboardShortcutManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 942DCD891BAE131500DB5DC2 /* FLEXKeyboardShortcutManager.m */; };
942DCD8D1BAE819500DB5DC2 /* FLEXKeyboardHelpViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 942DCD8C1BAE819500DB5DC2 /* FLEXKeyboardHelpViewController.m */; };
779B1EF51C0C4F25001F5E49 /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 779B1EF41C0C4F25001F5E49 /* libsqlite3.dylib */; };
9420A1AD1C1E84EE00B587DF /* FLEX.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9420A1AC1C1E84EE00B587DF /* FLEX.framework */; };
943203FE1978F42F00E24DB3 /* AAPLCatalogTableTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 943203FD1978F42F00E24DB3 /* AAPLCatalogTableTableViewController.m */; };
944F7489197B458C009AB039 /* FLEXArrayExplorerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F7426197B458C009AB039 /* FLEXArrayExplorerViewController.m */; };
944F748A197B458C009AB039 /* FLEXClassExplorerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F7428197B458C009AB039 /* FLEXClassExplorerViewController.m */; };
944F748B197B458C009AB039 /* FLEXDefaultsExplorerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F742A197B458C009AB039 /* FLEXDefaultsExplorerViewController.m */; };
944F748D197B458C009AB039 /* FLEXDictionaryExplorerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F742E197B458C009AB039 /* FLEXDictionaryExplorerViewController.m */; };
944F748E197B458C009AB039 /* FLEXImageExplorerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F7430197B458C009AB039 /* FLEXImageExplorerViewController.m */; };
944F748F197B458C009AB039 /* FLEXObjectExplorerFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F7432197B458C009AB039 /* FLEXObjectExplorerFactory.m */; };
944F7490197B458C009AB039 /* FLEXObjectExplorerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F7434197B458C009AB039 /* FLEXObjectExplorerViewController.m */; };
944F7491197B458C009AB039 /* FLEXSetExplorerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F7436197B458C009AB039 /* FLEXSetExplorerViewController.m */; };
944F7492197B458C009AB039 /* FLEXViewControllerExplorerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F7438197B458C009AB039 /* FLEXViewControllerExplorerViewController.m */; };
944F7493197B458C009AB039 /* FLEXViewExplorerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F743A197B458C009AB039 /* FLEXViewExplorerViewController.m */; };
944F7494197B458C009AB039 /* FLEXHeapEnumerator.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F743D197B458C009AB039 /* FLEXHeapEnumerator.m */; };
944F7495197B458C009AB039 /* FLEXResources.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F743F197B458C009AB039 /* FLEXResources.m */; };
944F7496197B458C009AB039 /* FLEXRuntimeUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F7441197B458C009AB039 /* FLEXRuntimeUtility.m */; };
944F7497197B458C009AB039 /* FLEXUtility.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F7443197B458C009AB039 /* FLEXUtility.m */; };
944F7498197B458C009AB039 /* FLEXArgumentInputColorView.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F7447197B458C009AB039 /* FLEXArgumentInputColorView.m */; };
944F7499197B458C009AB039 /* FLEXArgumentInputFontView.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F7449197B458C009AB039 /* FLEXArgumentInputFontView.m */; };
944F749A197B458C009AB039 /* FLEXArgumentInputJSONObjectView.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F744B197B458C009AB039 /* FLEXArgumentInputJSONObjectView.m */; };
944F749B197B458C009AB039 /* FLEXArgumentInputNotSupportedView.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F744D197B458C009AB039 /* FLEXArgumentInputNotSupportedView.m */; };
944F749C197B458C009AB039 /* FLEXArgumentInputNumberView.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F744F197B458C009AB039 /* FLEXArgumentInputNumberView.m */; };
944F749D197B458C009AB039 /* FLEXArgumentInputStringView.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F7451197B458C009AB039 /* FLEXArgumentInputStringView.m */; };
944F749E197B458C009AB039 /* FLEXArgumentInputStructView.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F7453197B458C009AB039 /* FLEXArgumentInputStructView.m */; };
944F749F197B458C009AB039 /* FLEXArgumentInputSwitchView.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F7455197B458C009AB039 /* FLEXArgumentInputSwitchView.m */; };
944F74A0197B458C009AB039 /* FLEXArgumentInputTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F7457197B458C009AB039 /* FLEXArgumentInputTextView.m */; };
944F74A1197B458C009AB039 /* FLEXArgumentInputView.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F7459197B458C009AB039 /* FLEXArgumentInputView.m */; };
944F74A2197B458C009AB039 /* FLEXArgumentInputViewFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F745B197B458C009AB039 /* FLEXArgumentInputViewFactory.m */; };
944F74A3197B458C009AB039 /* FLEXDefaultEditorViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F745D197B458C009AB039 /* FLEXDefaultEditorViewController.m */; };
944F74A4197B458C009AB039 /* FLEXFieldEditorView.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F745F197B458C009AB039 /* FLEXFieldEditorView.m */; };
944F74A5197B458C009AB039 /* FLEXFieldEditorViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F7461197B458C009AB039 /* FLEXFieldEditorViewController.m */; };
944F74A6197B458C009AB039 /* FLEXIvarEditorViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F7463197B458C009AB039 /* FLEXIvarEditorViewController.m */; };
944F74A7197B458C009AB039 /* FLEXMethodCallingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F7465197B458C009AB039 /* FLEXMethodCallingViewController.m */; };
944F74A8197B458C009AB039 /* FLEXPropertyEditorViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F7467197B458C009AB039 /* FLEXPropertyEditorViewController.m */; };
944F74A9197B458C009AB039 /* FLEXExplorerToolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F746A197B458C009AB039 /* FLEXExplorerToolbar.m */; };
944F74AA197B458C009AB039 /* FLEXExplorerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F746C197B458C009AB039 /* FLEXExplorerViewController.m */; };
944F74AB197B458C009AB039 /* FLEXManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F746E197B458C009AB039 /* FLEXManager.m */; };
944F74AC197B458C009AB039 /* FLEXToolbarItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F7470197B458C009AB039 /* FLEXToolbarItem.m */; };
944F74AD197B458C009AB039 /* FLEXWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F7472197B458C009AB039 /* FLEXWindow.m */; };
944F74AE197B458C009AB039 /* FLEXClassesTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F7475197B458C009AB039 /* FLEXClassesTableViewController.m */; };
944F74AF197B458C009AB039 /* FLEXFileBrowserTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F7477197B458C009AB039 /* FLEXFileBrowserTableViewController.m */; };
944F74B0197B458C009AB039 /* FLEXGlobalsTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F7479197B458C009AB039 /* FLEXGlobalsTableViewController.m */; };
944F74B1197B458C009AB039 /* FLEXInstancesTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F747B197B458C009AB039 /* FLEXInstancesTableViewController.m */; };
944F74B2197B458C009AB039 /* FLEXLibrariesTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F747D197B458C009AB039 /* FLEXLibrariesTableViewController.m */; };
944F74B3197B458C009AB039 /* FLEXLiveObjectsTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F747F197B458C009AB039 /* FLEXLiveObjectsTableViewController.m */; };
944F74B4197B458C009AB039 /* FLEXWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F7481197B458C009AB039 /* FLEXWebViewController.m */; };
944F74B5197B458C009AB039 /* FLEXHierarchyTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F7484197B458C009AB039 /* FLEXHierarchyTableViewCell.m */; };
944F74B6197B458C009AB039 /* FLEXHierarchyTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F7486197B458C009AB039 /* FLEXHierarchyTableViewController.m */; };
944F74B7197B458C009AB039 /* FLEXImagePreviewViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 944F7488197B458C009AB039 /* FLEXImagePreviewViewController.m */; };
946C6EC91A7598D3006545C2 /* FLEXSystemLogTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 946C6EC81A7598D3006545C2 /* FLEXSystemLogTableViewCell.m */; };
946C6ECC1A759928006545C2 /* FLEXSystemLogTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 946C6ECA1A759928006545C2 /* FLEXSystemLogTableViewController.m */; };
946C6ECF1A7599C4006545C2 /* FLEXSystemLogMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = 946C6ECE1A7599C4006545C2 /* FLEXSystemLogMessage.m */; };
94C681F31A3E941800E1936D /* FLEXLayerExplorerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 94C681F21A3E941800E1936D /* FLEXLayerExplorerViewController.m */; };
94CB48391A8EC6000054A905 /* FLEXMultilineTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 94CB48381A8EC6000054A905 /* FLEXMultilineTableViewCell.m */; };
94CB4D431A97183E0054A905 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 94CB4D421A97183E0054A905 /* libz.dylib */; };
94CB4D4F1A9829F80054A905 /* FLEXNetworkSettingsTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 94CB4D4E1A9829F80054A905 /* FLEXNetworkSettingsTableViewController.m */; };
D03647D919847248007D2A1B /* FLEXGlobalsTableViewControllerEntry.m in Sources */ = {isa = PBXBuildFile; fileRef = D03647D819847248007D2A1B /* FLEXGlobalsTableViewControllerEntry.m */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
0149BFE0198FAFC700B90A1B /* FLEXFileBrowserSearchOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXFileBrowserSearchOperation.h; sourceTree = "<group>"; };
0149BFE1198FAFC700B90A1B /* FLEXFileBrowserSearchOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXFileBrowserSearchOperation.m; sourceTree = "<group>"; };
01985ABA1984DE9500A65332 /* FLEXArgumentInputFontsPickerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXArgumentInputFontsPickerView.h; sourceTree = "<group>"; };
01985ABB1984DE9500A65332 /* FLEXArgumentInputFontsPickerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXArgumentInputFontsPickerView.m; sourceTree = "<group>"; };
3EC6487218FF8A5000024205 /* ReadMe.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ReadMe.txt; sourceTree = SOURCE_ROOT; };
5356823A18F3656900BAAD62 /* UICatalog.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = UICatalog.app; sourceTree = BUILT_PRODUCTS_DIR; };
5356823D18F3656900BAAD62 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
@@ -179,139 +110,11 @@
535682A518F3670300BAAD62 /* UIColor+AAPLApplicationSpecific.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIColor+AAPLApplicationSpecific.h"; sourceTree = "<group>"; };
535682A618F3670300BAAD62 /* UIColor+AAPLApplicationSpecific.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIColor+AAPLApplicationSpecific.m"; sourceTree = "<group>"; };
53874F9818F36B1800510922 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
650855E91A9007D5006109A1 /* FLEXArgumentInputDateView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXArgumentInputDateView.h; sourceTree = "<group>"; };
650855EA1A9007D5006109A1 /* FLEXArgumentInputDateView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXArgumentInputDateView.m; sourceTree = "<group>"; };
65F8DC6A1A8F11020076F87B /* FLEXFileBrowserFileOperationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXFileBrowserFileOperationController.h; sourceTree = "<group>"; };
65F8DC6B1A8F11020076F87B /* FLEXFileBrowserFileOperationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXFileBrowserFileOperationController.m; sourceTree = "<group>"; };
679F6A101BD61B2400A8C94C /* FLEXCookiesTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXCookiesTableViewController.h; sourceTree = "<group>"; };
679F6A111BD61B2400A8C94C /* FLEXCookiesTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXCookiesTableViewController.m; sourceTree = "<group>"; };
9421B87F1A8BBCB200BA3E46 /* FLEXNetworkHistoryTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXNetworkHistoryTableViewController.h; sourceTree = "<group>"; };
9421B8801A8BBCB200BA3E46 /* FLEXNetworkHistoryTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXNetworkHistoryTableViewController.m; sourceTree = "<group>"; };
9421B8811A8BBCB200BA3E46 /* FLEXNetworkRecorder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXNetworkRecorder.h; sourceTree = "<group>"; };
9421B8821A8BBCB200BA3E46 /* FLEXNetworkRecorder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXNetworkRecorder.m; sourceTree = "<group>"; };
9421B8831A8BBCB200BA3E46 /* FLEXNetworkTransaction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXNetworkTransaction.h; sourceTree = "<group>"; };
9421B8841A8BBCB200BA3E46 /* FLEXNetworkTransaction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXNetworkTransaction.m; sourceTree = "<group>"; };
9421B8851A8BBCB200BA3E46 /* FLEXNetworkTransactionDetailTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXNetworkTransactionDetailTableViewController.h; sourceTree = "<group>"; };
9421B8861A8BBCB200BA3E46 /* FLEXNetworkTransactionDetailTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXNetworkTransactionDetailTableViewController.m; sourceTree = "<group>"; };
9421B8871A8BBCB200BA3E46 /* FLEXNetworkTransactionTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXNetworkTransactionTableViewCell.h; sourceTree = "<group>"; };
9421B8881A8BBCB200BA3E46 /* FLEXNetworkTransactionTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXNetworkTransactionTableViewCell.m; sourceTree = "<group>"; };
9421B88A1A8BBCB200BA3E46 /* FLEXNetworkObserver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXNetworkObserver.h; sourceTree = "<group>"; };
9421B88B1A8BBCB200BA3E46 /* FLEXNetworkObserver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXNetworkObserver.m; sourceTree = "<group>"; };
9421B88C1A8BBCB200BA3E46 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = "<group>"; };
942DCD881BAE131500DB5DC2 /* FLEXKeyboardShortcutManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXKeyboardShortcutManager.h; sourceTree = "<group>"; };
942DCD891BAE131500DB5DC2 /* FLEXKeyboardShortcutManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXKeyboardShortcutManager.m; sourceTree = "<group>"; };
942DCD8B1BAE819500DB5DC2 /* FLEXKeyboardHelpViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXKeyboardHelpViewController.h; sourceTree = "<group>"; };
942DCD8C1BAE819500DB5DC2 /* FLEXKeyboardHelpViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXKeyboardHelpViewController.m; sourceTree = "<group>"; };
779B1EF41C0C4F25001F5E49 /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = ../../../../../../usr/lib/libsqlite3.dylib; sourceTree = "<group>"; };
9420A1AC1C1E84EE00B587DF /* FLEX.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FLEX.framework; path = "../../../Library/Developer/Xcode/DerivedData/FLEX-gixtctkeshzdbwbdapvulcvleeiu/Build/Products/Debug-iphoneos/FLEX.framework"; sourceTree = "<group>"; };
943203FC1978F42F00E24DB3 /* AAPLCatalogTableTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AAPLCatalogTableTableViewController.h; sourceTree = "<group>"; };
943203FD1978F42F00E24DB3 /* AAPLCatalogTableTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AAPLCatalogTableTableViewController.m; sourceTree = "<group>"; };
944F7425197B458C009AB039 /* FLEXArrayExplorerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXArrayExplorerViewController.h; sourceTree = "<group>"; };
944F7426197B458C009AB039 /* FLEXArrayExplorerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXArrayExplorerViewController.m; sourceTree = "<group>"; };
944F7427197B458C009AB039 /* FLEXClassExplorerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXClassExplorerViewController.h; sourceTree = "<group>"; };
944F7428197B458C009AB039 /* FLEXClassExplorerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXClassExplorerViewController.m; sourceTree = "<group>"; };
944F7429197B458C009AB039 /* FLEXDefaultsExplorerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXDefaultsExplorerViewController.h; sourceTree = "<group>"; };
944F742A197B458C009AB039 /* FLEXDefaultsExplorerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXDefaultsExplorerViewController.m; sourceTree = "<group>"; };
944F742D197B458C009AB039 /* FLEXDictionaryExplorerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXDictionaryExplorerViewController.h; sourceTree = "<group>"; };
944F742E197B458C009AB039 /* FLEXDictionaryExplorerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXDictionaryExplorerViewController.m; sourceTree = "<group>"; };
944F742F197B458C009AB039 /* FLEXImageExplorerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXImageExplorerViewController.h; sourceTree = "<group>"; };
944F7430197B458C009AB039 /* FLEXImageExplorerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXImageExplorerViewController.m; sourceTree = "<group>"; };
944F7431197B458C009AB039 /* FLEXObjectExplorerFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXObjectExplorerFactory.h; sourceTree = "<group>"; };
944F7432197B458C009AB039 /* FLEXObjectExplorerFactory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXObjectExplorerFactory.m; sourceTree = "<group>"; };
944F7433197B458C009AB039 /* FLEXObjectExplorerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXObjectExplorerViewController.h; sourceTree = "<group>"; };
944F7434197B458C009AB039 /* FLEXObjectExplorerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXObjectExplorerViewController.m; sourceTree = "<group>"; };
944F7435197B458C009AB039 /* FLEXSetExplorerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXSetExplorerViewController.h; sourceTree = "<group>"; };
944F7436197B458C009AB039 /* FLEXSetExplorerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXSetExplorerViewController.m; sourceTree = "<group>"; };
944F7437197B458C009AB039 /* FLEXViewControllerExplorerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXViewControllerExplorerViewController.h; sourceTree = "<group>"; };
944F7438197B458C009AB039 /* FLEXViewControllerExplorerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXViewControllerExplorerViewController.m; sourceTree = "<group>"; };
944F7439197B458C009AB039 /* FLEXViewExplorerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXViewExplorerViewController.h; sourceTree = "<group>"; };
944F743A197B458C009AB039 /* FLEXViewExplorerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXViewExplorerViewController.m; sourceTree = "<group>"; };
944F743C197B458C009AB039 /* FLEXHeapEnumerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXHeapEnumerator.h; sourceTree = "<group>"; };
944F743D197B458C009AB039 /* FLEXHeapEnumerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXHeapEnumerator.m; sourceTree = "<group>"; };
944F743E197B458C009AB039 /* FLEXResources.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXResources.h; sourceTree = "<group>"; };
944F743F197B458C009AB039 /* FLEXResources.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXResources.m; sourceTree = "<group>"; };
944F7440197B458C009AB039 /* FLEXRuntimeUtility.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXRuntimeUtility.h; sourceTree = "<group>"; };
944F7441197B458C009AB039 /* FLEXRuntimeUtility.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXRuntimeUtility.m; sourceTree = "<group>"; };
944F7442197B458C009AB039 /* FLEXUtility.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXUtility.h; sourceTree = "<group>"; };
944F7443197B458C009AB039 /* FLEXUtility.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXUtility.m; sourceTree = "<group>"; };
944F7446197B458C009AB039 /* FLEXArgumentInputColorView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXArgumentInputColorView.h; sourceTree = "<group>"; };
944F7447197B458C009AB039 /* FLEXArgumentInputColorView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXArgumentInputColorView.m; sourceTree = "<group>"; };
944F7448197B458C009AB039 /* FLEXArgumentInputFontView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXArgumentInputFontView.h; sourceTree = "<group>"; };
944F7449197B458C009AB039 /* FLEXArgumentInputFontView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXArgumentInputFontView.m; sourceTree = "<group>"; };
944F744A197B458C009AB039 /* FLEXArgumentInputJSONObjectView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXArgumentInputJSONObjectView.h; sourceTree = "<group>"; };
944F744B197B458C009AB039 /* FLEXArgumentInputJSONObjectView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXArgumentInputJSONObjectView.m; sourceTree = "<group>"; };
944F744C197B458C009AB039 /* FLEXArgumentInputNotSupportedView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXArgumentInputNotSupportedView.h; sourceTree = "<group>"; };
944F744D197B458C009AB039 /* FLEXArgumentInputNotSupportedView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXArgumentInputNotSupportedView.m; sourceTree = "<group>"; };
944F744E197B458C009AB039 /* FLEXArgumentInputNumberView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXArgumentInputNumberView.h; sourceTree = "<group>"; };
944F744F197B458C009AB039 /* FLEXArgumentInputNumberView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXArgumentInputNumberView.m; sourceTree = "<group>"; };
944F7450197B458C009AB039 /* FLEXArgumentInputStringView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXArgumentInputStringView.h; sourceTree = "<group>"; };
944F7451197B458C009AB039 /* FLEXArgumentInputStringView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXArgumentInputStringView.m; sourceTree = "<group>"; };
944F7452197B458C009AB039 /* FLEXArgumentInputStructView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXArgumentInputStructView.h; sourceTree = "<group>"; };
944F7453197B458C009AB039 /* FLEXArgumentInputStructView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXArgumentInputStructView.m; sourceTree = "<group>"; };
944F7454197B458C009AB039 /* FLEXArgumentInputSwitchView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXArgumentInputSwitchView.h; sourceTree = "<group>"; };
944F7455197B458C009AB039 /* FLEXArgumentInputSwitchView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXArgumentInputSwitchView.m; sourceTree = "<group>"; };
944F7456197B458C009AB039 /* FLEXArgumentInputTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXArgumentInputTextView.h; sourceTree = "<group>"; };
944F7457197B458C009AB039 /* FLEXArgumentInputTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXArgumentInputTextView.m; sourceTree = "<group>"; };
944F7458197B458C009AB039 /* FLEXArgumentInputView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXArgumentInputView.h; sourceTree = "<group>"; };
944F7459197B458C009AB039 /* FLEXArgumentInputView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXArgumentInputView.m; sourceTree = "<group>"; };
944F745A197B458C009AB039 /* FLEXArgumentInputViewFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXArgumentInputViewFactory.h; sourceTree = "<group>"; };
944F745B197B458C009AB039 /* FLEXArgumentInputViewFactory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXArgumentInputViewFactory.m; sourceTree = "<group>"; };
944F745C197B458C009AB039 /* FLEXDefaultEditorViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXDefaultEditorViewController.h; sourceTree = "<group>"; };
944F745D197B458C009AB039 /* FLEXDefaultEditorViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXDefaultEditorViewController.m; sourceTree = "<group>"; };
944F745E197B458C009AB039 /* FLEXFieldEditorView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXFieldEditorView.h; sourceTree = "<group>"; };
944F745F197B458C009AB039 /* FLEXFieldEditorView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXFieldEditorView.m; sourceTree = "<group>"; };
944F7460197B458C009AB039 /* FLEXFieldEditorViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXFieldEditorViewController.h; sourceTree = "<group>"; };
944F7461197B458C009AB039 /* FLEXFieldEditorViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXFieldEditorViewController.m; sourceTree = "<group>"; };
944F7462197B458C009AB039 /* FLEXIvarEditorViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXIvarEditorViewController.h; sourceTree = "<group>"; };
944F7463197B458C009AB039 /* FLEXIvarEditorViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXIvarEditorViewController.m; sourceTree = "<group>"; };
944F7464197B458C009AB039 /* FLEXMethodCallingViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXMethodCallingViewController.h; sourceTree = "<group>"; };
944F7465197B458C009AB039 /* FLEXMethodCallingViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXMethodCallingViewController.m; sourceTree = "<group>"; };
944F7466197B458C009AB039 /* FLEXPropertyEditorViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXPropertyEditorViewController.h; sourceTree = "<group>"; };
944F7467197B458C009AB039 /* FLEXPropertyEditorViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXPropertyEditorViewController.m; sourceTree = "<group>"; };
944F7469197B458C009AB039 /* FLEXExplorerToolbar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXExplorerToolbar.h; sourceTree = "<group>"; };
944F746A197B458C009AB039 /* FLEXExplorerToolbar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXExplorerToolbar.m; sourceTree = "<group>"; };
944F746B197B458C009AB039 /* FLEXExplorerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXExplorerViewController.h; sourceTree = "<group>"; };
944F746C197B458C009AB039 /* FLEXExplorerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXExplorerViewController.m; sourceTree = "<group>"; };
944F746D197B458C009AB039 /* FLEXManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXManager.h; sourceTree = "<group>"; };
944F746E197B458C009AB039 /* FLEXManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXManager.m; sourceTree = "<group>"; };
944F746F197B458C009AB039 /* FLEXToolbarItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXToolbarItem.h; sourceTree = "<group>"; };
944F7470197B458C009AB039 /* FLEXToolbarItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXToolbarItem.m; sourceTree = "<group>"; };
944F7471197B458C009AB039 /* FLEXWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXWindow.h; sourceTree = "<group>"; };
944F7472197B458C009AB039 /* FLEXWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXWindow.m; sourceTree = "<group>"; };
944F7474197B458C009AB039 /* FLEXClassesTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXClassesTableViewController.h; sourceTree = "<group>"; };
944F7475197B458C009AB039 /* FLEXClassesTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXClassesTableViewController.m; sourceTree = "<group>"; };
944F7476197B458C009AB039 /* FLEXFileBrowserTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXFileBrowserTableViewController.h; sourceTree = "<group>"; };
944F7477197B458C009AB039 /* FLEXFileBrowserTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXFileBrowserTableViewController.m; sourceTree = "<group>"; };
944F7478197B458C009AB039 /* FLEXGlobalsTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXGlobalsTableViewController.h; sourceTree = "<group>"; };
944F7479197B458C009AB039 /* FLEXGlobalsTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXGlobalsTableViewController.m; sourceTree = "<group>"; };
944F747A197B458C009AB039 /* FLEXInstancesTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXInstancesTableViewController.h; sourceTree = "<group>"; };
944F747B197B458C009AB039 /* FLEXInstancesTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXInstancesTableViewController.m; sourceTree = "<group>"; };
944F747C197B458C009AB039 /* FLEXLibrariesTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXLibrariesTableViewController.h; sourceTree = "<group>"; };
944F747D197B458C009AB039 /* FLEXLibrariesTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXLibrariesTableViewController.m; sourceTree = "<group>"; };
944F747E197B458C009AB039 /* FLEXLiveObjectsTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXLiveObjectsTableViewController.h; sourceTree = "<group>"; };
944F747F197B458C009AB039 /* FLEXLiveObjectsTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXLiveObjectsTableViewController.m; sourceTree = "<group>"; };
944F7480197B458C009AB039 /* FLEXWebViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXWebViewController.h; sourceTree = "<group>"; };
944F7481197B458C009AB039 /* FLEXWebViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXWebViewController.m; sourceTree = "<group>"; };
944F7483197B458C009AB039 /* FLEXHierarchyTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXHierarchyTableViewCell.h; sourceTree = "<group>"; };
944F7484197B458C009AB039 /* FLEXHierarchyTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXHierarchyTableViewCell.m; sourceTree = "<group>"; };
944F7485197B458C009AB039 /* FLEXHierarchyTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXHierarchyTableViewController.h; sourceTree = "<group>"; };
944F7486197B458C009AB039 /* FLEXHierarchyTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXHierarchyTableViewController.m; sourceTree = "<group>"; };
944F7487197B458C009AB039 /* FLEXImagePreviewViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXImagePreviewViewController.h; sourceTree = "<group>"; };
944F7488197B458C009AB039 /* FLEXImagePreviewViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXImagePreviewViewController.m; sourceTree = "<group>"; };
946C6EC71A7598D3006545C2 /* FLEXSystemLogTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXSystemLogTableViewCell.h; sourceTree = "<group>"; };
946C6EC81A7598D3006545C2 /* FLEXSystemLogTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXSystemLogTableViewCell.m; sourceTree = "<group>"; };
946C6ECA1A759928006545C2 /* FLEXSystemLogTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXSystemLogTableViewController.m; sourceTree = "<group>"; };
946C6ECB1A759928006545C2 /* FLEXSystemLogTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXSystemLogTableViewController.h; sourceTree = "<group>"; };
946C6ECD1A7599C4006545C2 /* FLEXSystemLogMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXSystemLogMessage.h; sourceTree = "<group>"; };
946C6ECE1A7599C4006545C2 /* FLEXSystemLogMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXSystemLogMessage.m; sourceTree = "<group>"; };
94C681F11A3E941800E1936D /* FLEXLayerExplorerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXLayerExplorerViewController.h; sourceTree = "<group>"; };
94C681F21A3E941800E1936D /* FLEXLayerExplorerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXLayerExplorerViewController.m; sourceTree = "<group>"; };
94CB48371A8EC6000054A905 /* FLEXMultilineTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXMultilineTableViewCell.h; sourceTree = "<group>"; };
94CB48381A8EC6000054A905 /* FLEXMultilineTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXMultilineTableViewCell.m; sourceTree = "<group>"; };
94CB4D421A97183E0054A905 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; };
94CB4D4D1A9829F80054A905 /* FLEXNetworkSettingsTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXNetworkSettingsTableViewController.h; sourceTree = "<group>"; };
94CB4D4E1A9829F80054A905 /* FLEXNetworkSettingsTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXNetworkSettingsTableViewController.m; sourceTree = "<group>"; };
D03647D51984720F007D2A1B /* FLEXManager+Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "FLEXManager+Private.h"; sourceTree = "<group>"; };
D03647D719847248007D2A1B /* FLEXGlobalsTableViewControllerEntry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXGlobalsTableViewControllerEntry.h; sourceTree = "<group>"; };
D03647D819847248007D2A1B /* FLEXGlobalsTableViewControllerEntry.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXGlobalsTableViewControllerEntry.m; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -319,6 +122,8 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
9420A1AD1C1E84EE00B587DF /* FLEX.framework in Frameworks */,
779B1EF51C0C4F25001F5E49 /* libsqlite3.dylib in Frameworks */,
94CB4D431A97183E0054A905 /* libz.dylib in Frameworks */,
5356824018F3656900BAAD62 /* CoreGraphics.framework in Frameworks */,
5356824218F3656900BAAD62 /* UIKit.framework in Frameworks */,
@@ -334,7 +139,6 @@
children = (
3EC6487218FF8A5000024205 /* ReadMe.txt */,
5356824318F3656900BAAD62 /* UICatalog */,
943203FF1978F4B700E24DB3 /* 3rd Party */,
5356823C18F3656900BAAD62 /* Frameworks */,
5356823B18F3656900BAAD62 /* Products */,
);
@@ -351,6 +155,8 @@
5356823C18F3656900BAAD62 /* Frameworks */ = {
isa = PBXGroup;
children = (
9420A1AC1C1E84EE00B587DF /* FLEX.framework */,
779B1EF41C0C4F25001F5E49 /* libsqlite3.dylib */,
94CB4D421A97183E0054A905 /* libz.dylib */,
5356823D18F3656900BAAD62 /* Foundation.framework */,
5356823F18F3656900BAAD62 /* CoreGraphics.framework */,
@@ -456,229 +262,6 @@
name = Application;
sourceTree = "<group>";
};
9421B87E1A8BBCB200BA3E46 /* Network */ = {
isa = PBXGroup;
children = (
9421B87F1A8BBCB200BA3E46 /* FLEXNetworkHistoryTableViewController.h */,
9421B8801A8BBCB200BA3E46 /* FLEXNetworkHistoryTableViewController.m */,
94CB4D4D1A9829F80054A905 /* FLEXNetworkSettingsTableViewController.h */,
94CB4D4E1A9829F80054A905 /* FLEXNetworkSettingsTableViewController.m */,
9421B8811A8BBCB200BA3E46 /* FLEXNetworkRecorder.h */,
9421B8821A8BBCB200BA3E46 /* FLEXNetworkRecorder.m */,
9421B8831A8BBCB200BA3E46 /* FLEXNetworkTransaction.h */,
9421B8841A8BBCB200BA3E46 /* FLEXNetworkTransaction.m */,
9421B8851A8BBCB200BA3E46 /* FLEXNetworkTransactionDetailTableViewController.h */,
9421B8861A8BBCB200BA3E46 /* FLEXNetworkTransactionDetailTableViewController.m */,
9421B8871A8BBCB200BA3E46 /* FLEXNetworkTransactionTableViewCell.h */,
9421B8881A8BBCB200BA3E46 /* FLEXNetworkTransactionTableViewCell.m */,
9421B8891A8BBCB200BA3E46 /* PonyDebugger */,
);
name = Network;
path = ../Classes/Network;
sourceTree = "<group>";
};
9421B8891A8BBCB200BA3E46 /* PonyDebugger */ = {
isa = PBXGroup;
children = (
9421B88A1A8BBCB200BA3E46 /* FLEXNetworkObserver.h */,
9421B88B1A8BBCB200BA3E46 /* FLEXNetworkObserver.m */,
9421B88C1A8BBCB200BA3E46 /* LICENSE */,
);
path = PonyDebugger;
sourceTree = "<group>";
};
943203FF1978F4B700E24DB3 /* 3rd Party */ = {
isa = PBXGroup;
children = (
943204001978F4C100E24DB3 /* FLEX */,
);
name = "3rd Party";
sourceTree = "<group>";
};
943204001978F4C100E24DB3 /* FLEX */ = {
isa = PBXGroup;
children = (
9421B87E1A8BBCB200BA3E46 /* Network */,
944F7424197B458C009AB039 /* Object Explorers */,
944F743B197B458C009AB039 /* Utility */,
944F7444197B458C009AB039 /* Editing */,
944F7468197B458C009AB039 /* Explorer Toolbar */,
944F7473197B458C009AB039 /* Global State Explorers */,
944F7482197B458C009AB039 /* View Hierarchy */,
);
name = FLEX;
sourceTree = "<group>";
};
944F7424197B458C009AB039 /* Object Explorers */ = {
isa = PBXGroup;
children = (
944F7425197B458C009AB039 /* FLEXArrayExplorerViewController.h */,
944F7426197B458C009AB039 /* FLEXArrayExplorerViewController.m */,
944F7427197B458C009AB039 /* FLEXClassExplorerViewController.h */,
944F7428197B458C009AB039 /* FLEXClassExplorerViewController.m */,
944F7429197B458C009AB039 /* FLEXDefaultsExplorerViewController.h */,
944F742A197B458C009AB039 /* FLEXDefaultsExplorerViewController.m */,
944F742D197B458C009AB039 /* FLEXDictionaryExplorerViewController.h */,
944F742E197B458C009AB039 /* FLEXDictionaryExplorerViewController.m */,
944F742F197B458C009AB039 /* FLEXImageExplorerViewController.h */,
944F7430197B458C009AB039 /* FLEXImageExplorerViewController.m */,
944F7431197B458C009AB039 /* FLEXObjectExplorerFactory.h */,
944F7432197B458C009AB039 /* FLEXObjectExplorerFactory.m */,
944F7433197B458C009AB039 /* FLEXObjectExplorerViewController.h */,
944F7434197B458C009AB039 /* FLEXObjectExplorerViewController.m */,
944F7435197B458C009AB039 /* FLEXSetExplorerViewController.h */,
944F7436197B458C009AB039 /* FLEXSetExplorerViewController.m */,
944F7437197B458C009AB039 /* FLEXViewControllerExplorerViewController.h */,
944F7438197B458C009AB039 /* FLEXViewControllerExplorerViewController.m */,
944F7439197B458C009AB039 /* FLEXViewExplorerViewController.h */,
944F743A197B458C009AB039 /* FLEXViewExplorerViewController.m */,
94C681F11A3E941800E1936D /* FLEXLayerExplorerViewController.h */,
94C681F21A3E941800E1936D /* FLEXLayerExplorerViewController.m */,
D03647D619847235007D2A1B /* Private */,
);
name = "Object Explorers";
path = ../Classes/ObjectExplorers;
sourceTree = "<group>";
};
944F743B197B458C009AB039 /* Utility */ = {
isa = PBXGroup;
children = (
944F743C197B458C009AB039 /* FLEXHeapEnumerator.h */,
944F743D197B458C009AB039 /* FLEXHeapEnumerator.m */,
944F743E197B458C009AB039 /* FLEXResources.h */,
944F743F197B458C009AB039 /* FLEXResources.m */,
944F7440197B458C009AB039 /* FLEXRuntimeUtility.h */,
944F7441197B458C009AB039 /* FLEXRuntimeUtility.m */,
944F7442197B458C009AB039 /* FLEXUtility.h */,
944F7443197B458C009AB039 /* FLEXUtility.m */,
94CB48371A8EC6000054A905 /* FLEXMultilineTableViewCell.h */,
94CB48381A8EC6000054A905 /* FLEXMultilineTableViewCell.m */,
942DCD881BAE131500DB5DC2 /* FLEXKeyboardShortcutManager.h */,
942DCD891BAE131500DB5DC2 /* FLEXKeyboardShortcutManager.m */,
942DCD8B1BAE819500DB5DC2 /* FLEXKeyboardHelpViewController.h */,
942DCD8C1BAE819500DB5DC2 /* FLEXKeyboardHelpViewController.m */,
);
name = Utility;
path = ../Classes/Utility;
sourceTree = "<group>";
};
944F7444197B458C009AB039 /* Editing */ = {
isa = PBXGroup;
children = (
944F7445197B458C009AB039 /* Argument Input Views */,
944F745C197B458C009AB039 /* FLEXDefaultEditorViewController.h */,
944F745D197B458C009AB039 /* FLEXDefaultEditorViewController.m */,
944F745E197B458C009AB039 /* FLEXFieldEditorView.h */,
944F745F197B458C009AB039 /* FLEXFieldEditorView.m */,
944F7460197B458C009AB039 /* FLEXFieldEditorViewController.h */,
944F7461197B458C009AB039 /* FLEXFieldEditorViewController.m */,
944F7462197B458C009AB039 /* FLEXIvarEditorViewController.h */,
944F7463197B458C009AB039 /* FLEXIvarEditorViewController.m */,
944F7464197B458C009AB039 /* FLEXMethodCallingViewController.h */,
944F7465197B458C009AB039 /* FLEXMethodCallingViewController.m */,
944F7466197B458C009AB039 /* FLEXPropertyEditorViewController.h */,
944F7467197B458C009AB039 /* FLEXPropertyEditorViewController.m */,
);
name = Editing;
path = ../Classes/Editing;
sourceTree = "<group>";
};
944F7445197B458C009AB039 /* Argument Input Views */ = {
isa = PBXGroup;
children = (
944F7446197B458C009AB039 /* FLEXArgumentInputColorView.h */,
944F7447197B458C009AB039 /* FLEXArgumentInputColorView.m */,
650855E91A9007D5006109A1 /* FLEXArgumentInputDateView.h */,
650855EA1A9007D5006109A1 /* FLEXArgumentInputDateView.m */,
944F7448197B458C009AB039 /* FLEXArgumentInputFontView.h */,
944F7449197B458C009AB039 /* FLEXArgumentInputFontView.m */,
944F744A197B458C009AB039 /* FLEXArgumentInputJSONObjectView.h */,
944F744B197B458C009AB039 /* FLEXArgumentInputJSONObjectView.m */,
944F744C197B458C009AB039 /* FLEXArgumentInputNotSupportedView.h */,
944F744D197B458C009AB039 /* FLEXArgumentInputNotSupportedView.m */,
944F744E197B458C009AB039 /* FLEXArgumentInputNumberView.h */,
944F744F197B458C009AB039 /* FLEXArgumentInputNumberView.m */,
944F7450197B458C009AB039 /* FLEXArgumentInputStringView.h */,
944F7451197B458C009AB039 /* FLEXArgumentInputStringView.m */,
01985ABA1984DE9500A65332 /* FLEXArgumentInputFontsPickerView.h */,
01985ABB1984DE9500A65332 /* FLEXArgumentInputFontsPickerView.m */,
944F7452197B458C009AB039 /* FLEXArgumentInputStructView.h */,
944F7453197B458C009AB039 /* FLEXArgumentInputStructView.m */,
944F7454197B458C009AB039 /* FLEXArgumentInputSwitchView.h */,
944F7455197B458C009AB039 /* FLEXArgumentInputSwitchView.m */,
944F7456197B458C009AB039 /* FLEXArgumentInputTextView.h */,
944F7457197B458C009AB039 /* FLEXArgumentInputTextView.m */,
944F7458197B458C009AB039 /* FLEXArgumentInputView.h */,
944F7459197B458C009AB039 /* FLEXArgumentInputView.m */,
944F745A197B458C009AB039 /* FLEXArgumentInputViewFactory.h */,
944F745B197B458C009AB039 /* FLEXArgumentInputViewFactory.m */,
);
name = "Argument Input Views";
path = ArgumentInputViews;
sourceTree = "<group>";
};
944F7468197B458C009AB039 /* Explorer Toolbar */ = {
isa = PBXGroup;
children = (
944F7469197B458C009AB039 /* FLEXExplorerToolbar.h */,
944F746A197B458C009AB039 /* FLEXExplorerToolbar.m */,
944F746B197B458C009AB039 /* FLEXExplorerViewController.h */,
944F746C197B458C009AB039 /* FLEXExplorerViewController.m */,
944F746D197B458C009AB039 /* FLEXManager.h */,
944F746E197B458C009AB039 /* FLEXManager.m */,
D03647D51984720F007D2A1B /* FLEXManager+Private.h */,
944F746F197B458C009AB039 /* FLEXToolbarItem.h */,
944F7470197B458C009AB039 /* FLEXToolbarItem.m */,
944F7471197B458C009AB039 /* FLEXWindow.h */,
944F7472197B458C009AB039 /* FLEXWindow.m */,
);
name = "Explorer Toolbar";
path = ../Classes/ExplorerToolbar;
sourceTree = "<group>";
};
944F7473197B458C009AB039 /* Global State Explorers */ = {
isa = PBXGroup;
children = (
946C6EC61A75986C006545C2 /* System Log */,
944F7474197B458C009AB039 /* FLEXClassesTableViewController.h */,
944F7475197B458C009AB039 /* FLEXClassesTableViewController.m */,
944F7476197B458C009AB039 /* FLEXFileBrowserTableViewController.h */,
944F7477197B458C009AB039 /* FLEXFileBrowserTableViewController.m */,
65F8DC6A1A8F11020076F87B /* FLEXFileBrowserFileOperationController.h */,
65F8DC6B1A8F11020076F87B /* FLEXFileBrowserFileOperationController.m */,
0149BFE0198FAFC700B90A1B /* FLEXFileBrowserSearchOperation.h */,
0149BFE1198FAFC700B90A1B /* FLEXFileBrowserSearchOperation.m */,
944F7478197B458C009AB039 /* FLEXGlobalsTableViewController.h */,
944F7479197B458C009AB039 /* FLEXGlobalsTableViewController.m */,
944F747A197B458C009AB039 /* FLEXInstancesTableViewController.h */,
944F747B197B458C009AB039 /* FLEXInstancesTableViewController.m */,
944F747C197B458C009AB039 /* FLEXLibrariesTableViewController.h */,
944F747D197B458C009AB039 /* FLEXLibrariesTableViewController.m */,
944F747E197B458C009AB039 /* FLEXLiveObjectsTableViewController.h */,
944F747F197B458C009AB039 /* FLEXLiveObjectsTableViewController.m */,
679F6A101BD61B2400A8C94C /* FLEXCookiesTableViewController.h */,
679F6A111BD61B2400A8C94C /* FLEXCookiesTableViewController.m */,
944F7480197B458C009AB039 /* FLEXWebViewController.h */,
944F7481197B458C009AB039 /* FLEXWebViewController.m */,
);
name = "Global State Explorers";
path = ../Classes/GlobalStateExplorers;
sourceTree = "<group>";
};
944F7482197B458C009AB039 /* View Hierarchy */ = {
isa = PBXGroup;
children = (
944F7483197B458C009AB039 /* FLEXHierarchyTableViewCell.h */,
944F7484197B458C009AB039 /* FLEXHierarchyTableViewCell.m */,
944F7485197B458C009AB039 /* FLEXHierarchyTableViewController.h */,
944F7486197B458C009AB039 /* FLEXHierarchyTableViewController.m */,
944F7487197B458C009AB039 /* FLEXImagePreviewViewController.h */,
944F7488197B458C009AB039 /* FLEXImagePreviewViewController.m */,
);
name = "View Hierarchy";
path = ../Classes/ViewHierarchy;
sourceTree = "<group>";
};
944F74B8197B46D2009AB039 /* FLEX Integration */ = {
isa = PBXGroup;
children = (
@@ -688,29 +271,6 @@
name = "FLEX Integration";
sourceTree = "<group>";
};
946C6EC61A75986C006545C2 /* System Log */ = {
isa = PBXGroup;
children = (
946C6ECB1A759928006545C2 /* FLEXSystemLogTableViewController.h */,
946C6ECA1A759928006545C2 /* FLEXSystemLogTableViewController.m */,
946C6ECD1A7599C4006545C2 /* FLEXSystemLogMessage.h */,
946C6ECE1A7599C4006545C2 /* FLEXSystemLogMessage.m */,
946C6EC71A7598D3006545C2 /* FLEXSystemLogTableViewCell.h */,
946C6EC81A7598D3006545C2 /* FLEXSystemLogTableViewCell.m */,
);
name = "System Log";
path = SystemLog;
sourceTree = "<group>";
};
D03647D619847235007D2A1B /* Private */ = {
isa = PBXGroup;
children = (
D03647D719847248007D2A1B /* FLEXGlobalsTableViewControllerEntry.h */,
D03647D819847248007D2A1B /* FLEXGlobalsTableViewControllerEntry.m */,
);
name = Private;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@@ -763,7 +323,6 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
9421B8931A8BBCB200BA3E46 /* LICENSE in Resources */,
5356825418F3656900BAAD62 /* Main_iPad.storyboard in Resources */,
53874F9918F36B1800510922 /* Localizable.strings in Resources */,
5356825918F3656900BAAD62 /* Images.xcassets in Resources */,
@@ -779,98 +338,32 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
944F749B197B458C009AB039 /* FLEXArgumentInputNotSupportedView.m in Sources */,
535682AE18F3670300BAAD62 /* AAPLDatePickerController.m in Sources */,
946C6ECC1A759928006545C2 /* FLEXSystemLogTableViewController.m in Sources */,
946C6ECF1A7599C4006545C2 /* FLEXSystemLogMessage.m in Sources */,
535682AB18F3670300BAAD62 /* AAPLButtonViewController.m in Sources */,
944F74A2197B458C009AB039 /* FLEXArgumentInputViewFactory.m in Sources */,
944F74A1197B458C009AB039 /* FLEXArgumentInputView.m in Sources */,
535682B618F3670300BAAD62 /* AAPLSegmentedControlViewController.m in Sources */,
942DCD8A1BAE131500DB5DC2 /* FLEXKeyboardShortcutManager.m in Sources */,
944F74AE197B458C009AB039 /* FLEXClassesTableViewController.m in Sources */,
944F74B1197B458C009AB039 /* FLEXInstancesTableViewController.m in Sources */,
944F7497197B458C009AB039 /* FLEXUtility.m in Sources */,
535682B018F3670300BAAD62 /* AAPLDefaultToolbarViewController.m in Sources */,
94CB48391A8EC6000054A905 /* FLEXMultilineTableViewCell.m in Sources */,
535682BD18F3670300BAAD62 /* AAPLTintedToolbarViewController.m in Sources */,
943203FE1978F42F00E24DB3 /* AAPLCatalogTableTableViewController.m in Sources */,
9421B8921A8BBCB200BA3E46 /* FLEXNetworkObserver.m in Sources */,
9421B88F1A8BBCB200BA3E46 /* FLEXNetworkTransaction.m in Sources */,
944F748A197B458C009AB039 /* FLEXClassExplorerViewController.m in Sources */,
535682B318F3670300BAAD62 /* AAPLPageControlViewController.m in Sources */,
535682BA18F3670300BAAD62 /* AAPLSwitchViewController.m in Sources */,
535682AF18F3670300BAAD62 /* AAPLDefaultSearchBarViewController.m in Sources */,
944F74B5197B458C009AB039 /* FLEXHierarchyTableViewCell.m in Sources */,
944F74AD197B458C009AB039 /* FLEXWindow.m in Sources */,
944F749D197B458C009AB039 /* FLEXArgumentInputStringView.m in Sources */,
944F74A9197B458C009AB039 /* FLEXExplorerToolbar.m in Sources */,
944F74A8197B458C009AB039 /* FLEXPropertyEditorViewController.m in Sources */,
944F74B0197B458C009AB039 /* FLEXGlobalsTableViewController.m in Sources */,
944F748B197B458C009AB039 /* FLEXDefaultsExplorerViewController.m in Sources */,
944F749E197B458C009AB039 /* FLEXArgumentInputStructView.m in Sources */,
94CB4D4F1A9829F80054A905 /* FLEXNetworkSettingsTableViewController.m in Sources */,
944F74B3197B458C009AB039 /* FLEXLiveObjectsTableViewController.m in Sources */,
944F748E197B458C009AB039 /* FLEXImageExplorerViewController.m in Sources */,
944F74B6197B458C009AB039 /* FLEXHierarchyTableViewController.m in Sources */,
65F8DC6C1A8F11020076F87B /* FLEXFileBrowserFileOperationController.m in Sources */,
535682BC18F3670300BAAD62 /* AAPLTextViewController.m in Sources */,
9421B8901A8BBCB200BA3E46 /* FLEXNetworkTransactionDetailTableViewController.m in Sources */,
944F74B4197B458C009AB039 /* FLEXWebViewController.m in Sources */,
944F74A5197B458C009AB039 /* FLEXFieldEditorViewController.m in Sources */,
944F7489197B458C009AB039 /* FLEXArrayExplorerViewController.m in Sources */,
535682B418F3670300BAAD62 /* AAPLPickerViewController.m in Sources */,
946C6EC91A7598D3006545C2 /* FLEXSystemLogTableViewCell.m in Sources */,
535682BE18F3670300BAAD62 /* AAPLWebViewController.m in Sources */,
944F7490197B458C009AB039 /* FLEXObjectExplorerViewController.m in Sources */,
944F7499197B458C009AB039 /* FLEXArgumentInputFontView.m in Sources */,
944F7496197B458C009AB039 /* FLEXRuntimeUtility.m in Sources */,
944F7491197B458C009AB039 /* FLEXSetExplorerViewController.m in Sources */,
944F74AF197B458C009AB039 /* FLEXFileBrowserTableViewController.m in Sources */,
535682BB18F3670300BAAD62 /* AAPLTextFieldViewController.m in Sources */,
944F749F197B458C009AB039 /* FLEXArgumentInputSwitchView.m in Sources */,
944F74A3197B458C009AB039 /* FLEXDefaultEditorViewController.m in Sources */,
944F74AB197B458C009AB039 /* FLEXManager.m in Sources */,
94C681F31A3E941800E1936D /* FLEXLayerExplorerViewController.m in Sources */,
944F74B2197B458C009AB039 /* FLEXLibrariesTableViewController.m in Sources */,
942DCD8D1BAE819500DB5DC2 /* FLEXKeyboardHelpViewController.m in Sources */,
535682BF18F3670300BAAD62 /* UIColor+AAPLApplicationSpecific.m in Sources */,
535682B718F3670300BAAD62 /* AAPLSliderViewController.m in Sources */,
9421B88E1A8BBCB200BA3E46 /* FLEXNetworkRecorder.m in Sources */,
944F74AC197B458C009AB039 /* FLEXToolbarItem.m in Sources */,
944F74B7197B458C009AB039 /* FLEXImagePreviewViewController.m in Sources */,
650855EB1A9007D5006109A1 /* FLEXArgumentInputDateView.m in Sources */,
944F7498197B458C009AB039 /* FLEXArgumentInputColorView.m in Sources */,
944F74A0197B458C009AB039 /* FLEXArgumentInputTextView.m in Sources */,
944F749C197B458C009AB039 /* FLEXArgumentInputNumberView.m in Sources */,
944F749A197B458C009AB039 /* FLEXArgumentInputJSONObjectView.m in Sources */,
944F7494197B458C009AB039 /* FLEXHeapEnumerator.m in Sources */,
535682B918F3670300BAAD62 /* AAPLStepperViewController.m in Sources */,
535682AA18F3670300BAAD62 /* AAPLAppDelegate.m in Sources */,
9421B88D1A8BBCB200BA3E46 /* FLEXNetworkHistoryTableViewController.m in Sources */,
9421B8911A8BBCB200BA3E46 /* FLEXNetworkTransactionTableViewCell.m in Sources */,
535682B518F3670300BAAD62 /* AAPLProgressViewController.m in Sources */,
535682AD18F3670300BAAD62 /* AAPLCustomToolbarViewController.m in Sources */,
944F748F197B458C009AB039 /* FLEXObjectExplorerFactory.m in Sources */,
944F748D197B458C009AB039 /* FLEXDictionaryExplorerViewController.m in Sources */,
535682A818F3670300BAAD62 /* AAPLActivityIndicatorViewController.m in Sources */,
944F74A4197B458C009AB039 /* FLEXFieldEditorView.m in Sources */,
944F74A7197B458C009AB039 /* FLEXMethodCallingViewController.m in Sources */,
535682B818F3670300BAAD62 /* AAPLSplitViewControllerDelegate.m in Sources */,
D03647D919847248007D2A1B /* FLEXGlobalsTableViewControllerEntry.m in Sources */,
535682AC18F3670300BAAD62 /* AAPLCustomSearchBarViewController.m in Sources */,
535682A718F3670300BAAD62 /* AAPLActionSheetViewController.m in Sources */,
01985ABC1984DE9500A65332 /* FLEXArgumentInputFontsPickerView.m in Sources */,
944F74AA197B458C009AB039 /* FLEXExplorerViewController.m in Sources */,
944F7492197B458C009AB039 /* FLEXViewControllerExplorerViewController.m in Sources */,
5356824A18F3656900BAAD62 /* main.m in Sources */,
679F6A121BD61B2400A8C94C /* FLEXCookiesTableViewController.m in Sources */,
535682B118F3670300BAAD62 /* AAPLImageViewController.m in Sources */,
944F7493197B458C009AB039 /* FLEXViewExplorerViewController.m in Sources */,
944F7495197B458C009AB039 /* FLEXResources.m in Sources */,
535682A918F3670300BAAD62 /* AAPLAlertViewController.m in Sources */,
944F74A6197B458C009AB039 /* FLEXIvarEditorViewController.m in Sources */,
0149BFE2198FAFC700B90A1B /* FLEXFileBrowserSearchOperation.m in Sources */,
535682B218F3670300BAAD62 /* AAPLMasterViewController.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -938,7 +431,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 7.0;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
@@ -971,7 +464,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 7.0;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
+1 -1
View File
@@ -48,7 +48,7 @@
#import "AAPLAppDelegate.h"
#if DEBUG
#import "FLEXManager.h"
#import <FLEX/FLEX.h>
#endif
@interface AAPLAppDelegate () <NSURLConnectionDataDelegate, NSURLSessionDataDelegate>
@@ -8,7 +8,7 @@
#if DEBUG
// FLEX should only be compiled and used in debug builds.
#import "FLEXManager.h"
#import <FLEX/FLEX.h>
#endif
@implementation AAPLCatalogTableTableViewController
+1 -1
View File
@@ -49,7 +49,7 @@
#if DEBUG
// FLEX should only be compiled and used in debug builds.
#import "FLEXManager.h"
#import <FLEX/FLEX.h>
#endif
@implementation AAPLMasterViewController
+2 -2
View File
@@ -107,8 +107,8 @@
NSTimeInterval animationDuration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
// Convert the keyboard frame from screen to view coordinates.
CGRect keyboardScreenEndFrame = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGRect keyboardScreenBeginFrame = [[userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue];
CGRect keyboardScreenEndFrame = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGRect keyboardScreenBeginFrame = [userInfo[UIKeyboardFrameBeginUserInfoKey] CGRectValue];
CGRect keyboardViewEndFrame = [self.view convertRect:keyboardScreenEndFrame fromView:self.view.window];
CGRect keyboardViewBeginFrame = [self.view convertRect:keyboardScreenBeginFrame fromView:self.view.window];
+3 -3
View File
@@ -1,6 +1,6 @@
Pod::Spec.new do |spec|
spec.name = "FLEX"
spec.version = "2.1.0"
spec.version = "2.1.1"
spec.summary = "A set of in-app debugging and exploration tools for iOS"
spec.description = <<-DESC
- Inspect and modify views in the hierarchy.
@@ -29,11 +29,11 @@ Pod::Spec.new do |spec|
spec.license = { :type => "BSD", :file => "LICENSE" }
spec.author = { "Ryan Olson" => "ryanolsonk@gmail.com" }
spec.social_media_url = "https://twitter.com/ryanolsonk"
spec.platform = :ios, "7.0"
spec.platform = :ios, "8.0"
spec.source = { :git => "https://github.com/Flipboard/FLEX.git", :tag => "#{spec.version}" }
spec.source_files = "Classes/**/*.{h,m}"
spec.frameworks = "CoreGraphics"
spec.libraries = "z"
spec.requires_arc = true
spec.public_header_files = "Classes/**/FLEXManager.h"
spec.public_header_files = [ "Classes/**/FLEXManager.h", "Classes/FLEX.h" ]
end
+74 -2
View File
@@ -7,6 +7,7 @@
objects = {
/* Begin PBXBuildFile section */
04F1CA191C137CF1000A52B0 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = 04F1CA181C137CF1000A52B0 /* LICENSE */; };
3A4C94251B5B20570088C3F2 /* FLEX.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A4C94241B5B20570088C3F2 /* FLEX.h */; settings = {ATTRIBUTES = (Public, ); }; };
3A4C94C51B5B21410088C3F2 /* FLEXArrayExplorerViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A4C943C1B5B21410088C3F2 /* FLEXArrayExplorerViewController.h */; settings = {ATTRIBUTES = (Private, ); }; };
3A4C94C61B5B21410088C3F2 /* FLEXArrayExplorerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A4C943D1B5B21410088C3F2 /* FLEXArrayExplorerViewController.m */; };
@@ -136,8 +137,23 @@
3A4C95421B5B21410088C3F2 /* FLEXNetworkObserver.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A4C94C21B5B21410088C3F2 /* FLEXNetworkObserver.h */; settings = {ATTRIBUTES = (Private, ); }; };
3A4C95431B5B21410088C3F2 /* FLEXNetworkObserver.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A4C94C31B5B21410088C3F2 /* FLEXNetworkObserver.m */; };
3A4C95471B5B217D0088C3F2 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 3A4C95461B5B217D0088C3F2 /* libz.dylib */; };
679F64861BD53B7B00A8C94C /* FLEXCookiesTableViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 679F64841BD53B7B00A8C94C /* FLEXCookiesTableViewController.h */; settings = {ASSET_TAGS = (); }; };
679F64871BD53B7B00A8C94C /* FLEXCookiesTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 679F64851BD53B7B00A8C94C /* FLEXCookiesTableViewController.m */; settings = {ASSET_TAGS = (); }; };
679F64861BD53B7B00A8C94C /* FLEXCookiesTableViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 679F64841BD53B7B00A8C94C /* FLEXCookiesTableViewController.h */; };
679F64871BD53B7B00A8C94C /* FLEXCookiesTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 679F64851BD53B7B00A8C94C /* FLEXCookiesTableViewController.m */; };
779B1ECE1C0C4D7C001F5E49 /* FLEXDatabaseManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 779B1EC01C0C4D7C001F5E49 /* FLEXDatabaseManager.h */; };
779B1ECF1C0C4D7C001F5E49 /* FLEXDatabaseManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 779B1EC11C0C4D7C001F5E49 /* FLEXDatabaseManager.m */; };
779B1ED01C0C4D7C001F5E49 /* FLEXMultiColumnTableView.h in Headers */ = {isa = PBXBuildFile; fileRef = 779B1EC21C0C4D7C001F5E49 /* FLEXMultiColumnTableView.h */; };
779B1ED11C0C4D7C001F5E49 /* FLEXMultiColumnTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 779B1EC31C0C4D7C001F5E49 /* FLEXMultiColumnTableView.m */; };
779B1ED21C0C4D7C001F5E49 /* FLEXTableColumnHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 779B1EC41C0C4D7C001F5E49 /* FLEXTableColumnHeader.h */; };
779B1ED31C0C4D7C001F5E49 /* FLEXTableColumnHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 779B1EC51C0C4D7C001F5E49 /* FLEXTableColumnHeader.m */; };
779B1ED41C0C4D7C001F5E49 /* FLEXTableContentCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 779B1EC61C0C4D7C001F5E49 /* FLEXTableContentCell.h */; };
779B1ED51C0C4D7C001F5E49 /* FLEXTableContentCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 779B1EC71C0C4D7C001F5E49 /* FLEXTableContentCell.m */; };
779B1ED61C0C4D7C001F5E49 /* FLEXTableContentViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 779B1EC81C0C4D7C001F5E49 /* FLEXTableContentViewController.h */; };
779B1ED71C0C4D7C001F5E49 /* FLEXTableContentViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 779B1EC91C0C4D7C001F5E49 /* FLEXTableContentViewController.m */; };
779B1ED81C0C4D7C001F5E49 /* FLEXTableLeftCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 779B1ECA1C0C4D7C001F5E49 /* FLEXTableLeftCell.h */; };
779B1ED91C0C4D7C001F5E49 /* FLEXTableLeftCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 779B1ECB1C0C4D7C001F5E49 /* FLEXTableLeftCell.m */; };
779B1EDA1C0C4D7C001F5E49 /* FLEXTableListViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 779B1ECC1C0C4D7C001F5E49 /* FLEXTableListViewController.h */; };
779B1EDB1C0C4D7C001F5E49 /* FLEXTableListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 779B1ECD1C0C4D7C001F5E49 /* FLEXTableListViewController.m */; };
779B1EDD1C0C4EAD001F5E49 /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 779B1EDC1C0C4EAD001F5E49 /* libsqlite3.dylib */; };
942DCD871BAE0CA300DB5DC2 /* FLEXKeyboardShortcutManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 942DCD831BAE0AD300DB5DC2 /* FLEXKeyboardShortcutManager.m */; };
94AAF0381BAF2E1F00DE8760 /* FLEXKeyboardHelpViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 94AAF0361BAF2E1F00DE8760 /* FLEXKeyboardHelpViewController.h */; settings = {ATTRIBUTES = (Private, ); }; };
94AAF0391BAF2E1F00DE8760 /* FLEXKeyboardHelpViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 94AAF0371BAF2E1F00DE8760 /* FLEXKeyboardHelpViewController.m */; };
@@ -145,6 +161,7 @@
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
04F1CA181C137CF1000A52B0 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = "<group>"; };
3A4C941F1B5B20570088C3F2 /* FLEX.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FLEX.framework; sourceTree = BUILT_PRODUCTS_DIR; };
3A4C94231B5B20570088C3F2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
3A4C94241B5B20570088C3F2 /* FLEX.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FLEX.h; sourceTree = "<group>"; };
@@ -279,6 +296,21 @@
3A4C95461B5B217D0088C3F2 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; };
679F64841BD53B7B00A8C94C /* FLEXCookiesTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXCookiesTableViewController.h; sourceTree = "<group>"; };
679F64851BD53B7B00A8C94C /* FLEXCookiesTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXCookiesTableViewController.m; sourceTree = "<group>"; };
779B1EC01C0C4D7C001F5E49 /* FLEXDatabaseManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXDatabaseManager.h; sourceTree = "<group>"; };
779B1EC11C0C4D7C001F5E49 /* FLEXDatabaseManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXDatabaseManager.m; sourceTree = "<group>"; };
779B1EC21C0C4D7C001F5E49 /* FLEXMultiColumnTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXMultiColumnTableView.h; sourceTree = "<group>"; };
779B1EC31C0C4D7C001F5E49 /* FLEXMultiColumnTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXMultiColumnTableView.m; sourceTree = "<group>"; };
779B1EC41C0C4D7C001F5E49 /* FLEXTableColumnHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXTableColumnHeader.h; sourceTree = "<group>"; };
779B1EC51C0C4D7C001F5E49 /* FLEXTableColumnHeader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXTableColumnHeader.m; sourceTree = "<group>"; };
779B1EC61C0C4D7C001F5E49 /* FLEXTableContentCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXTableContentCell.h; sourceTree = "<group>"; };
779B1EC71C0C4D7C001F5E49 /* FLEXTableContentCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXTableContentCell.m; sourceTree = "<group>"; };
779B1EC81C0C4D7C001F5E49 /* FLEXTableContentViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXTableContentViewController.h; sourceTree = "<group>"; };
779B1EC91C0C4D7C001F5E49 /* FLEXTableContentViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXTableContentViewController.m; sourceTree = "<group>"; };
779B1ECA1C0C4D7C001F5E49 /* FLEXTableLeftCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXTableLeftCell.h; sourceTree = "<group>"; };
779B1ECB1C0C4D7C001F5E49 /* FLEXTableLeftCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXTableLeftCell.m; sourceTree = "<group>"; };
779B1ECC1C0C4D7C001F5E49 /* FLEXTableListViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXTableListViewController.h; sourceTree = "<group>"; };
779B1ECD1C0C4D7C001F5E49 /* FLEXTableListViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXTableListViewController.m; sourceTree = "<group>"; };
779B1EDC1C0C4EAD001F5E49 /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = ../../../../../usr/lib/libsqlite3.dylib; sourceTree = "<group>"; };
942DCD821BAE0AD300DB5DC2 /* FLEXKeyboardShortcutManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXKeyboardShortcutManager.h; sourceTree = "<group>"; };
942DCD831BAE0AD300DB5DC2 /* FLEXKeyboardShortcutManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLEXKeyboardShortcutManager.m; sourceTree = "<group>"; };
94AAF0361BAF2E1F00DE8760 /* FLEXKeyboardHelpViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLEXKeyboardHelpViewController.h; sourceTree = "<group>"; };
@@ -290,6 +322,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
779B1EDD1C0C4EAD001F5E49 /* libsqlite3.dylib in Frameworks */,
3A4C95471B5B217D0088C3F2 /* libz.dylib in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -478,6 +511,7 @@
3A4C949A1B5B21410088C3F2 /* GlobalStateExplorers */ = {
isa = PBXGroup;
children = (
779B1EBF1C0C4D7C001F5E49 /* DatabaseBrowser */,
3A4C949B1B5B21410088C3F2 /* FLEXClassesTableViewController.h */,
3A4C949C1B5B21410088C3F2 /* FLEXClassesTableViewController.m */,
3A4C949D1B5B21410088C3F2 /* FLEXFileBrowserFileOperationController.h */,
@@ -549,11 +583,34 @@
3A4C95451B5B216C0088C3F2 /* Frameworks */ = {
isa = PBXGroup;
children = (
779B1EDC1C0C4EAD001F5E49 /* libsqlite3.dylib */,
3A4C95461B5B217D0088C3F2 /* libz.dylib */,
);
name = Frameworks;
sourceTree = "<group>";
};
779B1EBF1C0C4D7C001F5E49 /* DatabaseBrowser */ = {
isa = PBXGroup;
children = (
779B1EC01C0C4D7C001F5E49 /* FLEXDatabaseManager.h */,
779B1EC11C0C4D7C001F5E49 /* FLEXDatabaseManager.m */,
779B1EC21C0C4D7C001F5E49 /* FLEXMultiColumnTableView.h */,
779B1EC31C0C4D7C001F5E49 /* FLEXMultiColumnTableView.m */,
779B1EC41C0C4D7C001F5E49 /* FLEXTableColumnHeader.h */,
779B1EC51C0C4D7C001F5E49 /* FLEXTableColumnHeader.m */,
779B1EC61C0C4D7C001F5E49 /* FLEXTableContentCell.h */,
779B1EC71C0C4D7C001F5E49 /* FLEXTableContentCell.m */,
779B1EC81C0C4D7C001F5E49 /* FLEXTableContentViewController.h */,
779B1EC91C0C4D7C001F5E49 /* FLEXTableContentViewController.m */,
779B1ECA1C0C4D7C001F5E49 /* FLEXTableLeftCell.h */,
779B1ECB1C0C4D7C001F5E49 /* FLEXTableLeftCell.m */,
779B1ECC1C0C4D7C001F5E49 /* FLEXTableListViewController.h */,
779B1ECD1C0C4D7C001F5E49 /* FLEXTableListViewController.m */,
04F1CA181C137CF1000A52B0 /* LICENSE */,
);
path = DatabaseBrowser;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
@@ -561,12 +618,14 @@
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
779B1EDA1C0C4D7C001F5E49 /* FLEXTableListViewController.h in Headers */,
3A4C94ED1B5B21410088C3F2 /* FLEXArgumentInputColorView.h in Headers */,
3A4C94EB1B5B21410088C3F2 /* FLEXImagePreviewViewController.h in Headers */,
3A4C95381B5B21410088C3F2 /* FLEXNetworkRecorder.h in Headers */,
3A4C94251B5B20570088C3F2 /* FLEX.h in Headers */,
3A4C95051B5B21410088C3F2 /* FLEXArgumentInputViewFactory.h in Headers */,
3A4C951E1B5B21410088C3F2 /* FLEXClassesTableViewController.h in Headers */,
779B1ED21C0C4D7C001F5E49 /* FLEXTableColumnHeader.h in Headers */,
3A4C94FD1B5B21410088C3F2 /* FLEXArgumentInputStructView.h in Headers */,
3A4C95201B5B21410088C3F2 /* FLEXFileBrowserFileOperationController.h in Headers */,
3A4C953E1B5B21410088C3F2 /* FLEXNetworkTransactionDetailTableViewController.h in Headers */,
@@ -580,6 +639,7 @@
3A4C94DF1B5B21410088C3F2 /* FLEXMultilineTableViewCell.h in Headers */,
3A4C953A1B5B21410088C3F2 /* FLEXNetworkSettingsTableViewController.h in Headers */,
3A4C94D11B5B21410088C3F2 /* FLEXLayerExplorerViewController.h in Headers */,
779B1ED01C0C4D7C001F5E49 /* FLEXMultiColumnTableView.h in Headers */,
3A4C94D31B5B21410088C3F2 /* FLEXObjectExplorerFactory.h in Headers */,
3A4C94E31B5B21410088C3F2 /* FLEXRuntimeUtility.h in Headers */,
3A4C95341B5B21410088C3F2 /* FLEXSystemLogTableViewController.h in Headers */,
@@ -591,6 +651,7 @@
3A4C950F1B5B21410088C3F2 /* FLEXMethodCallingViewController.h in Headers */,
3A4C94F51B5B21410088C3F2 /* FLEXArgumentInputJSONObjectView.h in Headers */,
3A4C94F11B5B21410088C3F2 /* FLEXArgumentInputFontsPickerView.h in Headers */,
779B1ED61C0C4D7C001F5E49 /* FLEXTableContentViewController.h in Headers */,
3A4C94C91B5B21410088C3F2 /* FLEXDefaultsExplorerViewController.h in Headers */,
3A4C95221B5B21410088C3F2 /* FLEXFileBrowserSearchOperation.h in Headers */,
3A4C94FF1B5B21410088C3F2 /* FLEXArgumentInputSwitchView.h in Headers */,
@@ -601,9 +662,11 @@
3A4C94C51B5B21410088C3F2 /* FLEXArrayExplorerViewController.h in Headers */,
3A4C94CB1B5B21410088C3F2 /* FLEXDictionaryExplorerViewController.h in Headers */,
3A4C95071B5B21410088C3F2 /* FLEXDefaultEditorViewController.h in Headers */,
779B1ECE1C0C4D7C001F5E49 /* FLEXDatabaseManager.h in Headers */,
3A4C94D51B5B21410088C3F2 /* FLEXObjectExplorerViewController.h in Headers */,
3A4C95011B5B21410088C3F2 /* FLEXArgumentInputTextView.h in Headers */,
3A4C952A1B5B21410088C3F2 /* FLEXLibrariesTableViewController.h in Headers */,
779B1ED41C0C4D7C001F5E49 /* FLEXTableContentCell.h in Headers */,
3A4C952C1B5B21410088C3F2 /* FLEXLiveObjectsTableViewController.h in Headers */,
3A4C94EF1B5B21410088C3F2 /* FLEXArgumentInputDateView.h in Headers */,
3A4C94C71B5B21410088C3F2 /* FLEXClassExplorerViewController.h in Headers */,
@@ -629,6 +692,7 @@
94AAF0381BAF2E1F00DE8760 /* FLEXKeyboardHelpViewController.h in Headers */,
94AAF03A1BAF2F0300DE8760 /* FLEXKeyboardShortcutManager.h in Headers */,
3A4C94E11B5B21410088C3F2 /* FLEXResources.h in Headers */,
779B1ED81C0C4D7C001F5E49 /* FLEXTableLeftCell.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -690,6 +754,7 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
04F1CA191C137CF1000A52B0 /* LICENSE in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -712,6 +777,7 @@
3A4C951F1B5B21410088C3F2 /* FLEXClassesTableViewController.m in Sources */,
3A4C94C61B5B21410088C3F2 /* FLEXArrayExplorerViewController.m in Sources */,
3A4C95081B5B21410088C3F2 /* FLEXDefaultEditorViewController.m in Sources */,
779B1ED11C0C4D7C001F5E49 /* FLEXMultiColumnTableView.m in Sources */,
3A4C94EE1B5B21410088C3F2 /* FLEXArgumentInputColorView.m in Sources */,
3A4C94F01B5B21410088C3F2 /* FLEXArgumentInputDateView.m in Sources */,
3A4C94CA1B5B21410088C3F2 /* FLEXDefaultsExplorerViewController.m in Sources */,
@@ -722,6 +788,7 @@
3A4C94E01B5B21410088C3F2 /* FLEXMultilineTableViewCell.m in Sources */,
3A4C95431B5B21410088C3F2 /* FLEXNetworkObserver.m in Sources */,
3A4C94D21B5B21410088C3F2 /* FLEXLayerExplorerViewController.m in Sources */,
779B1EDB1C0C4D7C001F5E49 /* FLEXTableListViewController.m in Sources */,
3A4C94E41B5B21410088C3F2 /* FLEXRuntimeUtility.m in Sources */,
3A4C94D41B5B21410088C3F2 /* FLEXObjectExplorerFactory.m in Sources */,
3A4C952F1B5B21410088C3F2 /* FLEXWebViewController.m in Sources */,
@@ -734,6 +801,7 @@
3A4C94DE1B5B21410088C3F2 /* FLEXHeapEnumerator.m in Sources */,
3A4C95251B5B21410088C3F2 /* FLEXFileBrowserTableViewController.m in Sources */,
3A4C94DA1B5B21410088C3F2 /* FLEXViewControllerExplorerViewController.m in Sources */,
779B1ED51C0C4D7C001F5E49 /* FLEXTableContentCell.m in Sources */,
3A4C94E21B5B21410088C3F2 /* FLEXResources.m in Sources */,
3A4C94D81B5B21410088C3F2 /* FLEXSetExplorerViewController.m in Sources */,
3A4C95311B5B21410088C3F2 /* FLEXSystemLogMessage.m in Sources */,
@@ -744,14 +812,18 @@
3A4C95351B5B21410088C3F2 /* FLEXSystemLogTableViewController.m in Sources */,
3A4C95271B5B21410088C3F2 /* FLEXGlobalsTableViewController.m in Sources */,
3A4C95161B5B21410088C3F2 /* FLEXExplorerViewController.m in Sources */,
779B1ED31C0C4D7C001F5E49 /* FLEXTableColumnHeader.m in Sources */,
3A4C94EA1B5B21410088C3F2 /* FLEXHierarchyTableViewController.m in Sources */,
3A4C95331B5B21410088C3F2 /* FLEXSystemLogTableViewCell.m in Sources */,
3A4C95191B5B21410088C3F2 /* FLEXManager.m in Sources */,
3A4C95021B5B21410088C3F2 /* FLEXArgumentInputTextView.m in Sources */,
3A4C94FA1B5B21410088C3F2 /* FLEXArgumentInputNumberView.m in Sources */,
779B1ED71C0C4D7C001F5E49 /* FLEXTableContentViewController.m in Sources */,
3A4C95001B5B21410088C3F2 /* FLEXArgumentInputSwitchView.m in Sources */,
3A4C94CC1B5B21410088C3F2 /* FLEXDictionaryExplorerViewController.m in Sources */,
3A4C953F1B5B21410088C3F2 /* FLEXNetworkTransactionDetailTableViewController.m in Sources */,
779B1ED91C0C4D7C001F5E49 /* FLEXTableLeftCell.m in Sources */,
779B1ECF1C0C4D7C001F5E49 /* FLEXDatabaseManager.m in Sources */,
3A4C94E61B5B21410088C3F2 /* FLEXUtility.m in Sources */,
3A4C95231B5B21410088C3F2 /* FLEXFileBrowserSearchOperation.m in Sources */,
3A4C950C1B5B21410088C3F2 /* FLEXFieldEditorViewController.m in Sources */,
+14
View File
@@ -21,6 +21,8 @@ FLEX (Flipboard Explorer) is a set of in-app debugging and exploration tools for
- View system log messages (e.g. from `NSLog`).
- Access any live object via a scan of the heap.
- View the file system within your app's sandbox.
- Browse SQLite databases in the file system.
- Trigger 3D touch in the simulator using the control, shift, and command keys.
- Explore all classes in your app and linked systems frameworks (public and private).
- Quickly access useful objects such as `[UIApplication sharedApplication]`, the app delegate, the root view controller on the key window, and more.
- Dynamically view and modify `NSUserDefaults` values.
@@ -85,6 +87,16 @@ View the file system within your app's sandbox. FLEX shows file sizes, image pre
![File Browser](http://engineering.flipboard.com/assets/flex/file-browser.gif)
### SQLite Browser
SQLite database files with a .db extension can be explored using FLEX. The database browser lets you view all tables, and individual tables can be sorted by tapping column headers.
![Database Browser](https://cloud.githubusercontent.com/assets/1422245/11786700/d0ab95dc-a23c-11e5-80ce-0e1b4dba2b6b.png)
### 3D Touch in the Simulator
Using a combination of the command, control, and shift keys, you can simulate different levels of 3D touch pressure in the simulator. Each key contributes 1/3 of maximum possible force. Note that you need to move the touch slightly to get pressure updates.
![Simulator 3D Touch](https://cloud.githubusercontent.com/assets/1422245/11786615/5d4ef96c-a23c-11e5-975e-67275341e439.gif)
### System Library Exploration
Go digging for all things public and private. To learn more about a class, you can create an instance of it and explore its default state.
@@ -142,6 +154,8 @@ FLEX builds on ideas and inspiration from open source tools that came before it.
- [Gist](https://gist.github.com/samdmarshall/17f4e66b5e2e579fd396) from [@samdmarshall](https://github.com/samdmarshall): another example of enumerating malloc blocks.
- [Non-pointer isa](http://www.sealiesoftware.com/blog/archive/2013/09/24/objc_explain_Non-pointer_isa.html): an explanation of changes to the isa field on iOS for ARM64 and mention of the useful `objc_debug_isa_class_mask` variable.
- [GZIP](https://github.com/nicklockwood/GZIP): A library for compressing/decompressing data on iOS using libz.
- [FMDB](https://github.com/ccgus/fmdb): This is an Objective-C wrapper around SQLite