我有一个UITabBarController
来托管5 UINavigationControllers
(让他们称之为N1 - N5)。每个UINavigationControllers
都有UI元素,可以将UITableViewController推送到导航堆栈(我使用MonoTouch.Dialog
DialogViewController
来实现这些UITableViewControllers
)。让我们称之为T1 - T5。
当我在选项卡之间导航时,会按预期在N1-N5中调用ViewDidAppear
方法。但是当我触摸一个UI元素,比如N1,导致T1被推到导航堆栈上,然后尝试使用后退按钮返回时,N1的ViewDidAppear
方法没有'被叫。
有趣的是,如果我"标签超过"到另一个标签(比如N2)然后"标签回来"到N1,ViewDidAppear
将被正常调用。即使我把T1推到导航堆栈上,如果我做同样的标签,N1' ViewDidAppear
仍会被调用。
N1的MonoTouch
代码如下所示:
public class CalendarPage : UINavigationController
{
private DialogViewController dvc;
public override void ViewDidAppear (bool animated)
{
// initialize controls
var now = DateTime.Today;
var root = new RootElement("Calendar")
{
from it in App.ViewModel.Items
where it.Due != null && it.Due >= now
orderby it.Due ascending
group it by it.Due into g
select new Section (((DateTime) g.Key).ToString("d"))
{
from hs in g
select (Element) new StringElement (((DateTime) hs.Due).ToString("d"),
delegate
{
ItemPage itemPage = new ItemPage(this, hs);
itemPage.PushViewController();
})
{
Value = hs.Name
}
}
};
if (dvc == null)
{
// create and push the dialog view onto the nav stack
dvc = new DialogViewController(UITableViewStyle.Plain, root);
dvc.NavigationItem.HidesBackButton = true;
dvc.Title = NSBundle.MainBundle.LocalizedString ("Calendar", "Calendar");
this.PushViewController(dvc, false);
}
else
{
// refresh the dialog view controller with the new root
var oldroot = dvc.Root;
dvc.Root = root;
oldroot.Dispose();
dvc.ReloadData();
}
base.ViewDidAppear (animated);
}
}
答案 0 :(得分:1)
我弄清楚发生了什么事。当在内部DialogViewController
(在ItemPage中创建)上按下后退按钮时,外部DialogViewController
(上面的“T1”)现在是第一个响应者,而不是UINavigationController
(“N1” )。我的困惑源于这样一个事实,即我在外侧DialogViewController
上关闭了后退按钮,所以我假设我一直弹出UINavigationController
(N1),而我仍然在DialogViewController
{1}}(T1)。
我通过在内部ViewDissapearing
(本例中为ItemPage)上创建DialogViewController
事件并检查我是否正在弹出来实现所需的行为(刷新“T1”的内容) - 如果所以,调用父控制器的ViewDidAppear
方法。
actionsViewController.ViewDissapearing += (sender, e) =>
{
if (actionsViewController.IsMovingFromParentViewController)
controller.ViewDidAppear(false);
};
请注意,这段代码的有趣之处在于,实际运行的属性是IsMovingFromParentViewController
,而不是IsMovingToParentViewController
(这是您在导航回来时直观地设置的内容)。我想这可能是MT.Dialog中的一个错误,但是由于后面紧凑的原因无法修复。
我希望最终帮助某人......