gpt4 book ai didi

ios - 关于@selector 和 MVC

转载 作者:行者123 更新时间:2023-11-29 10:58:15 24 4
gpt4 key购买 nike

我有什么:

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

将目标设置为 self 的方法 assisitantButtonPressed:,即 ATableViewController。它抛出异常,因为 ATableViewController 没有那个方法。正确的方法是将 weak 属性添加到 ATableViewController 以保留对 CustomTabBarControlleraddTarget 到该 TabBar 的引用, 而不是自己

@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: 方法确实属于 table view controller 而你将它移动到 navBar 只是为了避免代码重复,它< em>是一种非常糟糕的做法。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com