是)我有的:

  • 四个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];
    }
    

    最佳答案

    这条线

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

    将目标设置为assisitantButtonPressed:self方法,即ATableViewController。抛出异常是因为ATableViewController没有该方法。正确的方法是在weak中添加ATableViewController属性,以保持对该TabBar的CustomTabBarControlleraddTarget引用,而不是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
    

    尝试避免代码重复是很好的。但是,由于ATableViewControllerBTableViewController,...非常相似(从您的问题及其命名来看),您可能只想使用一个TableViewController,但要使用不同的实际数据。此外,如果assisitantButtonPressed:方法确实属于表视图控制器,并且将其移至navBar只是为了避免代码重复,那么这是非常糟糕的做法。

    关于ios - 关于@selector和MVC,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17257437/

    10-12 14:43