/ / iOS 8:ABPeoplePickerNavigationController - ios、abpeoplepickerviewのすべてでナビゲーションバーを変更することはできません

iOS 8:ABPeoplePickerNavigationController - ios、abpeoplepickerviewのすべてでナビゲーションバーを変更できません

私はその色を変えようとします。ABPeoplePickerNavigationControllerは私のアプリケーションの色にナビバーします。ただし、変更はありません。私がそれを隠そうとしたり、少なくともステータスバーの濃淡を変えようとしても何も起こりません。どうして?

- (ABPeoplePickerNavigationController *)peoplePicker
{
if(!_peoplePicker){
_peoplePicker = [[ABPeoplePickerNavigationController alloc]init];
_peoplePicker.peoplePickerDelegate = self;
_peoplePicker.navigationBar.hidden = YES;
}
return _peoplePicker;
}

私は怠惰な私のナビゲーションコントローラをインスタンス化し、他のメソッド呼び出しビューのコントローラなどをうまく解除するように呼び出す。

編集:これは私の現在のコードです(賞金のため)。このような色の変化は起こりません:

- (ABPeoplePickerNavigationController *)peoplePicker
{
if(!_peoplePicker){
_peoplePicker = [[ABPeoplePickerNavigationController alloc]init];
_peoplePicker.peoplePickerDelegate = self;
_peoplePicker.navigationBar.tintColor = [UIColor blackColor];
}
return _peoplePicker;
}

- (IBAction)addressBookButtonClicked:(id)sender {
[self presentViewController:self.peoplePicker animated:YES completion:nil];
}

iOS8でこれ以上の作業はできませんか?

回答:

回答№1の場合は7

実際には、上記のコメントのおかげで、外観のプロキシは次のように動作するはずです。

[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];

これをviewDidLoadメソッドに入れてABPeoplePickerViewを起動するコントローラを表示します。これはMFMailerViewでも同様に機能します。 私のコードを正しくスタイルするために使用しているコードは、次のとおりです。

[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:[UIFont
fontWithName:@"Helvetica Neue" size:12], NSFontAttributeName,
[UIColor whiteColor], NSForegroundColorAttributeName, nil];

[[UINavigationBar appearance] setTitleTextAttributes:attributes];

回答№2については2
    ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
[[UIBarButtonItem appearanceWhenContainedIn:[ABPeoplePickerNavigationController class], nil] setTintColor:[UIColor whiteColor]];
[[UINavigationBar appearanceWhenContainedIn:[ABPeoplePickerNavigationController class], nil] setTintColor:[UIColor whiteColor]];
[[UINavigationBar appearanceWhenContainedIn:[ABPeoplePickerNavigationController class], nil] setBarTintColor:[UIColor redColor]];
[picker.navigationController.navigationBar setTranslucent:NO];

私はviewdidloadにいなくても、ピッカーを提示する前にこれらのメソッドを呼び出します。


回答№3の場合は1

色の問題: ナビゲーションバーは、アクセスしようとしている時点ではロードされないことがあります。 ABPeoplePickerNavigationControllerを提示した後で、色のプロパティを設定しようとしましたか?

非表示の問題:通常、NavigationBarを非表示にするには:

- (void)setNavigationBarHidden:(BOOL)hidden animated:(BOOL)animated;

あなたのケースでは、UINavigationControllerのABPeoplePickerNavigationControllerにあります。

乾杯、ファビアン


回答№4の場合は1

あなたはインスタンス変数(iVar)を使用しています。 _peoplePickerこれは明らかに不動産に属しています peoplePicker。さらに、メソッドがあります peoplePicker クラスのオブジェクトを返す ABPeoplePickerNavigationController *.
あなたの IBAction addressBookButtonClicked: あなたは命令を実行する

[self presentViewController:self.peoplePicker animated:YES completion:nil];

つまり、メソッドを呼び出す peoplePicker、これはiVarをチェックします _peoplePicker それが設定されている場合は色合いなどの色を設定します nil 値。
しかし、iVarを直接使用しているので、 _peoplePicker の代わりに self.peoplePickerあなたはセッターメソッドを使用せず、単純に割り当てを行います。
これは、 UIColor あなたが作成するオブジェクト [UIColor blackColor] 保持カウントが1の命令は命令では増加しません _peoplePicker.navigationBar.tintColor = [UIColor blackColor]; それが返されたときにオートリリースプールに入れられます return _peoplePicker;。しかし、あなたがアプリがメインイベントループに戻ると、オートリリープールが流出し、 UIColor オブジェクトが解放されます。
だから私はあなたがすべての課題を _peoplePicker 割当によって self.peoplePicker。次に、セッターメソッドを使用して、保持カウントを増加させます。 UIColor オブジェクトは生き残ります。