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