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