it-roy-ru.com

Создайте пользовательскую левую кнопку назад на UINavigationBar С помощью стандартной стрелки слева

Когда я создаю пользовательскую кнопку «Назад», я использую следующий код:

    UIBarButtonItem *leftButton = [[UIBarButtonItem alloc]initWithTitle:@"Yeah" style:UIBarButtonItemStyleBordered target:self action:@selector(backButtonPressed:)];
self.navigationItem.leftBarButtonItem = leftButton;

Это прекрасно работает, и я получаю этот результат:

Screenshot of the Word 'Details' where the back button would normally be.

Я бы получил тот же результат, но со стрелкой слева, например, так (когда это стандартная кнопка «Назад», а не пользовательская):

Screenshot of the standard back arrow followed by the Word 'Details'.

Как я могу просто добавить эту стрелку?

19
Erzékiel

Наконец, вот фрагмент, который я использую для определения заголовка кнопки «Назад» со стандартной левой стрелкой в текущем представлении, а не в родительском представлении:

- (void)viewDidLoad {
    [super viewDidLoad];

    [self setTitle:@"Current View"];

    // Get the previous view controller
    UIViewController *previousVC = [self.navigationController.viewControllers objectAtIndex:self.navigationController.viewControllers.count - 2];

    // Create a UIBarButtonItem
    UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"FooBar" style:UIBarButtonItemStyleBordered target:self action:@selector(yourSelector)];

    // Associate the barButtonItem to the previous view
    [previousVC.navigationItem setBackBarButtonItem:barButtonItem];
}

Вот результат:

enter image description here

Примечание: Однако, поскольку невозможно добавить действие в backBarButtonItem, вы можете обратиться к к этому замечательному сообщению , если хотите.

Обновлено для Swift

// Prev - no chevron...
//navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Back !", style: .plain, target: self, action: #selector(backPressed))

// adds the chevron
let vc = navigationController?.viewControllers.first
let button = UIBarButtonItem(title: "Go Back", style: .plain, target: self, action: #selector(backPressed))
vc?.navigationItem.backBarButtonItem = button
29
Erzékiel

Проще всего было бы установить заголовок в родительском контроллере (то есть в том, к которому вы хотите перейти обратно). Если вы не хотите, чтобы это совпадало с фактическим заголовком, отображаемым в представлении этого ВК, вы можете изменить заголовок в viewWillDisappear на то, что вы хотите, на кнопке «Назад» следующего ВК, а затем изменить его на то, что вы хотите в родитель в viewWillAppear.

Если вы используете раскадровки, вы также можете установить обратный заголовок непосредственно в IB.

Наконец, чтобы создать пользовательскую кнопку возврата, вы можете сделать что-то вроде:

self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"Details" style:UIBarButtonItemStyleBordered target:nil action:nil];

... просто убедитесь, что вы делаете это в представляемом (или родительском) контроллере представления, а не в загружаемом контроллере представления (представленный контроллер).

17
Bladebunny
UIButton * backButton = [UIButton buttonWithType:UIButtonTypeCustom];
[backButton addTarget:self action:@selector(popViewController) forControlEvents:UIControlEventTouchUpInside];
[backButton setFrame:FRAME_DEFINE
[backButton setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];
[backButton setExclusiveTouch:YES];
[backButton setImage:[UIImage imageNamed:BACK_BUTTON_DEFAULT_ICON] forState:UIControlStateNormal];
[backButton setTitle:@"BACK" forState:UIControlStateNormal];
[backButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
UIBarButtonItem *backMenuBarButton = [[UIBarButtonItem alloc] initWithCustomView:backButton];
self.navigationItem.leftBarButtonItem = backMenuBarButton;
3
Durican Radu

ну вам нужно пойти с фоновым изображением и с заголовком и 

// Creates a back button instead of default behaviour (displaying title of previous screen)
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back_arrow.png"]
                                                               style:UIBarButtonItemStyleBordered
                                                              target:self
                                                              action:@selector(backAction)];

tipsDetailViewController.navigationItem.leftBarButtonItem = backButton;
[backButton release];
0
Retro

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

extension UIViewController {

    func setBackButtonTitle(to title: String) {
        let barButtonItem = UIBarButtonItem(title: title, style: .plain, target: self, action: nil)
        self.navigationItem.backBarButtonItem = barButtonItem
    }
}

Это должно вызываться из родительского viewController, например, в viewWillDisappear -

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    self.setBackButtonTitle(to: "Back"))
}
0
SomaMan

Я использую код как:

UIBarButtonItem *leftBar = [[UIBarButtonItem alloc] init];
leftBar.title = @"Back";//Details
self.navigationController.navigationBar.topItem.backBarButtonItem = leftBar;
0
Mannam Brahmam