iOS. Приемы программирования - страница 74
>[self.buttonPhoto addTarget: self
>action:@selector(gotoAppleWebsite:)
>forControlEvents: UIControlEventTouchUpInside];
>self.buttonPhoto.frame = buttonRect;
>[self.view addSubview: self.buttonPhoto];
>buttonRect.origin.y += 50.0f;
>self.buttonAudio = [UIButton buttonWithType: UIButtonTypeRoundedRect];
>[self.buttonAudio setTitle:@"Audio"
>forState: UIControlStateNormal];
>[self.buttonAudio addTarget: self
>action:@selector(gotoAppleStoreWebsite:)
>forControlEvents: UIControlEventTouchUpInside];
>self.buttonAudio.frame = buttonRect;
>[self.view addSubview: self.buttonAudio];
>}
Теперь в методе viewDidLoad корневого контроллера вида создадим навигационную кнопку. В зависимости от типа устройства при нажатии навигационной кнопки мы будем отображать либо вспомогательный экран (на iPad), либо предупреждающий вид (на iPhone):
>– (void)viewDidLoad{
>[super viewDidLoad];
>/* Проверяем, существует ли этот класс в том варианте iOS,
>где действует приложение. */
>Class popoverClass = NSClassFromString(@"UIPopoverController");
>if (popoverClass!= nil &&
>UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad){
>PopoverContentViewController *content =
>[[PopoverContentViewController alloc] initWithNibName: nil
>bundle: nil];
>self.popoverController = [[UIPopoverController alloc]
>initWithContentViewController: content];
>content.popoverController = self.popoverController;
>self.barButtonAdd = [[UIBarButtonItem alloc]
>initWithBarButtonSystemItem: UIBarButtonSystemItemAdd
>target: self
>action:@selector(performAddWithPopover:)];
>} else {
>self.barButtonAdd = [[UIBarButtonItem alloc]
>initWithBarButtonSystemItem: UIBarButtonSystemItemAdd
>target: self
>action:@selector(performAddWithAlertView:)];
>}
>[self.navigationItem setRightBarButtonItem: self.barButtonAdd
>animated: NO];
>}
Контроллер вспомогательного экрана ставит на себя ссылку в контроллере информационного вида сразу после инициализации информационного вида. Это очень важно. Контроллер вспомогательного экрана невозможно инициализировать в отсутствие контроллера информационного вида. Как только контроллер вспомогательного экрана инициализирован посредством контроллера информационного вида, можно продолжать работу и изменять контроллер информационного вида в контроллере вспомогательного экрана – но этого нельзя делать в процессе инициализации.
Мы решили, что при нажатии навигационной кнопки + на устройстве iPad будет запускаться метод performAddWithPopover:. Если мы имеем дело не с iPad, то нужно, чтобы при нажатии этой кнопки запускался метод performAddWithAlertView:. Итак, реализуем два этих метода, а также позаботимся о методах делегатов предупреждающего вида – чтобы нам было известно, какую кнопку в предупреждающем виде нажимает пользователь, работающий с iPhone:
>– (NSString *) photoButtonTitle{
>return @"Photo";
>}
>– (NSString *) audioButtonTitle{
>return @"Audio";
>}
>– (void) alertView:(UIAlertView *)alertView
>didDismissWithButtonIndex:(NSInteger)buttonIndex{
>NSString *buttonTitle = [alertView buttonTitleAtIndex: buttonIndex];
>if ([buttonTitle isEqualToString: [self photoButtonTitle]]){
>/* Добавляем фотографию… */
>}
>else if ([buttonTitle isEqualToString: [self audioButtonTitle]]){
>/* Добавляем аудио… */
>}
>}
>– (void) performAddWithAlertView:(id)paramSender{
>[[[UIAlertView alloc] initWithTitle: nil
>message:@"Add…"
>delegate: self
>cancelButtonTitle:@"Cancel"
>otherButtonTitles:
>[self photoButtonTitle],
>[self audioButtonTitle], nil] show];