3

我有一个UIButton像这样以编程方式定义的自定义:

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];

因此,它不会显示在 Interface Builder 中,它仅在我运行应用程序时出现在屏幕上。这意味着我不能 ctrl + 从UIButtonto a拖动ViewController来选择一个弹出框。我可以在我的代码中调用 segue 吗?如果没有,我还有其他选择吗?

4

3 回答 3

6

Blub 和 tkanzakic 的答案不太适用,因为当您创建 segue 时,popover segue 坚持在情节提要中有一个锚点视图。而且由于您的按钮尚不存在,因此很难做到这一点。您可以锚定到现有的故事板视图,但弹出箭头在弹出时不会指向正确的对象。您可以在代码中移动现有视图以匹配代码创建按钮的矩形。但是您不妨完全放弃 segue 并在代码中执行 popover。

您需要声明一个 popoverController 属性:

@property (nonatomic, strong) UIPopoverController* buttonPopoverController;

然后您的按钮操作可能如下所示:

- (void) buttonTapped:(UIButton*) sender
{
    ContentViewController* contentVC = [[ContentViewController alloc] init];
    self.buttonPopoverController = [[UIPopoverController alloc]
                                     initWithContentViewController:contentVC];
    self.buttonPopoverController.delegate = self;  
           //only required if using delegate methods

    [self.buttonPopoverController presentPopoverFromRect:sender.frame
                           inView:self.view
         permittedArrowDirections:UIPopoverArrowDirectionAny
                         animated:YES];
}

ContentViewController 是您打算使用的任何视图控制器。如果它是使用情节提要场景配置的,您可能希望在创建它时执行以下操作:

 UIStoryboard *storyboard = self.storyboard;
 ContentViewController* contentVC = 
    [storyboard instantiateViewControllerWithIdentifier:@"ContentViewController"];

当您在情节提要中选择了相关的视图控制器时,您可以使用身份检查器设置情节提要标识符。

于 2013-02-26T16:36:18.547 回答
0
  1. CTRL + 从包含您的 Button的 ViewController 中拖动一个 segue -->您想要继续的 ViewController

  2. 为该 segue 指定一个标识符(只是一些唯一的字符串)(选择 segue,打开右侧的“实用程序”侧边栏并打开它的“属性检查器”选项卡

  3. [self performSegueWithIdentifier:@"identifierStringYouSecifiedInStep2" sender:sender]; 在您的方法中添加- (void)buttonTapped:(id)sender!)

于 2013-02-26T16:02:45.870 回答
0

在创建按钮的过程中,您为其分配了一个与名为 的方法相关联的操作buttonTapped:,您可以从那里执行 segue,如下所示:

- (void)buttonTapped:(id)sender
{
    [self performSegueWithIdentifier:@"theSegueIdentifier" sender:sender];
}
于 2013-02-26T16:04:59.537 回答