Permalink
Browse files

CPTabView: load tab view items asynchronously when possible (#2479)

When an item created with +tabViewItemWithViewController:, the view is loaded asynchronously

Manual test CPTabViewNib have been modified to show a tab view item
managed by a view controller. Any setup happens in
-viewDidAppear: because we cannot use any more the
tabView:didSelectTabViewItem: delegate method.
  • Loading branch information...
1 parent 62e5d8d commit 0eb196e852fa8d310f0e3fa2ed3f5a421566bdd4 @cacaodev cacaodev committed on GitHub Oct 20, 2016
View
@@ -335,13 +335,40 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1,
[_tabs setSelectedSegment:anIndex];
_selectedTabViewItem = aTabViewItem;
- [self _displayItemView:[aTabViewItem view]];
+ [self _loadTabViewItem:aTabViewItem];
[self _sendDelegateDidSelectTabViewItem:aTabViewItem];
return YES;
}
+- (void)_loadTabViewItem:(CPTabViewItem)aTabViewItem
+{
+ var controller = [aTabViewItem viewController];
+
+ if (controller !== nil && ![controller isViewLoaded])
+ {
+ [controller loadViewWithCompletionHandler:function(view, error)
+ {
+ if (error !== nil)
+ {
+ CPLog.warn("Could not load the view for item " + aTabViewItem + ". " + error);
+ }
+ else if (view !== nil)
+ {
+ [aTabViewItem setView:view];
+
+ if ([self selectedTabViewItem] == aTabViewItem)
+ [self _displayItemView:view];
+ }
+ }];
+ }
+ else
+ {
+ [self _displayItemView:[aTabViewItem view]];
+ }
+}
+
/*!
Returns the current item being displayed.
@return the tab view item currenly being displayed by the receiver
@@ -848,4 +875,4 @@ var CPTabViewItemsKey = "CPTabViewItemsKey",
return [super hitTest:aPoint];
}
-@end
+@end
@@ -270,7 +270,7 @@ CPPressedTab = 2;
[self setLabel:title];
if ([_tabView selectedTabViewItem] == self)
- [_tabView _displayItemView:[_viewController view]];
+ [_tabView _loadTabViewItem:self];
}
@end
@@ -7,6 +7,7 @@
*/
@import <AppKit/AppKit.j>
@import <Foundation/CPObject.j>
+@import "TabViewController.j"
CPLogRegister(CPLogConsole);
@@ -15,31 +16,32 @@ CPLogRegister(CPLogConsole);
CPWindow theWindow; //this "outlet" is connected automatically by the Cib
@outlet CPTabView nibTabView;
@outlet CPTabView nibTabViewEmpty;
- @outlet CPViewController viewController;
@outlet CPStepper insertStepper;
@outlet CPStepper removeStepper;
@outlet CPButton fromViewController;
}
- (IBAction)insertTabViewItem:(id)sender
{
- var idx = [insertStepper intValue],
- item;
-
- if ([fromViewController state])
- item = [CPTabViewItem tabViewItemWithViewController:viewController];
- else
- {
- item = [[CPTabViewItem alloc] initWithIdentifier:@"Insert" + idx];
- var view = [[CPView alloc] initWithFrame:CGRectMakeZero()];
- [view setBackgroundColor:[CPColor randomColor]];
- [item setView:view];
- [item setLabel:@"Insert" + idx];
- }
+ var idx = [insertStepper objectValue];
+ var item = [[CPTabViewItem alloc] initWithIdentifier:@"Insert" + idx];
+ var view = [[CPView alloc] initWithFrame:CGRectMakeZero()];
+ [view setBackgroundColor:[CPColor randomColor]];
+ [item setView:view];
+ [item setLabel:@"Insert" + idx];
[nibTabView insertTabViewItem:item atIndex:idx];
}
+- (IBAction)insertViewControllerTabViewItem:(id)sender
+{
+ var ctl = [[TabViewController alloc] initWithCibName:@"TabViewItem" bundle:nil];
+ [ctl setTitle:@"View Controller"];
+ var item = [CPTabViewItem tabViewItemWithViewController:ctl];
+
+ [nibTabView insertTabViewItem:item atIndex:0];
+}
+
- (IBAction)removeTabViewItem:(id)sender
{
var idx = [removeStepper intValue],
@@ -0,0 +1 @@
+280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;17E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;1;0E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;22E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;23E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;24E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;20E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;25E;E;D;K;10;$classnameS;21;CPCibBindingConnectorK;8;$classesA;S;21;CPCibBindingConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;16E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;22E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;26E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;27E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;28E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;30E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;31E;E;D;K;10;$classnameS;18;_CPCibClassSwapperK;8;$classesA;S;18;_CPCibClassSwapperS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;32E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;33E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;33E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;34E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;35E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;36E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;37E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;37E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;38E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;39E;K;30;_CPCibClassSwapperClassNameKeyD;K;6;CP$UIDd;2;40E;K;38;_CPCibClassSwapperOriginalClassNameKeyD;K;6;CP$UIDd;2;40E;E;D;K;10;$classnameS;8;CPButtonK;8;$classesA;S;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;21E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;20E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;32E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;41E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;42E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;20E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;43E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;44E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;45E;K;15;$aimage-scalingD;K;6;CP$UIDd;2;32E;K;6;$afontD;K;6;CP$UIDd;2;47E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;32E;K;11;$aalignmentD;K;6;CP$UIDd;2;48E;K;7;$aimageD;K;6;CP$UIDd;2;50E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;37E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;37E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;38E;K;19;CPViewAppearanceKeyD;K;6;CP$UIDd;1;0E;K;22;CPViewTrackingAreasKeyD;K;6;CP$UIDd;2;51E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;32E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;52E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;32E;K;33;CPControlBaseWrittingDirectionKeyD;K;6;CP$UIDd;2;53E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;2;54E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;2;55E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;38E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;2;56E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;32E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;2;57E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;48E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;32E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;S;16;CPViewControllerD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;4;viewS;24;title: representedObjectS;5;titleS;17;representedObjectD;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;29E;K;10;CP.objectsD;E;E;S;13;CPApplicationd;1;0S;18;{{0, 0}, {90, 40}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;22E;E;E;d;2;12S;6;normalS;6;{1, 1}F;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;6;CPViewS;19;{{9, 10}, {69, 25}}S;18;{{0, 0}, {69, 25}}d;2;36S;6;buttonS;27;bordered+controlSizeRegularD;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;46E;K;13;CPFontNameKeyD;K;6;CP$UIDd;2;58E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;2;53E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;57E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;38E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;57E;E;d;1;2D;K;10;$classnameS;17;_CPThemeAttributeK;8;$classesA;S;17;_CPThemeAttributeS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;49E;K;4;nameD;K;6;CP$UIDd;2;59E;K;12;defaultValueD;K;6;CP$UIDd;2;61E;K;5;stateD;K;6;CP$UIDd;2;62E;K;5;valueD;K;6;CP$UIDd;2;63E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;d;1;4d;2;-1S;6;ButtonS;0;d;2;14T;S;28;_CPFontSystemFacePlaceholderS;5;imageD;K;10;$classnameS;6;CPNullK;8;$classesA;S;6;CPNullS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;60E;E;S;11;highlightedD;K;6;$classD;K;6;CP$UIDd;2;46E;K;13;CPFontNameKeyD;K;6;CP$UIDd;2;64E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;2;65E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;38E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;38E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;38E;E;S;18;.AppleSystemUIFontd;2;13E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E;
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="10117" systemVersion="15E65" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+ <dependencies>
+ <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="10117"/>
+ </dependencies>
+ <objects>
+ <customObject id="-2" userLabel="File's Owner" customClass="NSViewController">
+ <connections>
+ <outlet property="view" destination="c22-O7-iKe" id="qxT-KH-2c6"/>
+ </connections>
+ </customObject>
+ <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+ <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+ <customView id="c22-O7-iKe" customClass="CPView">
+ <rect key="frame" x="0.0" y="0.0" width="90" height="40"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+ <subviews>
+ <button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="2mc-qc-fMw">
+ <rect key="frame" x="3" y="2" width="81" height="32"/>
+ <buttonCell key="cell" type="push" title="Button" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Xfn-8O-d0Z">
+ <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+ <font key="font" metaFont="system"/>
+ </buttonCell>
+ <connections>
+ <binding destination="-2" name="title" keyPath="representedObject" id="r8y-dc-uru"/>
+ </connections>
+ </button>
+ </subviews>
+ <point key="canvasLocation" x="218" y="301"/>
+ </customView>
+ </objects>
+</document>
Oops, something went wrong.
Oops, something went wrong.

0 comments on commit 0eb196e

Please sign in to comment.