1

我有的:

  • 四个 TableViewController(A, B, C, D) - 这将显示四个类别的内容。
  • 基于 UITabBarController 的假 TabBarController,它工作正常。

我想做的事:

在 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];
}
4

1 回答 1

2

这条线

[AAButton addTarget:self action:@selector(assisitantButtonPressed:) forControlEvents:UIControlEventTouchUpInside];

将目标设置为 的方法assisitantButtonPressed:selfATableViewController。它抛出异常,因为ATableViewController没有那个方法。正确的方法是添加一个weak属性来ATableViewController保持对该 TabBar 的引用,而不是CustomTabBarControllerselfaddTarget

@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:确实属于表格视图控制器并且您将其移动到导航栏只是为了避免代码重复,这一个非常糟糕的做法。

于 2013-06-23T04:00:12.787 回答