سؤال

هل هذا ممكن لجعل UITOOLBARBUTTON اجتياز كائن هدفه باستخدام بعض الأسلوب الشديد (كما يبدو أنه لا يكون ممكنا باستخدام استخدام الزر العادي)؟

أعني شيئا مثل

UIBarButtonItem *Button = [[UIBarButtonItem alloc] initWithImage:buttonImage
  style:UIBarButtonItemStylePlain target:self action:@selector(doSomething:) **withObject:usingThis**];

وأنا أعلم أنني أستطيع أن أشار إلى طريقة ستطلق الطريقة الكاملة مع الكائن، ولكن من أجل الأناقة كنت أحاول تقليل الكود ... أظن أنه غير ممكن، ولكن كما كنت فكرت هناك بجنون قد تأتي مع إجابة متعجلة ... من يعرف ...

هل كانت مفيدة؟

المحلول

يجب عليك تمديد فئة Uibarbuttonitem.

هنا مثال إنشاء فئة RCBARBUTTONITEM. لقد استخدمت interwithtitle لسهولة، أنا متأكد من أنك تستطيع تغييرها ...

uibarbuttonitem الفئة الفرعية

#import <UIKit/UIKit.h>

@interface RCBarButtonItem : UIBarButtonItem {
    id anObject;
}

@property (nonatomic, retain) id anObject;

- (id)initWithTitle:(NSString *)title style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action withObject:(id)obj;

@end

@implementation RCBarButtonItem

@synthesize anObject;

-(void)dealloc {
    [anObject release];
    [super dealloc];
}

- (id)initWithTitle:(NSString *)title style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action withObject:(id)obj {
    if (self = [super initWithTitle:title style:style target:target action:action]) {
        self.anObject = obj;
    }
    return self;
}

@end

ثم يمكن بعد ذلك تنفيذ ذلك مثل ذلك:

#import "RootViewController.h"
#import "RCBarButtonItem.h"

@implementation RootViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    RCBarButtonItem *button = [[RCBarButtonItem alloc] initWithTitle:@"Hello"
                                                               style:UIBarButtonItemStylePlain 
                                                              target:self
                                                              action:@selector(doSomething:)
                                                          withObject:@"Bye"];
    self.navigationItem.rightBarButtonItem = button;

}

- (void)doSomething:(id)sender {
    NSLog(@"%@", [(RCBarButtonItem *)sender anObject]);
}

نصائح أخرى

ما قمت به في هذا الموقف هو إنشاء خاصية NSDictionary تسمى، buttonArguments:

self. buttonArguments = [[NSDictionary alloc] initWithObjectsAndKeys: usingThis, Button, ... , nil];

ثم في الخاص بك doSomething: الطريقة، ابحث عن الكائن بناء على sender معامل.

انا افضل استخدام الفئات:

uibarbuttonitem + barbuttonitem.h.

@interface UIBarButtonItem (BarButtonItem)
@property (strong, nonatomic) NSDictionary *userInfo;
@end

uibarbuttonitem + barbuttonitem.m.

static void *kUserInfo = &kUserInfo;

@implementation UIBarButtonItem (BarButtonItem)

- (NSDictionary *)userInfo {
    return objc_getAssociatedObject(self, kUserInfo);
}

- (void)setUserInfo:(NSDictionary *)userInfo {
    objc_setAssociatedObject(self, kUserInfo, userInfo, 
        OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

@end
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top