如何以编程方式将iOS视图连接到处理程序

时间:2014-05-13 20:29:06

标签: ios objective-c swing cocoa-touch

我需要以编程方式将主视图中出现的各种事件委托给由主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

2 个答案:

答案 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事件通常不会被委派,因为它们最终会对视图执行某些操作,而这需要来自管理视图的控制器。虽然对于网络电话,您可能会这样做。如果您的按钮按下影响视图,即更新标签,则您需要返回到视图控制器以实现此目的。所以你必须仔细思考。

但是,根据您的问题,这个答案应该会让您进入下一步。

希望有所帮助, 祝福。