我需要以编程方式将主视图中出现的各种事件委托给由主ViewController实例化的处理程序。
换句话说,我不希望ViewController处理给定视图的所有事件,而是希望单独的实例化对象处理整个视图的子部分的事件。
一个编号的项目符号列表描述了如何实现这一点,或者指向编号的项目符号列表的链接将非常有用。如果你包含一个解释,它使用Java的Swing API中的示例作为类似的操作,你会在我心中获得一个特殊的位置。
这是我目前的半生不熟的代码。我包含它,所以你知道我已经尝试解决这个问题,然后再使用Stack Overflow。
TCH_MainViewController.m
#import "TCH_MainViewController.h"
#import "TCH_MainViewButtonHandler.h"
@interface TCH_MainViewController ()
@property (nonatomic, weak) IBOutlet UILabel *titleLabel;
@property (nonatomic, weak) TCH_MainViewButtonHandler *buttonHandler;
@property (nonatomic, weak) UIButton *changeColorButton;
@end
@implementation TCH_MainViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
[_changeColorButton addTarget:_buttonHandler action:@selector(changeColorButton) forControlEvents:UIControlEventTouchUpInside];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
TCH_MainViewButtonHandler.m
#import "TCH_MainViewButtonHandler.h"
@implementation TCH_MainViewButtonHandler
- (IBAction)changeLabelColor:(id)sender{
}
-(void)awakeFromNib{
}
@end
答案 0 :(得分:1)
当我认为它应该是@selector(changeColorButton)
时,您的选择器为@selector(changeLabelColor:)
。
答案 1 :(得分:1)
你的选择器签名错误,但你还需要先直接或懒惰地初始化你的处理程序类。哦,是的,并且处理程序的属性应该是强大的,而不是弱的,因为您需要主类来保留处理程序类。我假设按钮位于Storyboard或Xib文件上。在这种情况下,由于故事板强烈地保留按钮,因此按钮变弱是有好处的。如果你的课也这样做了,那就会产生一个保留周期。
纠正财产:
@property (nonatomic, strong) TCH_MainViewButtonHandler *buttonHandler;
在按钮上设置选择器之前初始化类。
self.buttonHandler = [TCH_MainViewButtonHandler alloc]init];
注意:通过self访问属性可能是一种更好的做法,而不是它的实例_button ..
然后在按钮上设置目标:
[self.changeColorButton addTarget:self.buttonHandler action:@selector(changeColorButton:) forControlEvents:UIControlEventTouchUpInside];
注意:如果让Xcode自动完成,通常会添加选择器末尾的冒号。它引用参数" sender"在这种情况下。
添加一点NSLog(@"按下按钮");在按钮处理程序的按钮操作中,看看是否没有调用。它应该。
现在,正常情况下,按钮推送等UI事件通常不会被委派,因为它们最终会对视图执行某些操作,而这需要来自管理视图的控制器。虽然对于网络电话,您可能会这样做。如果您的按钮按下影响视图,即更新标签,则您需要返回到视图控制器以实现此目的。所以你必须仔细思考。
但是,根据您的问题,这个答案应该会让您进入下一步。
希望有所帮助, 祝福。