次のステートメントでナビゲーションバーのタイトルを変更しようとしています。
[[self navigationItem] setTitle:myTitle];
viewDidLoadとviewWillAppearでは正常に機能しますが、他の場所では機能しません。私がやろうとしていることは可能ですか?これは私が使用しているビューコントローラーです。
次のステートメントでナビゲーションバーのタイトルを変更しようとしています。
[[self navigationItem] setTitle:myTitle];
viewDidLoadとviewWillAppearでは正常に機能しますが、他の場所では機能しません。私がやろうとしていることは可能ですか?これは私が使用しているビューコントローラーです。
現在のViewControllerのタイトルを変更する非常に簡単な方法があります。
self.title = @"New Title";
ナビゲーションコントローラー内にあるビューコントローラーでこれを呼び出すと、ナビゲーションバーに表示されるタイトルが新しいタイトルで更新されます。
これは、ViewControllerが表示されている間はいつでも呼び出すことができます。
navigationItem
タイトルを設定するためにビューコントローラを掘り下げる必要はありません。
私はこれが古いことを知っていますが、将来のユーザーのためにこれに答えたいと思いました。ほとんどの回答がカバーしていない主な問題は、メインスレッドからタイトルを設定することが重要であるということだと思います。そうしないと、すぐに設定されない場合がいくつかあります。Swift 3.0の場合、次のようなコードを使用できます。
DispatchQueue.main.async {
self.title = "Example string"
}
メインスレッドからすべてのUI更新を行うことが重要です。元のユーザーが非同期クロージャーを介してタイトルを設定していたかどうかはわかりませんが、これは問題を抱えている人には役立つはずです。
実際には、navigationItemが使用するのはViewControllerの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)を作成し、それを他のアプリにサブクラス化することをお勧めしますアプリのコントローラーを表示します。
@ reid55以下の方法でも、ナビゲーションタイトルを設定できます。
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
[[self navigationItem] setTitle:myTitle];
}
return self;
}
viewDidLoad
ビューはまだ表示されていませんが、インスタレーションされているため、でタイトルを設定できます。の同じ話viewWillAppear
。が表示された後は、。UIElement
なしでタイトルを変更することはできませんredraw
。