- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我使用下面的代码来自定义我的 UINavigationBar 在显示 ContactPickerViewController
时的外观:
id specialNavBarAppearance = [UINavigationBar appearanceWhenContainedInInstancesOfClasses:@[[CNContactPickerViewController class]]];
[specialNavBarAppearance setBarTintColor:[UIColor colorWithRed:213/255.0f green:38/255.0f blue:46/255.0f alpha:1.0]];
[specialNavBarAppearance setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys:
[UIColor whiteColor], NSForegroundColorAttributeName,nil]];
[specialNavBarAppearance setTintColor:[UIColor whiteColor]];
但没有出现任何变化。我哪里错了?
最佳答案
我为 UIViewController
创建了一个类别,仅当您使用 Method swizzling 呈现 CNContactPickerViewController
时才自定义 UINavigationBar
的外观。在呈现之前,我检查呈现的是否是 CNContactPickerViewController
,然后我们更改外观。然后在解雇时,我将外观重置为默认值。这是一个疯狂的解决方案,但它完成了工作。
#import "UIViewController+CustomAppearance.h"
#import <objc/runtime.h>
@import ContactsUI;
@implementation UIViewController (CustomAppearance)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Class class = [self class];
SEL originalSelector = @selector(presentViewController:animated:completion:);
SEL swizzledSelector = @selector(presentViewController2:animated:completion:);
Method originalMethod = class_getInstanceMethod(class, originalSelector);
Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
BOOL didAddMethod =
class_addMethod(class,
originalSelector,
method_getImplementation(swizzledMethod),
method_getTypeEncoding(swizzledMethod));
if (didAddMethod) {
class_replaceMethod(class,
swizzledSelector,
method_getImplementation(originalMethod),
method_getTypeEncoding(originalMethod));
} else {
method_exchangeImplementations(originalMethod, swizzledMethod);
}
SEL originalSelector2 = @selector(dismissViewControllerAnimated:completion:);
SEL swizzledSelector2 = @selector(dismissViewControllerAnimated2:completion:);
Method originalMethod2 = class_getInstanceMethod(class, originalSelector2);
Method swizzledMethod2 = class_getInstanceMethod(class, swizzledSelector2);
BOOL didAddMethod2 =
class_addMethod(class,
originalSelector2,
method_getImplementation(swizzledMethod2),
method_getTypeEncoding(swizzledMethod2));
if (didAddMethod2) {
class_replaceMethod(class,
swizzledSelector2,
method_getImplementation(originalMethod2),
method_getTypeEncoding(originalMethod2));
} else {
method_exchangeImplementations(originalMethod2, swizzledMethod2);
}
});
}
#pragma mark - Method Swizzling
- (void)dismissViewControllerAnimated2:(BOOL)flag completion:(void (^)(void))completion
{
[self setupDefualtAppearance];
[self dismissViewControllerAnimated2:flag completion:completion];
}
- (void)presentViewController2:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^ __nullable)(void))completion {
if ([viewControllerToPresent isKindOfClass:[CNContactPickerViewController class]]) {
[self setupContactsPickerAppearance];
}
[self presentViewController2:viewControllerToPresent animated:flag completion:completion];
}
- (void)setupDefualtAppearance{
id specialNavBarAppearance = [UINavigationBar appearance];
[specialNavBarAppearance setBarTintColor:nil];
[specialNavBarAppearance setTitleTextAttributes: nil];
[specialNavBarAppearance setTintColor:nil];
}
- (void)setupContactsPickerAppearance{
id specialNavBarAppearance = [UINavigationBar appearance];
[specialNavBarAppearance setBarTintColor:[UIColor colorWithRed:213/255.0f green:38/255.0f blue:46/255.0f alpha:1.0]];
[specialNavBarAppearance setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys:
[UIColor whiteColor], NSForegroundColorAttributeName,nil]];
[specialNavBarAppearance setTintColor:[UIColor whiteColor]];
}
@end
关于ios - 自定义 UINavigationBar 外观以在 CNContactPickerViewController 中显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38291683/
我正在创建一个需要推荐的美食应用程序。我正在添加一项功能,允许我向联系人列表中的 friend 推荐特定食物。但是,在使用 CNContactViewController 时,我没有获得多重选择所需的
比方说,我们有一个简单的应用程序,其中包含一个 View Controller 和单个栏按钮项目,它将打开 CNContactPieckerViewController。因此,我进入选择器 View
我正在使用CNContactPickerViewController允许用户查看他们的联系人列表并选择联系人。但是,虽然我可以向他们显示他们的联系人列表,但无法选择任何联系人。我只想让他们选择一个联系
我正在显示一个CNContactPickerViewController。假设如果我从设置中禁用访问,则它不应该允许打开 Controller ,或者应该弹出窗口说“联系人访问已禁用”。但反过来它又打
委托(delegate)方法实现时: func contactPicker(_ picker: CNContactPickerViewController, didSelect contactProp
我正在使用 CNContactPickerViewController 让用户选择他/她的联系人之一的电子邮件 let contactPicker = CNContactPickerViewContr
我只想获取手机联系人的姓名和邮箱,打印出来。我正在使用以下代码来完成此任务。 import UIKit import ContactsUI class ViewController: UIViewCo
似乎无法创建与 CNContactPickerViewController 一起使用的 UIViewControllerRepresentable。 使用 Xcode 11 beta 4,我使用其他
有没有办法让弹出窗口显示联系人选择器? 我尝试了这个(以及许多其他变体)但没有结果......(这是我的 Controller 中的 IBAction 方法,当点击“sourceView”时应该显示弹
我有一个 ContactPicker,可以控制项目中其他 ViewController 的颜色,但无法控制 ContactsPickers状态栏颜色。 我的目标是让状态栏文本变成白色。 - (IBAc
我使用以下代码在我的应用程序中显示联系人列表: self.contactPicker = [[CNContactPickerViewController alloc] init]; s
我尝试使用一组现有电话号码从地址簿中过滤一些联系人。 CNContactPickerViewController 应该在这些联系人从现有电话号码中找到匹配的电话号码时禁止选择这些联系人。 我需要使用电
我正在尝试使用更现代的 CNContactPickerViewController 来选择联系人。如果联系人有多个地址,我希望用户只能选择其中一个地址。如果专门选择了一个地址,我还想获得 CNCont
我了解到 CNContactPickerViewController 中的搜索栏不允许选择搜索到的联系人。我还查看了有关此问题的其他堆栈溢出问题。这似乎是 iOS 错误。但我想知道,有什么方法可以隐藏
我正在打开一个 CNContactPickerViewController 以在应用程序中使用,但我想改变它的呈现方式以满足我的应用程序需求,最好不要自己动手并重新发明轮子。这就是我使用 Object
我正在使用 iOS 9 和 Swift 2.2 我已经使用 CNContactPickerDelegate 实现了 iOS 内置 CNContactPickerViewController 来获取联系
我使用新的 CNContactPickerViewController 从地址簿中选择联系人并在我的应用程序中使用它们。 当我按下按钮时,我调用此代码: let contactPicker = CNC
如果用户有多个电话号码,SelectionOfProperty 将不起作用。 我正在使用以下代码: let picker = CNContactPickerViewController() picke
我目前可以从联系人应用程序获取联系人,但我面临的问题是,如果联系人有超过 1 部手机,我需要能够选择要导入到我的应用程序的联系人数字,我总是得到第一个数字,这是我正在使用的代码: func conta
我正在编写一个概念聊天应用程序。我现在可以开始新的聊天了。 我想要的是,当用户使用 CNContactPickerViewController 选择一个联系人时,选择器被取消(这是有效的)并且联系人详
我是一名优秀的程序员,十分优秀!