我发布了一个类似的问题,关于使用Python做同样的事情,但我使用objective-c和Cocoa重写了这个小程序,并得到了相同的结果。这是我的另一个堆栈溢出问题:https://stackoverflow.com/questions/8980677/polling-nsfontmanager-sharedfontmanager-in-python再次提交问题的目的是联系Objective-C和Cocoa专家,谁知道呢,也许答案是不同的。这就是问题所在。
我正在尝试写一个小的终端程序,它将获得OS X认为活跃的字体列表,并报告一段时间内活跃的字体数量。例如,当程序运行时,如果我有120个激活的字体,它应该报告120个激活的字体,那么如果我在程序运行时激活另外10个字体,它应该报告130个激活的字体。我遇到的问题是,在我的for循环中,sharedFontManager实例似乎没有更新。下面是我正在使用的代码:
#import <Foundation/Foundation.h>
#import <AppKit/AppKit.h>
int main (int argc, const char * argv[])
{
@autoreleasepool {
for(int y=0; y < 5; y++){
NSArray *sysFonts;
NSFontManager *manager = [NSFontManager sharedFontManager];
sysFonts = [manager availableFonts];
NSLog(@"Number of active fonts: %lu", [sysFonts count]);
sleep(5);
sysFonts = nil;
}
}
return 0;
}因此,如果你想测试它,你将需要几百个字体来激活和停用。从停用字体开始(选择字体,右键单击,选择“禁用字体”)。运行程序。当您看到终端显示"Number of active fonts:“时,弹回Font Book,右键单击所选字体,然后单击"Enable Fonts”(随时将睡眠(5)更改为更长或更短的字体。数字以秒为单位),它将重复循环5次(同样,您也可以更改此数字)。
我最终得到的结果是相同数量的激活字体,但我知道这是不准确的,因为如果你激活了大量字体(大约500个字体),你有足够的时间重新运行程序,并看到数量比你上次运行程序时减少或增加,这取决于你激活或停用大量字体。换句话说,我知道字体激活正在发生,我希望看到字体的数量发生变化。
任何帮助或指导都将不胜感激。
发布于 2012-02-06 02:26:50
您可以运行NSRunLoop并使用NSFontSetChangedNotification机制来更新sharedFontManager实例!
/*
Getting updated availableFonts from NSFontManager while activating fonts in Cocoa
http://stackoverflow.com/questions/8995017/getting-updated-availablefonts-from-nsfontmanager-while-activating-fonts-in-coco
references:
- NSFontAttributeExplorer
https://developer.apple.com/library/mac/#samplecode/NSFontAttributeExplorer/Introduction/Intro.html%23//apple_ref/doc/uid/DTS10003960
https://developer.apple.com/library/mac/samplecode/NSFontAttributeExplorer/NSFontAttributeExplorer.zip
- NSFontManager Class Reference
https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSFontManager_Class/Reference/Reference.html
- http://stackoverflow.com/questions/8336693/on-nsrunloop-clarification-needed
- /System/Library/Frameworks/AppKit.framework/Versions/C/Headers/NSFont.h
compile with:
gcc -Wall -Wextra -x objective-c -framework AppKit -o getfonts getfonts.m
usage:
./getfonts
( ./getfonts > font.log ) &
pid=$!
# kill -HUP $pid
# play around with "Disable selected fonts" & "Enable selected fonts" button
open -a 'Font Book'
*/
#import <AppKit/AppKit.h>
// create a counter to avoid createFontList() being called twice for a single font adding / removing event
// Is there any alternative?
static int counter = 0;
@interface FontLogger : NSObject
{
NSFontManager *mysharedFontManager;
}
- (id)init;
-(void)createFontList;
@end
@implementation FontLogger
- (id)init
{
if ((self = [super init]))
{
mysharedFontManager = [NSFontManager sharedFontManager];
[self createFontList];
}
return self;
}
-(void) setNSFontSetChangedNotification
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(fontSetChanged:) name: NSFontSetChangedNotification object: nil];
}
-(void)createFontList
{
counter = counter + 1;
if (counter == 1)
{
NSString *name = NULL;
NSArray *fontarray = [mysharedFontManager availableFonts];
NSEnumerator *nameEnum = [fontarray objectEnumerator];
int i = 0;
while ( (name = [nameEnum nextObject]) )
{
//NSLog(@"font: %@", name);
printf("%s\n", [name UTF8String]);
i = i + 1;
}
printf("Number of available fonts: %i\n\n", i);
fflush(stdout);
}else {
counter = 0;
}
}
- (void)fontSetChanged:(NSNotification *)notification
{
if ([[notification name] isEqualToString:@"NSFontSetChangedNotification"])
{
[self createFontList];
//NSLog (@"Successfully received notification!");
}
}
@end
int main (void)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
FontLogger *getAvailableFonts = [[[FontLogger alloc] init] autorelease];
[getAvailableFonts setNSFontSetChangedNotification];
BOOL terminated = NO;
while(!terminated && [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);
[pool release];
return 0;
}https://stackoverflow.com/questions/8995017
复制相似问题