使用自定义 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的主要内容,如果未能解决你的问题,请参考以下文章