Ios 理解uibutton目标自超视图

Ios 理解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

有人能解释一下这个例子中的uibutton目标功能吗:

我有一个视图控制器。我将带有两个按钮的uiview添加到此viewcontroller。一个按钮封装在init中,另一个按钮由“addSecondButton”方法创建。这两个按钮在作为ViewController的[self superview]目标上具有相同的操作。守则:

ViewController.m

- (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