Skip to content

Commit d9216ac

Browse files
author
Nedyalko Nikolov
committed
Merge pull request NativeScript#156 from NativeScript/nnikolov/RemainingOptionsMenuItemIos
Fixed issue with remaining options menu item (iOS).
2 parents d8556c4 + 03ddb15 commit d9216ac

File tree

9 files changed

+106
-69
lines changed

9 files changed

+106
-69
lines changed

apps/tests/ui/page/page-tests.ios.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,43 @@ export function test_NavBar_isVisible_when_MenuItems_areSet() {
5959
page.off(view.View.loadedEvent, handler);
6060
helper.goBack();
6161
}
62+
}
63+
64+
export function test_NavBarItemsAreClearedFromNativeWhenClearedFromNativeScript() {
65+
var page: PageModule.Page;
66+
var label: LabelModule.Label;
67+
68+
var handler = function (data) {
69+
page.off(PageModule.Page.navigatedToEvent, handler);
70+
var menuItems = page.optionsMenu.getItems();
71+
var i;
72+
for (i = menuItems.length - 1; i >= 0; i--) {
73+
page.optionsMenu.removeItem(menuItems[i]);
74+
}
75+
}
76+
77+
var pageFactory = function (): PageModule.Page {
78+
page = new PageModule.Page();
79+
page.on(PageModule.Page.navigatedToEvent, handler);
80+
81+
var mi = new PageModule.MenuItem();
82+
mi.text = "B";
83+
page.optionsMenu.addItem(mi);
84+
label = new LabelModule.Label();
85+
label.text = "Text";
86+
page.content = label;
87+
return page;
88+
};
89+
90+
helper.navigate(pageFactory);
91+
92+
try {
93+
var navigationItem: UINavigationItem = ((<UIViewController>page.ios).navigationItem);
94+
var rightBarButtonItemsCount = navigationItem.rightBarButtonItems ? navigationItem.rightBarButtonItems.count : 0;
95+
TKUnit.assertEqual(rightBarButtonItemsCount, 0, "After remove all items native items should be 0.");
96+
}
97+
finally {
98+
page.off(view.View.loadedEvent, handler);
99+
helper.goBack();
100+
}
62101
}

ui/frame/frame-common.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -369,10 +369,6 @@ export class Frame extends view.CustomLayoutView implements definition.Frame {
369369
public _removeViewFromNativeVisualTree(child: view.View): void {
370370
child._isAddedToNativeVisualTree = false;
371371
}
372-
373-
public _invalidateOptionsMenu() {
374-
//
375-
}
376372
}
377373

378374
var _topmost = function (): Frame {

ui/frame/frame.android.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -366,12 +366,6 @@ export class Frame extends frameCommon.Frame {
366366
public _clearAndroidReference() {
367367
// we should keep the reference to underlying native object, since frame can contain many pages.
368368
}
369-
370-
public _invalidateOptionsMenu() {
371-
if (this.android && this.android.activity) {
372-
this.android.activity.invalidateOptionsMenu();
373-
}
374-
}
375369
}
376370

377371
declare module com {

ui/frame/frame.d.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ declare module "ui/frame" {
8989

9090
//@private
9191
_processNavigationQueue(page: pages.Page);
92-
_invalidateOptionsMenu();
9392
//@endprivate
9493

9594
/**

ui/frame/frame.ios.ts

Lines changed: 1 addition & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import frameCommon = require("ui/frame/frame-common");
22
import definition = require("ui/frame");
33
import trace = require("trace");
4-
import imageSource = require("image-source");
54
import pages = require("ui/page");
65
import enums = require("ui/enums");
76
import utils = require("utils/utils");
@@ -165,39 +164,6 @@ export class Frame extends frameCommon.Frame {
165164
var navigationBar = this._ios.controller.navigationBar;
166165
return (navigationBar && !this._ios.controller.navigationBarHidden) ? navigationBar.frame.size.height : 0;
167166
}
168-
169-
public _invalidateOptionsMenu() {
170-
this.populateMenuItems(this.currentPage);
171-
}
172-
173-
populateMenuItems(page: pages.Page) {
174-
var items = page.optionsMenu.getItems();
175-
176-
var navigationItem: UINavigationItem = (<UIViewController>page.ios).navigationItem;
177-
var array: NSMutableArray = items.length > 0 ? NSMutableArray.new() : null;
178-
179-
for (var i = 0; i < items.length; i++) {
180-
var item = items[i];
181-
var tapHandler = TapBarItemHandlerImpl.new().initWithOwner(item);
182-
// associate handler with menuItem or it will get collected by JSC.
183-
(<any>item).handler = tapHandler;
184-
185-
var barButtonItem: UIBarButtonItem;
186-
if (item.icon) {
187-
var img = imageSource.fromResource(item.icon);
188-
barButtonItem = UIBarButtonItem.alloc().initWithImageStyleTargetAction(img.ios, UIBarButtonItemStyle.UIBarButtonItemStylePlain, tapHandler, "tap");
189-
}
190-
else {
191-
barButtonItem = UIBarButtonItem.alloc().initWithTitleStyleTargetAction(item.text, UIBarButtonItemStyle.UIBarButtonItemStylePlain, tapHandler, "tap");
192-
}
193-
194-
array.addObject(barButtonItem);
195-
}
196-
197-
if (array) {
198-
navigationItem.setRightBarButtonItemsAnimated(array, true);
199-
}
200-
}
201167
}
202168

203169
class UINavigationControllerImpl extends UINavigationController implements UINavigationControllerDelegate {
@@ -240,7 +206,7 @@ class UINavigationControllerImpl extends UINavigationController implements UINav
240206
}
241207

242208
frame._addView(newPage);
243-
frame.populateMenuItems(newPage);
209+
newPage._invalidateOptionsMenu();
244210
}
245211
else if (newPage.parent !== frame) {
246212
throw new Error("Page is already shown on another frame.");
@@ -322,24 +288,3 @@ class iOSFrame implements definition.iOSFrame {
322288
this._navBarVisibility = value;
323289
}
324290
}
325-
326-
class TapBarItemHandlerImpl extends NSObject {
327-
static new(): TapBarItemHandlerImpl {
328-
return <TapBarItemHandlerImpl>super.new();
329-
}
330-
331-
private _owner: pages.MenuItem;
332-
333-
public initWithOwner(owner: pages.MenuItem): TapBarItemHandlerImpl {
334-
this._owner = owner;
335-
return this;
336-
}
337-
338-
public tap(args) {
339-
this._owner._raiseTap();
340-
}
341-
342-
public static ObjCExposedMethods = {
343-
"tap": { returns: interop.types.void, params: [interop.types.id] }
344-
};
345-
}

ui/page/page-common.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,10 @@ export class Page extends contentView.ContentView implements dts.Page, view.AddA
118118
return this._styleScope;
119119
}
120120

121+
public _invalidateOptionsMenu() {
122+
//
123+
}
124+
121125
private _applyCss() {
122126
if (this._cssApplied) {
123127
return;
@@ -217,8 +221,8 @@ export class OptionsMenu implements dts.OptionsMenu {
217221
}
218222

219223
invalidate() {
220-
if (this._page.frame) {
221-
this._page.frame._invalidateOptionsMenu();
224+
if (this._page) {
225+
this._page._invalidateOptionsMenu();
222226
}
223227
}
224228
}

ui/page/page.android.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,10 @@ export class Page extends pageCommon.Page {
2828
this._isBackNavigation = isBackNavigation;
2929
super.onNavigatedFrom(isBackNavigation);
3030
}
31+
32+
public _invalidateOptionsMenu() {
33+
if (this.frame && this.frame.android && this.frame.android.activity) {
34+
this.frame.android.activity.invalidateOptionsMenu();
35+
}
36+
}
3137
}

ui/page/page.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ declare module "ui/page" {
110110

111111
//@private
112112
_getStyleScope(): styleScope.StyleScope;
113+
_invalidateOptionsMenu();
113114
//@endprivate
114115
}
115116

ui/page/page.ios.ts

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import pageCommon = require("ui/page/page-common");
22
import definition = require("ui/page");
33
import viewModule = require("ui/core/view");
4+
import imageSource = require("image-source");
45
import trace = require("trace");
56

67
declare var exports;
@@ -107,4 +108,56 @@ export class Page extends pageCommon.Page {
107108
get _nativeView(): any {
108109
return this.ios.view;
109110
}
111+
112+
public _invalidateOptionsMenu() {
113+
this.populateMenuItems();
114+
}
115+
116+
populateMenuItems() {
117+
var items = this.optionsMenu.getItems();
118+
119+
var navigationItem: UINavigationItem = (<UIViewController>this.ios).navigationItem;
120+
var array: NSMutableArray = items.length > 0 ? NSMutableArray.new() : null;
121+
122+
for (var i = 0; i < items.length; i++) {
123+
var item = items[i];
124+
var tapHandler = TapBarItemHandlerImpl.new().initWithOwner(item);
125+
// associate handler with menuItem or it will get collected by JSC.
126+
(<any>item).handler = tapHandler;
127+
128+
var barButtonItem: UIBarButtonItem;
129+
if (item.icon) {
130+
var img = imageSource.fromResource(item.icon);
131+
barButtonItem = UIBarButtonItem.alloc().initWithImageStyleTargetAction(img.ios, UIBarButtonItemStyle.UIBarButtonItemStylePlain, tapHandler, "tap");
132+
}
133+
else {
134+
barButtonItem = UIBarButtonItem.alloc().initWithTitleStyleTargetAction(item.text, UIBarButtonItemStyle.UIBarButtonItemStylePlain, tapHandler, "tap");
135+
}
136+
137+
array.addObject(barButtonItem);
138+
}
139+
140+
navigationItem.setRightBarButtonItemsAnimated(array, true);
141+
}
142+
}
143+
144+
class TapBarItemHandlerImpl extends NSObject {
145+
static new(): TapBarItemHandlerImpl {
146+
return <TapBarItemHandlerImpl>super.new();
147+
}
148+
149+
private _owner: definition.MenuItem;
150+
151+
public initWithOwner(owner: definition.MenuItem): TapBarItemHandlerImpl {
152+
this._owner = owner;
153+
return this;
154+
}
155+
156+
public tap(args) {
157+
this._owner._raiseTap();
158+
}
159+
160+
public static ObjCExposedMethods = {
161+
"tap": { returns: interop.types.void, params: [interop.types.id] }
162+
};
110163
}

0 commit comments

Comments
 (0)