2

我正在尝试使用以下语句更改导航栏标题:

[[self navigationItem] setTitle:myTitle];

它在 viewDidLoad 和 viewWillAppear 中运行良好,但在其他任何地方都不起作用。我正在尝试做的事情可能吗?这是我正在使用的视图控制器。

4

5 回答 5

4

有一种非常简单的方法可以更改当前视图控制器的标题。

self.title = @"New Title";

在导航控制器中的视图控制器上调用此方法将导致导航栏中显示的标题被更新为新标题。

这可以在显示视图控制器时随时调用。

无需深入研究视图控制器navigationItem来设置标题。

于 2012-11-10T16:25:47.703 回答
3

我知道这很旧,但我想为未来的用户回答这个问题。我认为大多数答案没有涵盖的主要问题是从主线程设置标题很重要,否则在少数情况下它不会立即设置。对于 Swift 3.0,您可以使用如下代码:

 DispatchQueue.main.async {
        self.title = "Example string"
 }

从主线程进行所有 UI 更新很重要。我不确定原始用户是否通过异步关闭设置标题,但这应该可以帮助任何有困难的人。

于 2017-05-01T17:49:16.893 回答
2

实际上,navigationItem 将使用视图控制器的 title 属性。上面的答案是在导航栏中更改标题的最简单正确的方法。

如果您需要自定义导航栏,您可以在 UIViewController 子类中覆盖它,而不是在 viewDidAppear: 或任何其他 viewWill/Did 方法中更改它

- (UINavigationItem*)navigationItem
{
  UINavigationItem *navigationItem = [super navigationItem];

  // customize it further than the default

  return navigationItem;
}

此外,您可以使用 KVO 更新自定义 titleView 的标题更改。你监听 UIViewController 的 title 属性的变化并更新你的 navigationItem 的 titleView 属性。看一下这个:

static void *kObjectStateObservingContext = &kObjectStateObservingContext;  // outside your @implementation bit

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // other init stuff here...

        [self addObserver: self forKeyPath:@"title" options:NSKeyValueObservingOptionNew context: kObjectStateObservingContext];
    }
    return self;
}

不要忘记删除观察者:

- (void)dealloc
{
    [self removeObserver: self forKeyPath:@"title"];
}

现在我们再次访问 navigationItem,您可以在其中创建一个自定义 UILabel,它会在我们更改标题时更新,之后我们必须为标题更改时提供处理程序实现:

- (UINavigationItem*)navigationItem
{
    UINavigationItem *navigationItem = [super navigationItem];

    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(roundf((320 - 230)/2), 0, 230, 44)];
    titleLabel.font = [UIFont systemFontOfSize: 18];
    titleLabel.textColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"topnav-background-text-gradient.png"]];  // you can even draw the font with a gradient!
    titleLabel.shadowColor = [UIColor colorWithWhite: 1.0 alpha:0.59];
    titleLabel.shadowOffset = CGSizeMake(0, 1.0);
    titleLabel.text = self.title;
    titleLabel.backgroundColor = [UIColor clearColor];
    titleLabel.textAlignment = UITextAlignmentCenter;

    navigationItem.titleView = titleLabel;

    return navigationItem;
}

最后,当 self.title 实际发生变化时该怎么办:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if ( context == kObjectStateObservingContext ) {
        // here we update the text of the titleView
        if ([self.navigationItem.titleView isKindOfClass:[UILabel class]]) {
            [(UILabel*)self.navigationItem.titleView setText: self.title];
        }
    }
    else {
        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
    }
}

你去吧!显然代码比你想象的要多一些,所以如果你现在没有,我建议任何构建 iOS 应用程序的人,你总是为你的应用程序创建一个基类视图控制器,(MyBaseViewController : UIViewController)然后为任何其他的子类在您的应用中查看控制器。

于 2012-11-10T16:32:48.203 回答
0

@reid55 你也可以在下面的方法中设置导航标题:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
  self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
  if (self) {
   [[self navigationItem] setTitle:myTitle];
}
return self;
}
于 2012-11-10T15:30:15.163 回答
0

您可以在 中设置标题viewDidLoad,因为该视图尚不可见但已激活。同样的故事viewWillAppear。可见后UIElement,您无法更改没有redraw.

于 2012-11-10T14:11:47.857 回答