使用自定义 UIButton 以编程方式调用 ViewController PopOver

Posted

技术标签:

【中文标题】使用自定义 UIButton 以编程方式调用 ViewController PopOver【英文标题】:Programmatically call a ViewController PopOver with custom UIButton 【发布时间】:2013-02-24 19:57:32 【问题描述】:

我在我的实现文件的viewDidLoad 部分中定义了自定义UIButton 的宽度、高度和位置。如果我要将这个按钮拖放到 IB 中,我可以 ctrl 并将其拖到另一个 View Controller 并选择 PopOver

除非有办法将IBOutlet 附加到我不知道的这个自定义UIButton,因为我的自定义按钮没有显示在Interface Builder 中,我该如何调用PopOver在我的实现文件中单击我的自定义UIButton 的操作中的UIViewController

这就是我定义自定义按钮的方式:

self.hard1 = [UIButton buttonWithType:UIButtonTypeCustom];
[self.hard1 setFrame:CGRectMake(884, 524, 105, 60)]; // set the x,y,width and height
UIImage *buttonImage = [UIImage imageNamed:@"green.jpg"];
self.hard1.layer.cornerRadius = 10;
self.hard1.clipsToBounds = YES;
[self.hard1 addTarget: self
          action: @selector(buttonTapped:)
forControlEvents: UIControlEventTouchUpInside];
[self.hard1 setImage:buttonImage forState:UIControlStateNormal];
[self.view addSubview:self.hard1];

【问题讨论】:

你问的是故事板转场吗? 是的,我可以在我的代码中使用它们吗? 我已经编辑了我的答案以显示如何以编程方式调用 segue,但我真的不明白你的按钮有什么如此自定义。为什么不能直接使用IB呢? 因为我在某种条件下改变了它的颜色,所以很遗憾我不得不编码它。非常感谢您的帮助,您能澄清一下我将 segue 拖到什么位置吗? 将 segue 拖到您想要的视图作为弹出框。就像你从按钮做的一样,只有没有按钮,所以你必须从 ViewController 做。 【参考方案1】:

类似这样的:

- (IBAction) buttonTapped:(id) sender

    [self performSegueWithIdentifier:@"mySegue" sender:self];

其中mySegue 是一个popover segue,您已将其从包含的viewController 拖到要弹出的那个。您创建 segue,然后在 IB 中的 segue 的“标识符”框中输入一个名称,然后在此处使用我放置“mySegue”的相同名称。

我已经按了您必须按下的两个按钮才能看到此显示;那么你只需要选择你想要处理的segue。您可以在图片中选择它(单击箭头中间的箭头),也可以在情节提要的项目列表中选择它。

【讨论】:

我可以在 Interface Builder 中引用 ViewController 吗?还是我必须以编程方式定义一个? 您可以在 ViewController 上使用 initWithNibName: 方法调用使用 IB 设计的特定布局。我不确定我明白你想要什么。也许如果你退后一步,在更高的层次上进行描述? 我如何改变 IB 的属性,就像你在图片中看到的那样? 我把图片放大了一点,并试图在答案中解释。 对不起,布莱恩,非常感谢您的帮助。我现在收到一个错误“没有锚的弹出框转场”【参考方案2】:

如果我理解正确,您的自定义按钮是 UIButton 的子类。所以在 IB 中,在正确的位置放置一个常规按钮,然后导航到右侧窗格中的身份检查器,并在类字段中输入您的自定义按钮类名称,以便 IB 按钮变为 CustomUIButton。您可以像使用常规按钮一样操作其他所有内容。

您必须在视图控制器的 .h 文件中导入自定义类。

希望对你有帮助。

【讨论】:

我的按钮名为hardButton1,如果我在类字段中输入它,它只会保留普通按钮的相同属性,而不是我在实现文件中编写的属性。感谢您的回复。 好的,那么请确保您没有拼错已重写的方法,并且它们已在 .h 文件中声明。【参考方案3】:

通过接口生成器将操作touchupinside 连接到方法buttonTapped:。 这样做

右键单击 Interfacebuider 上的按钮, 在窗口中会有动作列表。 单击并拖动 touchUpInside 并将其放在 viewcontroller 对象上 然后另一个窗口显示方法并将其与所需方法连接。就是这样

通过这个tutorial

编辑:

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

self 是你定义方法 buttonPressed 的地方:

编辑 2:

从 cmets 我认为问题可能是按钮图像 或框架。为图像设置背景颜色并进行测试。同时检查是否设置了正确的图像名称和扩展名。放置一个断点并测试如果按钮可见则该方法被击中

【讨论】:

我以编程方式定义了我的按钮,因此它不会显示在 Interface Builder 中,只有在它运行应用程序时才会显示。 这就是我所做的,当我的按钮没有显示在那里时,我仍然不明白如何使用 Interface Builder 来执行此操作 "按钮不显示在那里?你是什么意思?你能解释更多吗? 我在我的实现文件中定义 UIButton 的地方,我设置了宽度、高度和它在屏幕上的位置,所以我在运行应用程序时可以看到它,但在界面生成器 好吧,你必须在 IB 中添加一个按钮,并使其自定义类成为你的按钮类。请参阅实现不会在 IB 中带来按钮。我们必须添加它并连接它以使编译器知道这一点IB 中的按钮代表 Class 中的此引用。为此,我们使用 IBOutlets

以上是关于使用自定义 UIButton 以编程方式调用 ViewController PopOver的主要内容,如果未能解决你的问题,请参考以下文章

如何在标准 UITableViewCell 中以编程方式自动布局右侧的自定义 UIButton。

以编程方式将 UIButton 添加到带有情节提要的自定义 ViewController

在自定义单元格中点击 UIButton 不会调用 didSelectRowAtIndexPath

IBOutlet 用于约束并以编程方式将其连接到 UIButton

以编程方式创建 UIButton 比使用情节提要模糊

Swift:以编程方式在键盘上方添加 UIButton