SIGABRT 使用 NSDictionary 获取文本和阴影属性
Posted
技术标签:
【中文标题】SIGABRT 使用 NSDictionary 获取文本和阴影属性【英文标题】:SIGABRT using NSDictionary for text and shadow attributes 【发布时间】:2018-03-19 11:00:07 【问题描述】:我正在尝试在 Objective C 中构建一个简单的应用程序,利用我的AppDelegate
模块中的属性字典来自定义我的故事布局的各种导航项的外观。
代码构建良好,没有错误,但是当它部署到我的测试设备上时,我得到了一个 SIGABRT。
我正在使用最新版本的 Xcode(9.2);情节提要全部设置为“Builds for ios 8.2 and later”;部署目标设置为 8.1。
我在代码中使用 UITextAttributeTextShadowColor, nil
没有问题,但自 iOS 7.0 以来已弃用,因此我将其更新为 NSShadowAttributeName, nil
,但现在无法使用。
我做错了什么?
具体的 SIGABRT 错误为:Terminating app due to uncaught 异常'NSInvalidArgumentException',原因:'-[UIDeviceRGBColor shadowColor]: 无法识别的选择器发送到实例 0x1d447cf00'。
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
NSDictionary *attribs = [NSDictionary dictionaryWithObjectsAndKeys:
[UIColor colorWithRed:170.0/255.0 green:21.0/255.0 blue:29.0/255.0 alpha:1.0],
NSForegroundColorAttributeName,
[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.0],
NSShadowAttributeName, nil];
[[UINavigationBar appearance] setTitleTextAttributes: attribs];
[[UIBarButtonItem appearance] setTitleTextAttributes: attribs forState:UIControlStateNormal];
return YES;
【问题讨论】:
Larme 和 CodeChanger 都帮助我取得了成功。我的问题更为根本。在为 NS 交换 UI 时,语法会发生变化,因此键和参数是相反的,我一定是代码盲,所以我看不到哪个参数正在使用哪个键!我在代码中缺少正确的语法来配对适当的 NSShadow 参数。 【参考方案1】:您需要像这样更新代码:
NSShadow *shadow = [[NSShadow alloc] init];
shadow.shadowColor = [UIColor blackColor];
shadow.shadowOffset = CGSizeMake(1, 0);
NSDictionary * attribs = @NSForegroundColorAttributeName: [UIColor whiteColor],
NSShadowAttributeName: shadow,
NSFontAttributeName: [UIFont titleBolder];
[[UINavigationBar appearance] setTitleTextAttributes: attribs];
这将解决您的崩溃问题。
【讨论】:
【参考方案2】:文档:NSShadowAttributeName
:
该属性的值是一个
NSShadow
对象。默认值 该属性的值为 nil。
显然这不是你所做的。你给了一个UIColor
对象。
这正是错误的意思:
由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'-[UIDeviceRGBColor shadowColor]: 无法识别的选择器发送到实例 0x1d447cf00'
它的意思是:我试图在 UIDeviceRGBColor
(肯定是 UIColor
的集群)对象上调用方法 shadowColor
。但是由于它不知道那个方法(~选择器,对于你的关卡来说就是这样),我就崩溃了。
很明显,这就是你可能产生怀疑的地方。 shadowColor
这是NSShadow
对象上的可用方法。也许我做错了什么。阅读文档你就会知道是这样的。
因此,将一个NSShadow
对象而不是UIColor
对象作为对应的值。
【讨论】:
以上是关于SIGABRT 使用 NSDictionary 获取文本和阴影属性的主要内容,如果未能解决你的问题,请参考以下文章