objc/runtime.h で定義されている、objc_getAssociatedObject メソッドと objc_setAssociatedObject を使う。
#import <UIKit/UIKit.h> @interface UIViewController (SideMenu) @property (nonatomic, readonly) UIBarButtonItem *menuButtonItem; @end
#import "UIViewController+SideMenu.h" #import <objc/runtime.h> #import <FontAwesomeKit/FontAwesomeKit.h> @implementation UIViewController (SideMenu) - (UIBarButtonItem *)menuButtonItem { id item = objc_getAssociatedObject(self, _cmd); if (item == nil) { FAKFontAwesome *icon = [FAKFontAwesome barsIconWithSize:20]; UIImage *image = [icon imageWithSize:CGSizeMake(20, 20)]; UIBarButtonItem *btn = [[UIBarButtonItem alloc] initWithImage:image style:UIBarButtonItemStylePlain target:self action:@selector(openSideMenu)]; objc_setAssociatedObject(self, _cmd, btn, OBJC_ASSOCIATION_RETAIN_NONATOMIC); item = btn; } return (UIBarButtonItem*)item; } - (void)openSideMenu { // TODO: サイドメニューを表示 } @end