gpt4 book ai didi

ios - 如何以编程方式将 iOS View 连接到处理程序

转载 作者:行者123 更新时间:2023-11-28 22:07:20 25 4
gpt4 key购买 nike

我需要以编程方式将主视图中发生的各种事件委托(delegate)给由主 ViewController 实例化的处理程序。

换句话说,我不想让 ViewController 处理给定 View 的所有事件,而是让单独的实例化对象处理整个 View 的子部分的事件。

描述如何实现此功能的编号项目符号列表或指向编号项目符号列表的链接将非常有帮助。如果您包括一个使用 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

最佳答案

您的选择器签名确实有误,但您还需要先直接或惰性地初始化您的处理程序类。哦,是的,处理程序的属性应该是强的,而不是弱的,因为您需要主类来保留处理程序类。我假设按钮在 Storyboard 或 Xib 文件上。在这种情况下,按钮变弱是有好处的,因为 Storyboard 强烈保留了它。如果您的类(class)也这样做,那将创建一个保留周期。

更正属性:

@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(@"button pressed");在按钮处理程序的按钮操作中,查看是否未调用它。应该的。

现在,通常像按钮按下这样的 UI 事件通常不会被委托(delegate)出去,因为它们最终会对 View 做一些事情,而这需要来自管理 View 的 Controller 。尽管对于网络调用,您可能会这样做。如果您的按钮推送影响了 View ,即更新标签,您需要为此目的返回到 View Controller 。所以你必须考虑清楚。

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

希望对你有帮助,最良好的祝愿。

关于ios - 如何以编程方式将 iOS View 连接到处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23640991/

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