[Adium-devl] Plugin: Unable to add method to AIPreferenceController using category
Henrik Nyh
henrik at nyh.se
Thu May 24 12:25:48 UTC 2007
I'm rather new at Cocoa/Objective-C, so please bear with me.
I would like to write an Adium plugin that sticks incoming files in
per-sender subdirectories of the download folder. So I might get
"~/Incoming/IM/John Doe (ICQ)/pic.jpg" and so on.
Having poked through the Adium source, I figured a good way to achieve
this might involve overriding AIPreferenceController's
-userPreferredDownloadFolder method. (If you have a better idea,
please let me know.)
However, I'm unable to override that method (using a
category/swizzling). In fact, I'm unable to add any methods to the
AIPreferenceController class.
Any idea what I'm doing wrong?
In the following test case, I can add and call methods on NSObject
fine using categories, but when I call the method that I (thought I)
added to AIPreferenceController, I get "selector not recognized".
//// FileTransferFoldersPerSenderPlugin.h
#import <Cocoa/Cocoa.h>
#import <Adium/AIPlugin.h>
#import <Adium/AIAdiumProtocol.h>
#import <Adium/AIPreferenceControllerProtocol.h>
#import "/Users/henrik/Documents/Code/Cocoa/adium-1.0.2/Source/AIPreferenceController.h"
// Add "foobar" to AIPreferenceController
@interface AIPreferenceController (MyCat)
- (void)foobar;
@end
@implementation AIPreferenceController (MyCat)
- (void)foobar {
NSLog(@"FOOBAR!");
}
@end
// Add "barbaz" to NSObject
@interface NSObject (MyCat)
- (void)barbaz;
@end
@implementation NSObject (MyCat)
- (void)barbaz {
NSLog(@"BARBAZ!");
}
@end
// Plugin proper
@interface FileTransferFoldersPerSenderPlugin : AIPlugin {
}
@end
//// FileTransferFoldersPerSenderPlugin.m
#import "FileTransferFoldersPerSenderPlugin.h"
@implementation FileTransferFoldersPerSenderPlugin
- (void)installPlugin {
NSLog(@"FileTransferFoldersPerSenderPlugin loaded!");
// This works:
[[adium preferenceController] barbaz];
// This doesn't:
[(AIPreferenceController *)[adium preferenceController] foobar];
// *** -[AIPreferenceController foobar]: selector not recognized
[self = 0x5a6f00]
}
- (void)uninstallPlugin {
NSLog(@"FileTransferFoldersPerSenderPlugin unloaded!");
}
@end
Grateful for any help,
Henrik N
More information about the devel
mailing list