私はUITabBarController
に5 UINavigationControllers
というホストを持っています(N1〜N5と呼ぶ)。 UINavigationControllers
のそれぞれには、UITableViewControllerをナビゲーションスタックにプッシュするUI要素があります(私はこれらを実装するためにMonoTouch.Dialog
DialogViewController
を使用します)UITableViewControllers
。 T1〜T5と呼んでみましょう。ViewDid UINavigationControllerの上にナビゲートすると呼び出されない場合
タブ間をナビゲートすると、メソッドがN1 - N5のそれぞれで期待通りに呼び出されます。しかし、例えばN1のUI要素に触れると、T1がナビスタックにプッシュされた後、戻るボタンを使用して戻ると、N1のViewDidAppear
メソッドが呼び出されません。
面白いのは、別のタブ(N2)に「タブオーバー」してからN1に「タブバック」すると、ViewDidAppear
が通常通り呼び出されるということです。そして、もし私がT1をnavスタックにプッシュしたとしても、同じタブを使うと、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);
}
}