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 获取文本和阴影属性的主要内容,如果未能解决你的问题,请参考以下文章

SIGABRT - 针对解析推送通知

Xcode:“线程 1:信号 SIGABRT”

如何在多线程环境中捕获 SIGABRT?

从未来检索价值时的 SIGABRT

线程1:信号SIGABRT不断弹出

终止于 SIGABRT