2013-02-26 5 views
3

У меня есть обычай UIButton который я определил программно как это:Кодирование SEGUE поповер для пользовательского 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

Blub-х и Ответы tkanzakic не будут работать, поскольку popover segue настаивает на том, чтобы иметь привязку в раскадровке, когда вы создаете segue. И поскольку ваша кнопка еще не существует, будет сложно получить это право. Вы можете привязываться к существующему представлению раскадровки, но затем стрелка popover не будет указывать на правильный объект, когда он всплывает. Вы можете переместить этот существующий вид в коде, чтобы он соответствовал прямоугольнику вашей кнопки, созданной кодом. Но вы также можете обойтись без 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»?' –

+0

@LouisHolley,« ContentViewController »следует изменить на любой тип, который ваш viewController вы хотите поместить в popoverController. PopoverController не является viewController назначения, это контейнер, в который вы помещаете свой необходимый viewController при выделении/init. – foundry

+0

Это похоже на работу. К сожалению, я не могу проверить это, потому что у меня есть один из этих раздражающих сигналов SIGABRT исключений. Большое спасибо за вашу помощь. –

0
  1. CTRL + перетащить SEGUE из ViewController, который содержит ваш кнопку ->ViewController вы хотите, чтобы непосредственно перейти

  2. Secify идентификатор (только некоторые уникальные строки) для этого Segue ( с Segue выбран, откройте правый «Utilities» на боковую панель и открыть его «атрибутов инспектор» вкладка

  3. Добавить [self performSegueWithIdentifier:@"identifierStringYouSecifiedInStep2" sender:sender]; внутри вашего - (void)buttonTapped:(id)sender способ!)

+0

У меня возникают две ошибки. Один из них: «Нет видимого @interface для« UIButton »объявляет селектор« performSegueWithIdentifier », а другой -« Popover segue без привязки » –

+0

извините, забыли аргумент отправителя, отредактировал его сейчас, но просто следуйте за автозаполнением XCodes, чтобы быть на безопасной стороне – blub

0

в процессе создания кнопки вы назначаете ему ассоциировать действие с методом, который называется buttonTapped:, вы можете выполнить переход оттуда, что-то вроде этого:

- (void)buttonTapped:(id)sender 
{ 
    [self performSegueWithIdentifier:@"theSegueIdentifier" sender:sender]; 
} 
Смежные вопросы