iOS - Как заставить backBarButtonItem также выполнить пользовательскую функцию? - PullRequest
3 голосов
/ 19 октября 2011

Я новичок в разработке iOS.Я использую следующий код для установки моего backBarButtonItem -

UIBarButtonItem *temporaryBarButtonItem=[[UIBarButtonItem alloc] init];
temporaryBarButtonItem.title=@"Back";
self.navigationItem.backBarButtonItem = temporaryBarButtonItem;
[temporaryBarButtonItem release];

Я также хочу, чтобы он выполнял другую функцию, кроме возврата назад.Это возможно?Или мне нужна еще одна кнопка для сохранения?

Ответы [ 5 ]

7 голосов
/ 19 октября 2011

Вы можете сделать это практически любым методом viewDidDisappear или viewWillDisappear.

Если это представление может вернуться только назад и не представляет никаких представлений, то это должно работать.

Однако, если вы планируете представить подпредставление, модальное представление, углубиться в иерархию навигации или выполнить другие операции просмотра, которые вызовут вызов viewDidDisapper, вам придется отделить свой код кнопки возврата. логика как-то.

Например, если вы представите модальное представление из этого представления, вы можете проверить, является ли self.modalViewController нулем, если это так, то у вас нет модального представления, и вы можете безопасно выполнить код кнопки возврата. Если это не ноль, то у вас есть модальное представление и вы не должны выполнять код кнопки возврата. (viewWillDisappear должен зарегистрировать контроллер модального вида как not-nil).

3 голосов
/ 19 октября 2011

Очень просто, попробуйте это!

    [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(myCoolAction:)];

Тогда все, что вам нужно сделать, это изменить myCoolAction: на соответствующий метод в вашем контроллере представления и обработать его.Наслаждайтесь!

РЕДАКТИРОВАТЬ: О, если вы хотите использовать это для backBarButtonItem, он не будет работать, как вы ожидаете.Система не будет вызывать вашу цель / действия для backBarButtonItem.Они очищаются после назначения на backBarButtonItem.

Один из способов справиться с этим - подключить ваш UINavigationController в качестве делегата.Тогда в вашем

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated

методе вы можете сделать там свое поведение.

1 голос
/ 11 октября 2013

Вы должны иметь возможность сделать что-то подобное вместо использования viewDidDisappear или viewWillDisappear.

Поместите это в viewDidLoad:

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStyleDone target:self action:@selector(cancelButtonAction:)];
self.navigationItem.leftItemsSupplementBackButton = NO;

Затем вы можете создатьМетод cancelButtonAction cancelButtonAction для вашего пользовательского кода и функции возврата, например, такой:

- (void)cancelButtonAction:(id)sender {
    //Your custom code goes here...


    //This will perform the back functionality if using a Navigation Controller
    [self.navigationController popViewControllerAnimated:YES];
}

Примечание: это будет заканчиваться использованием прямоугольной кнопки без стрелки.

1 голос
/ 11 апреля 2012

Строго говоря, этого нельзя сделать с помощью UIKit.

См. Документы на backBarButtonItem:

Цель и действие элемента кнопки задней панели, установленного вами, должны быть равны нулю.Значением по умолчанию является элемент панели кнопок, отображающий заголовок элемента навигации.

Обходной путь - указать leftBarButtonItem и присоединить любое пользовательское поведение, которое вам требуется, добавив цель @selector.

Хитрый бит - это само изображение кнопки.Как вы знаете, по умолчанию это не прямоугольная кнопка.Скорее, он имеет форму левой стрелки.Для этого вам нужно установить собственное изображение, чтобы кнопка выглядела по умолчанию.

Для этого есть множество ресурсов, включая этот, чтобы извлечь все художественные произведения UIKit:

https://github.com/0xced/UIKit-Artwork-Extractor

1 голос
/ 19 октября 2011

Вы можете добавить UIBarButtonItem в xib и добавить туда событие обработчика.

В противном случае создайте UIBarButtonItem с пользовательским представлением, которое представляет собой UIButton, и добавьте обработчик событий.

...