2011-03-17 63 views
2

嘿,我有一堆UIViewController s在UINavigationController之内。通常,标题(或NavigationItem的标题)决定导航栏(显示在顶部)显示的标题以及所有导航按钮(例如导航栏本身的后退按钮)。NavigationBar和导航按钮中的单独标题

现在我打算在NavigationBar的标题中加入更多信息,同时仍然保留这些按钮标签简洁明快(例如,视图的标题为“<客户名称>概述”,而按钮应该只是显示“概述”)。

我目前正在试图通过更改导航项的标题ViewWillAppearViewWillDisappear来实现此目的。这很好,但人们可以看到文本改变的时刻(可能是由于动画)。我已经尝试了ViewDidAppearViewDidDisappear的不同组合,但效果最好,只有Will方法。下面显示了一个示例代码(Example类被推送到UINavigationController)。

有没有更好的方法来实现这一目标?也许只需更改按钮标题或直接更改导航标题?或者我可以阻止标准机制将标题复制到所有其他实例?

public class Example : UIViewController 
{ 
    private int depth; 

    public Example (int depth = 0) 
    { 
     this.depth = depth; 
     this.Title = "Title"; 
    } 

    public override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 

     UIButton btn = new UIButton(new RectangleF(100, 100, 300, 50)); 
     btn.SetTitle("Duplicate me!", UIControlState.Normal); 
     btn.TouchDown += delegate(object sender, EventArgs e) { 
      NavigationController.PushViewController(new Example(depth + 1), true); 
     }; 
     View.Add(btn); 
    } 

    public override void ViewWillAppear (bool animated) 
    { 
     base.ViewWillAppear(animated); 
     this.NavigationItem.Title = String.Format("Title/{0}", depth); 
    } 

    public override void ViewWillDisappear (bool animated) 
    { 
     base.ViewWillDisappear(animated); 
     this.NavigationItem.Title = "Title"; 
    } 
} 

回答

4

如果我理解正确的话,我觉得有一个现成的这个:

集backBarButtonItem您的视图控制器的导航项目。

+0

然而,这要求我在* next *视图中设置按钮标题;所以我不能在控制器内部更改视图A的按钮标题,但必须在每个视图中执行它,因为我可能会从A中导航到所有视图。所以我需要更改每个可能的从属视图控制器来检查父控制器并基于哪个父控制器来更新按钮。 – poke 2011-03-17 14:11:57

+2

不,您在视图控制器A上设置backBarButtonItem。“backBarButtonItem”定义了如果A是前一个视图控制器,视图控制器B将显示哪个视图。也许有点违反直觉,但是你去了。 – 2011-03-17 14:22:23

+0

哇,太好了。这真的起作用了!没想到它能像那样工作。非常感谢你! – poke 2011-03-17 14:29:05