【问题标题】:Reference to UIButton inside a view在视图中引用 UIButton
【发布时间】:2023-03-09 16:14:02
【问题描述】:

我从 nib 文件中加载了 UIView。我写了一些方法,我可以连接到笔尖的First Responder。它们工作正常。

现在我必须引用嵌入在加载视图中的UIButton。但由于它不是视图控制器/只是一个UIView(我猜?),File's Owner 不会在.h 文件中检测到我的IBOutlet UIButton * button

那么这里发生了什么?谢谢!

【问题讨论】:

  • 那么,将xib 中的按钮连接到File Owner 不起作用?
  • 你在身份检查器中设置了 UIView 的自定义类名吗?
  • 如果你的 uiview 上有一些控件,为什么不使用 uiviewcontroller 并使用它的视图呢?以你的方式,我认为你违背了 MVC 模式。如果我错了,请有人纠正我,我不太确定。

标签: iphone ios xcode view controller


【解决方案1】:

有几种方法可以做到这一点.. 其中之一是..

在界面生成器中设置按钮标签属性,然后在代码中,循环遍历所有子视图以查找带有您设置的标签的视图

..没有测试这个,但应该是这样的

for (UIView *subView in [view subviews]) {
    if (subView.tag == <YOUR TAG HERE>) {
        UIButton *button = (UIButton *)subView;
    }
}

..我会将它包装在一个名为 getSubviewWithTag 的函数中,以便您可以在其他地方重用它

【讨论】:

  • 你真的不需要这样做。使用 Interface Builder 的 outlets 机制,这就是它们的用途。
  • ...如果你真的要做这样的事情,那么你可以通过标签从你的视图中获取一个子视图,使用'- (UIView *)viewWithTag:(NSInteger)tag ' ...
  • 有时我不知道我为什么要打扰,如果你不听正确的做事方式。这真的不是正确的答案或如何正确地做到这一点。这里建议了各种其他正确答案,甚至是图表!!!
【解决方案2】:

当您在 Interface Builder 中拖动连接时,您不必总是连接到 Files Owner。从您的 UIButton 中拖动,然后拖放到包含它的 UIView 上。如果它在您的自定义 UIView 类上有一个 IBOutlet UIButton 属性 - 它会连接起来。

【讨论】:

    【解决方案3】:

    以下是如何完成的示例:

    右击xib中的UIButton,点击引用点并将其拖动到File's Owner。一旦您释放点击,就会弹出一个弹出窗口,其中包含您可以连接元素的所有 IBOutlets。

    编辑- 如果它没有变成蓝色,那么您还没有为您的File's Owner 设置自定义类!你可以这样做如下。单击File's Owner,然后单击第三个选项卡。将其设置为您的自定义视图控制器。

    【讨论】:

    • 是的,我知道。但是File's Ower 不会变成蓝色。
    • 是的,我的班级是 UIView,而不是 UIViewController,如果我在我的 nib 文件中添加一个“UIViewController”,应用程序就会崩溃,并显示 smt。关于无法分配两个单例类(我的 VC 是单例类)。也许我的代码有错误,但是在哪里...?
    • 或者有没有像[tableView refresh ...]这样的重绘屏幕的命令?这只是因为我为视图设置了动画并且有两个按钮保持在那里(非活动状态),尽管嵌入按钮的 UIView 被解除了。
    • 如果是UIView,则需要以编程方式添加目标。另外,为什么你需要让你的UIViewController 成为单身人士?单例用于数据,而不是视图和控制器!
    • 那么不要让你的UIViewController 成为一个单例,你应该为你的AVAudioPlayer 这样做......我认为这将与 MVC 模式更加同步。脱离 MVC 并没有错!它只是为了模块化和让其他开发人员能够快速理解代码而推荐的!
    【解决方案4】:

    在该特定视图中分配和子视图您的按钮很容易。 然后在该“视图”的 .m 类中定义动态操作,这可能对您有用。

    [btn addTarget:self action:@selector(action:) forControlEvents:UIControlEventTouchUpInside];
    

    【讨论】:

    • 是的,我知道这种可能性。但由于我希望为我的客户提供所见即所得的选项,所以这不是最好的选择。
    猜你喜欢
    • 2016-01-07
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多