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