Ios UIButton目标为UIViewController而非自定义UIView

Ios UIButton目标为UIViewController而非自定义UIView,ios,objective-c,uiview,uiviewcontroller,Ios,Objective C,Uiview,Uiviewcontroller,我有一个UIViewController,它创建了一个自定义子视图。子视图是一个UIView对象,它已经被子类化了好几次 在子视图类中,我创建了一个自定义init方法: -(id)init { self = [super init]; if (self) { // Init code [self spm_correctGuessViewCustomInit]; } return self; } 在这里面我创建了一个按钮和一个标签。

我有一个
UIViewController
,它创建了一个自定义子视图。子视图是一个
UIView
对象,它已经被子类化了好几次

在子视图类中,我创建了一个自定义init方法:

-(id)init {
    self = [super init];
    if (self) {
        // Init code
        [self spm_correctGuessViewCustomInit];
    }
    return self;
}
在这里面我创建了一个按钮和一个标签。这个问题与按钮及其目标操作直接相关

我想要的是
UIViewController
具有按钮操作,而不是子类
UIView
(它实际创建并保持按钮)

我传入self.superview的目标,它似乎工作正常,并且运行了正确的方法。但是,在子类“Undeclared selector”correctGuessContinueButtonPressed“中显示了一条警告


那么,我是否正确地实施了这种方法?如果需要更多信息,请告诉我。

您的视图。superview方法不会将您带到视图控制器,而是带到视图

您可以导入实现类的头来修复警告,但我认为您的设计应该改进。视图应该独立工作,不依赖于它们的超级视图,甚至更糟糕的是,不依赖于视图和控制器的整个体系结构

我会在用户按下按钮时调用的行中传递一个委托,或者在按钮启动时调用的视图上设置一些块


避免通过多个抽象层进行通信。

一种解决方案是更新自定义视图的
init
方法,使其采用
target
action
参数(非常类似于按钮的
addTarget:
方法)。然后,您可以通过
addTarget:
调用将这些值传递给按钮

- (instancetype)initWithTarget:(id)target action:(SEL)action {
    // your normal init code here
    // use target and action to setup your button
}

参考先前的类似问题:

  • 我必须在自定义
    UIView
    子类中向方法所在的视图控制器添加一个导入

  • 设置控制器属性后,我可以将按钮目标设置为控制器

  • 确保从按钮调用的方法位于控制器头文件中,以便子视图实现文件可以看到。在此之前,子视图并不知道它的存在


  • 对,您是正确的superview实际上会链接到controllers视图,但是仍然会调用正确的方法。我认为对于一个简单的任务来说,这似乎需要做很多工作,在本例中使用委托。我只有一个UIViewController和一个UIView。让我们现在就这么简单吧。我希望将自定义uiview添加到视图控制器视图中,使其具有一个按钮。子类uiview中的按钮应调用uiviewcontroller上的选择器(方法)。这是一项简单的任务吗?如果你必须考虑它的实现,这不是一项简单的任务。:)我真的会将按钮的目标/操作连接到它的直接容器,视图或控制器——启动它的那个人。你甚至可以把肮脏的“爬升层次”——代码放在那里。尝试设置一些“超级视图”或直接包含视图控制器作为目标并不容易-它要求在完成实例化之前,视图已经作为子视图添加。。。“解耦通信”的另一种方法:NSNotificationCenter。不过,不要滥用它。谢谢,我做了另一次搜索并找到了它——这似乎就是我要找的,只需创建一个对控制器的引用,并确保该方法位于控制器头文件中,以供编译器查看,这似乎就是我要做的。这和它将要得到的一样简单:)看起来很奇怪,我必须将这些信息传递给init方法。如果我将其简化一些,比如说我有一个带有标准视图的UIViewController。然后我将UIView子类化,并将其添加到视图控制器视图中。在创建UIView子类的过程中,我还向这个子类视图添加了一个按钮。我希望按钮调用视图控制器上的选择器(方法),而不是它本身。这简单/可能吗?这就是我要说的。视图控制器调用这个新的
    initWithTarget:action:
    方法pass
    self
    作为操作的目标和一些选择器。通过这种方式,自定义视图对视图控制器没有直接的了解。因此,self将是请求创建视图控制器的视图控制器,该视图控制器将成为目标,对吗?对,我知道我将接受您的答案作为答案,并添加我自己的答案以供参考。我还可以在这里找到一个类似的问题--我需要添加一个对控制器的引用作为属性,并确保按钮调用的方法在控制器头文件中,因为以前它只在imp文件中,这可能会导致该问题--如果在控制器上有多个具有不同目标操作的按钮,该怎么办自定义uiview并希望具有该自定义uiview对象的viewcontroller处理这些多个目标操作,而不是自定义uiview?
    - (instancetype)initWithTarget:(id)target action:(SEL)action {
        // your normal init code here
        // use target and action to setup your button
    }