Ios 理解uibutton目标自超视图
有人能解释一下这个例子中的uibutton目标功能吗: 我有一个视图控制器。我将带有两个按钮的uiview添加到此viewcontroller。一个按钮封装在init中,另一个按钮由“addSecondButton”方法创建。这两个按钮在作为ViewController的[self superview]目标上具有相同的操作。守则: ViewController.mIos 理解uibutton目标自超视图,ios,objective-c,uiview,uibutton,Ios,Objective C,Uiview,Uibutton,有人能解释一下这个例子中的uibutton目标功能吗: 我有一个视图控制器。我将带有两个按钮的uiview添加到此viewcontroller。一个按钮封装在init中,另一个按钮由“addSecondButton”方法创建。这两个按钮在作为ViewController的[self superview]目标上具有相同的操作。守则: ViewController.m - (void)viewDidLoad { [super viewDidLoad]; MySpecialView
- (void)viewDidLoad {
[super viewDidLoad];
MySpecialView *myspecialview = [[MySpecialView alloc] initWithFrame:self.view.frame];
[self.view addSubview:myspecialview];
[myspecialview addSecondButton];
}
- (void)specialMethod { NSLog(@"right here!"); }
MySpecialView.m
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 30, frame.size.width, 50)];
[button addTarget:[self superview] action:@selector(specialMethod) forControlEvents:UIControlEventTouchUpInside];
button.backgroundColor = [UIColor blueColor];
[self addSubview:button];
}
return self;
}
- (void)addSecondButton {
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 90, self.frame.size.width, 50)];
[button addTarget:[self superview] action:@selector(specialMethod) forControlEvents:UIControlEventTouchUpInside];
button.backgroundColor = [UIColor redColor];
[self addSubview:button];
}
因此,当点击在init中创建的蓝色按钮时,specialMethod会执行。当按下初始化后添加的红色选项时,应用程序会崩溃,uiview的警告-未知选择器
我真正不明白的是,当我在init中记录[self superview]时,它是空的,因为该对象尚未创建并返回到superview,但该操作确实由于某种原因而被执行
谢谢你的帮助
[self superview]
是指向ViewController视图的指针,而不是ViewController本身。您定义为按钮操作的选择器应以ViewController实例为目标,而不是ViewController的视图,因为您在ViewController中定义了方法specialMethod
。如果您确实想使用[self superview]
作为操作的目标,那么您需要将UIView子类化,实现特殊方法
,并将新的UIView子类设置为视图控制器的视图(而不是子视图)。这样,[self superview]
将引用在目标上实际指定了选择器的类
我实际上没有尝试您的代码示例,但它显然是错误的,如果它确实有效,那就是巧合,不应该依赖它。
[self superview]
是指向ViewController视图的指针,而不是ViewController本身。您定义为按钮操作的选择器应以ViewController实例为目标,而不是ViewController的视图,因为您在ViewController中定义了方法specialMethod
。如果您确实想使用[self superview]
作为操作的目标,那么您需要将UIView子类化,实现特殊方法
,并将新的UIView子类设置为视图控制器的视图(而不是子视图)。这样,[self superview]
将引用在目标上实际指定了选择器的类
我实际上没有尝试您的代码示例,但它显然是错误的,如果它确实有效,那就是巧合,不应该依赖它。您确实为
initWithFrameMethod
中的蓝色按钮添加了nil
目标。根据苹果的说法,当你添加一个nil
目标时,消息(specialMethod
在你的情况下)将通过响应链传递:
When the user manipulates a control, such as a button or switch, and the target for the action method is nil, the message is sent through a chain of responders starting with the control view.
由于您的
ViewController
是响应程序链的一部分,它将接收此消息并调用其特殊方法
您确实为initWithFrameMethod
中的蓝色按钮添加了一个nil
目标。根据苹果的说法,当你添加一个nil
目标时,消息(specialMethod
在你的情况下)将通过响应链传递:
When the user manipulates a control, such as a button or switch, and the target for the action method is nil, the message is sent through a chain of responders starting with the control view.
由于您的
ViewController
是响应程序链的一部分,它将接收此消息并调用其特殊方法
您确定蓝色按钮的操作已执行吗?它不应该作为您添加的目标是nil
。100%确定。创建一个项目,粘贴代码,然后自己尝试。奇怪的东西,他…你确定蓝色按钮的动作被执行了吗?它不应该作为您添加的目标是nil
。100%确定。创建一个项目,粘贴代码,然后自己尝试。奇怪的事情他…解释得很好!您需要确保您的目标不是视图控制器的视图,而是视图控制器本身!不过,听起来对于您的情况,委托
模式更合适。是的,谢谢您的留言。我知道如果我添加一个像mainview这样的东西,然后在上面添加一个视图,[自我超级视图]就会工作。当我下载了一个其他项目的示例项目时,我遇到了这个问题,并对它的工作感到惊讶。因此,我的目标不是帮助我进行UIView之间的通信,我知道这是如何工作的,但我想了解该操作是如何到达ViewController并执行该方法的。解释得很好!您需要确保您的目标不是视图控制器的视图,而是视图控制器本身!不过,听起来对于您的情况,委托
模式更合适。是的,谢谢您的留言。我知道如果我添加一个像mainview这样的东西,然后在上面添加一个视图,[自我超级视图]就会工作。当我下载了一个其他项目的示例项目时,我遇到了这个问题,并对它的工作感到惊讶。因此,我的目标不是帮助我进行UIView之间的通信,我知道这是如何工作的,但我想了解该操作是如何到达ViewController并执行该方法的。我认为这是一个有趣的案例。。。有人能告诉我为什么[self superview]
在initWithFrame:
中用作目标时是nil
?视图控制器的视图应该在该时间点被实例化,因为MySpecialView
是在视图控制器的viewdiload
initWithFrame
被调用之前,MySpecialView被添加为控制器视图的子视图。啊,对不起,当然是零,因为视图尚未添加到视图控制器的视图中@nburk,因为您首先创建了要添加的对象(在本例中为uiview),并且只有在返回self时,才会将其添加到superview。我认为这是一个有趣的案例。。。有人能告诉我为什么[self superview]
在中用作目标时是nil