将NSString转换为字符串

4
NSDate *now = [NSDate date];                                 
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];                    
[formatter setDateFormat:@"yyyy"];                     

NSString *stringFromDate = [formatter stringFromDate:now]; 
CGContextShowTextAtPoint(context, 50, 50, stringFromDate, 5);

我无法得到确切的日期?同时编译时也收到警告
警告:传递参数 4 的 'CGContextShowTextAtPoint' 来自不兼容的指针类型

2个回答

2
该函数的原型是:
void CGContextShowTextAtPoint (
   CGContextRef c,
   CGFloat x,
   CGFloat y,
   const char *string,
   size_t length
);

但是在第四个参数中,您传递的是 *NSString **(而不是函数原型所需的 *const char **)。

您可以使用 NSString 的 cStringUsingEncoding 方法将 NSString 转换为 C 字符串,例如:

CGContextShowTextAtPoint(context, 50, 50, [stringFromDate cStringUsingEncoding:NSASCIIStringEncoding]);

在这种情况下,由于日期格式为yyyy,所以可以使用[someString cStringUsingEncoding:NSASCIIStringEncoding],但一般情况下,您不应该在没有测试NULL返回值的情况下使用它。例如,如果将日期格式设置为长日期格式,并且在法国语言环境中运行iPhone并且月份为8月(或法语中的août),则会传递空指针作为第四个参数。最好的情况是不显示任何文本,最坏的情况是seg fault。 - JeremyP
使用 UTF8String 的好理由。 :) - Shaggy Frog
好点子,但似乎使用[NSString drawAtPoint:withFont:]更好一些。参考链接:https://dev59.com/n0jSa4cB1Zd3GeqPIMRs 和 http://stackoverflow.com/questions/2087418/iphone-unicode-text-with-coregraphics - diciu

1

stringFromDate的值是什么?你期望得到什么?

编译时也会收到警告 警告:从不兼容的指针类型传递参数4的'CGContextShowTextAtPoint'

如果你查看CGContextShowTextAtPoint的文档,你会发现第四个参数需要是char*,而不是NSString*。

你有:

GContextShowTextAtPoint(context, 50, 50, stringFromDate, 5);

您想要:

GContextShowTextAtPoint(context, 50, 50, [stringFromDate UTF8String], 5);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接