fix android onSelectedItem handler.

fix ios transition (previous fix was not enough)
This commit is contained in:
hshristov
2015-04-07 17:46:58 +03:00
parent 0386d07604
commit 44e22495da
2 changed files with 14 additions and 20 deletions

View File

@ -182,7 +182,7 @@ class PageFragmentBody extends android.app.Fragment {
return true; return true;
} }
super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
} }

View File

@ -226,26 +226,18 @@ class UINavigationControllerImpl extends UINavigationController implements UINav
} }
public navigationControllerWillShowViewControllerAnimated(navigationController: UINavigationController, viewController: UIViewController, animated: boolean): void { public navigationControllerWillShowViewControllerAnimated(navigationController: UINavigationController, viewController: UIViewController, animated: boolean): void {
// This method is needed otherwise it will be too late and transition will completed before page is layouted. // In this method we need to layout the new page otherwise page will be shown empty and update after that which is bad UX.
var frame = this._owner; var frame = this._owner;
var backStack = frame.backStack;
var currentEntry = backStack.length > 0 ? backStack[backStack.length - 1] : null;
var newEntry: definition.BackstackEntry = viewController[ENTRY]; var newEntry: definition.BackstackEntry = viewController[ENTRY];
var isBack = currentEntry && newEntry === currentEntry;
if (!isBack) {
var newPage = newEntry.resolvedPage; var newPage = newEntry.resolvedPage;
if (!newPage.parent) {
if (!frame._currentEntry) {
frame._currentEntry = newEntry;
}
else {
frame._navigateToEntry = newEntry; frame._navigateToEntry = newEntry;
}
frame._addView(newPage); frame._addView(newPage);
frame.populateMenuItems(newPage); frame.populateMenuItems(newPage);
} }
else if (newPage.parent !== frame) {
throw new Error("Page is already shown on another frame.");
}
} }
public navigationControllerDidShowViewControllerAnimated(navigationController: UINavigationController, viewController: UIViewController, animated: boolean): void { public navigationControllerDidShowViewControllerAnimated(navigationController: UINavigationController, viewController: UIViewController, animated: boolean): void {
@ -255,6 +247,8 @@ class UINavigationControllerImpl extends UINavigationController implements UINav
var currentEntry = backStack.length > 0 ? backStack[backStack.length - 1] : null; var currentEntry = backStack.length > 0 ? backStack[backStack.length - 1] : null;
var newEntry: definition.BackstackEntry = viewController[ENTRY]; var newEntry: definition.BackstackEntry = viewController[ENTRY];
// This code check if navigation happened through UI (e.g. back button or swipe gesture).
// When calling goBack on frame isBack will be false.
var isBack: boolean = currentEntry && newEntry === currentEntry; var isBack: boolean = currentEntry && newEntry === currentEntry;
if (isBack) { if (isBack) {
try { try {
@ -267,16 +261,16 @@ class UINavigationControllerImpl extends UINavigationController implements UINav
} }
var page = frame.currentPage; var page = frame.currentPage;
if (page && isBack) { if (page && !navigationController.viewControllers.containsObject(page.ios)) {
frame._removeView(page); frame._removeView(page);
} }
var newPage = newEntry.resolvedPage;
frame._navigateToEntry = null; frame._navigateToEntry = null;
frame._currentEntry = newEntry; frame._currentEntry = newEntry;
frame.updateNavigationBar(); frame.updateNavigationBar();
var newPage = newEntry.resolvedPage;
// notify the page // notify the page
newPage.onNavigatedTo(newEntry.entry.context); newPage.onNavigatedTo(newEntry.entry.context);
frame._processNavigationQueue(newPage); frame._processNavigationQueue(newPage);