动态添加UIBarButtonItem的奇怪行为

时间:2012-11-29 17:32:30

标签: ios selector uibarbuttonitem uitoolbar

我正在开发一个应用程序,我正在动态地将UIBarButtonItem添加到UIToolbar。当用户点击栏按钮时。我将它的色调改为红色。 但对于某些条形按钮,它不起作用,应用程序崩溃。

这是我的代码:

@interface myClass : UIViewController

@property (nonatomic, retain) NSMutableArray *barButtonItems;
@property (nonatomic, retain) IBOutlet UIToolbar *toolBar;

@end


@implementation myClass 

@sythesize barButtonItems, toolBar;

- (void)viewDidLoad
{
  [super viewDidLoad];
  barButtonItems = [[NSMutableArray alloc] init];
  [self initToolBar];
}

//To set the tool bar 
- (void)initToolBar
{
   [self addBarItem:@"PlantDetails" actionName:@"createPlantDetails:"];
   [self addBarItem:@"ElectricalEquipmentInventory" actionName:@"createInventory:button:"];
   toolBar.items = barButtonItems;
}

//Create bar button item
- (void)addBarItem:(NSString*)barButtonName actionName:(NSString*)methodName
{
   UIBarButtonItem *plantDetails = [[UIBarButtonItem alloc] initWithTitle:barButtonName style:UIBarButtonItemStyleDone target:self action:NSSelectorFromString(methodName)];
   [barButtonItems addObject:plantDetails];
   [plantDetails release];
   plantDetails = nil; 
}


//Changes the barbutton tintcolor when user selected
-(void)changeSelection:(UIBarButtonItem *)button
{
   NSArray *tempArray = toolBar.items;
   for(int loop = 0; loop<[tempArray count]; loop++)
       [[tempArray objectAtIndex:loop] setTintColor:[UIColor blackColor]];
   [button setTintColor:[UIColor redColor]];
}


//First bar button method
- (void)createPlantDetails:(UIBarButtonItem *)button
{
   [self changeSelection:button];
   NSLog(@"createPlantDetails");
}

//second bar button method
- (void)createInventory:(int)selectedIndex button:(UIBarButtonItem *)button
{
   [self changeSelection:button];
   NSLog(@"createInventory");
}

@end

这里我的问题是只有一个参数的条形按钮,它的选择器工作正常(createPlantDetails)但是当我点击它的选择器(createInventory)中有两个参数的条形按钮时应用程序正在[button setTintColor:[UIColor redColor]]; changeSelection方法崩溃。

崩溃日志类似于:touches event have no method like setTintColor .

我搜索了很多但找不到解决方案。请帮帮我。

提前致谢

1 个答案:

答案 0 :(得分:2)

action属性的方法必须具有以下三种形式之一:

- (void)methodName;
- (void)methodName:(id)sender;
- (void)methodName:(id)sender withEvent:(UIEvent *)event;

您不能使用任何格式或自定义参数(按钮不知道要传递给他们的内容)。


createPlantDetails:方法有效,因为它与第二种形式匹配。


createInventory:button:方法失败,因为它与任何预期的签名都不匹配 由于您的方法有两个参数,当按钮调用方法时,该按钮会传递第二个参数中的UIEvent对象,该方法的名为 button

changeSelection:中,它在尝试呼叫setTintColor:时崩溃,因为button实际上是UIEvent而不是UIBarButtonItem(即发件人)