[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