是)我有的:
内容。
工作良好。
我想做的事:
在ATableView上添加一个按钮,它将在我的FakeTabBarController上使用一个方法(因为我想共享该方法,所以我可以在BTableViewController,CTableViewController上使用它,而不必重复两次或三遍)
因此,我只是将方法公开(在.h文件上),并将.h文件包含在我的ATableViewController中。然后,
addTarget:action:forControlEvents:和往常一样,但是..它不起作用,请帮忙!
错误:
[ATableViewController assisitantButtonPressed:]: unrecognized selector sent to instance 0x715a8d0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[ATableViewController assisitantButtonPressed:]: unrecognized selector sent to instance 0x715a8d0'
*** First throw call stack:
(0x1ca1012 0x10dee7e 0x1d2c4bd 0x1c90bbc 0x1c9094e 0x10f2705 0x262c0 0x26258 0xe7021 0xe757f 0xe66e8 0x2ea1d3 0x1c69afe 0x1c69a3d 0x1c477c2 0x1c46f44 0x1c46e1b 0x1bfb7e3 0x1bfb668 0x22ffc 0x1c8d 0x1bb5)
libc++abi.dylib: terminate called throwing an exception
FakeTabBarController.h:
#import <UIKit/UIKit.h>
@interface CustomTabBarController : UITabBarController
- (IBAction)assisitantButtonPressed:(UIButton *)sender;
@end
FakeTabBarController.m:
...
- (IBAction)assisitantButtonPressed:(UIButton *)sender
{
switch ([sender tag]) {
case 0: // AA
NSLog(@"AA");
break;
case 1: // BB
NSLog(@"BB");
break;
default:
break;
}
}
...
ATableViewController.m:
#import "ATableViewController.h"
#import "ATableCell.h"
#import "FakeTabBarController.h"
...
- (void)viewDidLoad
{
[super viewDidLoad];
UIImage *AAImage = [UIImage imageNamed:@"search.png"];
UIButton *AAButton = [[UIButton alloc] initWithFrame:CGRectMake(self.view.frame.size.width * 0.73, 0, AAImage.size.width, AAImage.size.height)];
[AAButton setTag:0];
[AAButton setImage:searchImage forState:UIControlStateNormal];
[AAButton addTarget:self action:@selector(assisitantButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:AAButton];
}
最佳答案
这条线
[AAButton addTarget:self action:@selector(assisitantButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
将目标设置为
assisitantButtonPressed:
的self
方法,即ATableViewController
。抛出异常是因为ATableViewController
没有该方法。正确的方法是在weak
中添加ATableViewController
属性,以保持对该TabBar的CustomTabBarController
和addTarget
引用,而不是self@interface ATableViewController
@property (weak, nonatomic) CustomTabBarController* tabBar;
...
@end
@implementation ATableViewController
-(void)viewDidLoad {
[super viewDidLoad];
self.tabBar = <you must somehow obtain the tab bar reference, either here or in init>
...
[AAButton addTarget:self.tabBar action:@selector(assisitantButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
...
}
@end
尝试避免代码重复是很好的。但是,由于
ATableViewController
,BTableViewController
,...非常相似(从您的问题及其命名来看),您可能只想使用一个TableViewController
,但要使用不同的实际数据。此外,如果assisitantButtonPressed:
方法确实属于表视图控制器,并且将其移至navBar只是为了避免代码重复,那么这是非常糟糕的做法。关于ios - 关于@selector和MVC,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17257437/