2013-02-26 39 views
3

我有一個自定義UIButton我編程定義是這樣的:編碼一個酥料餅賽格瑞自定義的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 +從UIButton拖動到ViewController選擇一個popover segue。我可以在我的代碼中調用segue嗎?如果沒有,我還有其他選擇嗎?

回答

6

咕嚕咕嚕的和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"]; 

當你在故事板中選擇相關的視圖控制器可以使用身份檢查器中設置故事板標識符。

+0

我有這個錯誤:'使用未聲明的標識符'ContentViewController';你的意思是'_parentViewController'嗎?' – 2013-02-26 17:07:50

+0

@LouisHolley,應該將「ContentViewController」更改爲您希望放置在popoverController中的任何類型的viewController。 popoverController不是目標視圖控制器,它是你在alloc/init時放置你所需的viewController的容器。 – foundry 2013-02-26 17:09:51

+0

這似乎很好地工作。不幸的是,我無法測試它,因爲我有一個惱人的SIGABRT信號異常。非常感謝你的幫助。 – 2013-02-26 17:16:10

0
  1. 從包含您的 按鈕的的ViewController CTRL +拖動賽格瑞 - >的ViewController要原因請看

  2. Secify爲賽格瑞的標識符(只是一些獨特的字符串) ( 隨着segue選擇,打開右手「公用事業」側邊欄 並打開它的「屬性檢查器」選項卡

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

+0

我收到兩個錯誤。其中一個是'沒有可見@interface for'UIButton'聲明選擇器'performSegueWithIdentifier'',另一個是'Popover沒有錨'# – 2013-02-26 16:12:27

+0

抱歉,忘記發件人參數,現在編輯它,但只是按照XCodes自動完成在安全的一面 – blub 2013-02-26 16:13:56

0
在創建按鈕的過程

你它指定一個動作關聯到一個名爲buttonTapped:方法,你可以從那裏像這樣執行SEGUE的東西:

- (void)buttonTapped:(id)sender 
{ 
    [self performSegueWithIdentifier:@"theSegueIdentifier" sender:sender]; 
}