добавить кнопку «Готово» на панель навигации без использования контроллера навигации - PullRequest
1 голос
/ 18 июля 2011

У меня есть контроллер вида, который я бы хотел отключить, нажав кнопку «Готово» в правом верхнем углу на панели навигации. Я не использую uinavcontoller, но просто добавил навигационную панель, как это в моем viewDidLoad:

  bar = [[UINavigationBar alloc] init];

в .ч:

IBOutlet UINavigationBar *bar;

И, конечно же, подключил навигационную панель на IB.

Затем я попытался добавить элемент навигации также в viewDidLoad, но ничего не происходит:

rightButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonSystemItemDone target:nil action:nil];
UINavigationItem *item = [[UINavigationItem alloc] initWithTitle:@"Title"];
item.rightBarButtonItem = rightButton;
item.hidesBackButton = YES;
[bar pushNavigationItem:item animated:NO];

Обратите внимание: здесь есть несколько подобных вопросов, но ни один из них не отвечает на этот точный вопрос.

спасибо за помощь!

1 Ответ

9 голосов
/ 18 июля 2011

Вы не захотите размещать / инициализировать панель в своем коде, если она уже есть в IB.Это создаст вторую версию, и сообщения могут быть искажены.Если вы помещаете панель в свой вид в IB, было бы проще разместить там кнопку «Готово».Во-первых, вы захотите использовать UINavigationItem вместо UINavigationBar.Перетащите UIBarButtonItem на правую сторону вашего UINavigationItem, измените текст с Item на Done и выберите стиль.Затем вы создадите метод IBAction, чтобы сделать то, что вы хотите, чтобы кнопка делала (отклонить представление).Тогда это просто вопрос подключения селектора вашей кнопки (в IB) к методу IBAction, и это будет делать то, что вы хотите.

Если вы хотите / должны сделать это программным путем, вы просто будете использовать

rightButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(dismissView:)];
navigationItem.rightBarButtonItem = rightButton;
[rightButton release];

Вам также понадобится метод dismissView:.

- (IBAction)dismissView:(id)sender {
    // do something;
}

РЕДАКТИРОВАТЬ: чтобы сделать все это программно, вы начнете с добавления панели навигации кВаш заголовочный файл

UINavigationBar *navBar;

Вам действительно нужно это сделать, только если вы планируете разрешить изменение ориентации.Так как вы не используете IB, нет необходимости делать это выходом, поэтому мы закончили в заголовке.

В файле реализации вы хотите вызвать следующее:

- (void)viewDidLoad {
    navBar = [[UINavigationBar alloc] init];
    UINavigationItem *navItem = [[[UINavigationItem alloc] initWithTitle:@"some title"] autorelease];
    UIBarButtonItem *done = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(dismissView:)] autorelease];
    navItem.rightBarButtonItem = done;
    navBar.items = [NSArray arrayWithObject:navItem];
    [self.view addSubview:navBar];
}

- (void)viewDidAppear:(BOOL)animated {
    navBar.frame = CGRectMake(0, 0, self.view.frame.size.width, 44);
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
    navBar.frame = CGRectMake(0, 0, self.view.frame.size.width, 44);
}

- (void)dealloc {
    [navBar release];
}

Это начинается с создания экземпляров и размещения их в вашем представлении.Как только представление появляется и размер кадра известен программе, он изменяет размер панели навигации (которая, в свою очередь, изменяет размеры своих подпредставлений) до ее надлежащего размера.Затем каждый раз, когда меняется ориентация, он соответственно изменяет размеры.Я проверил это только для того, чтобы убедиться, что все это хорошая информация, и она отлично работает для меня, поэтому она должна быть полезной и для вас.Надеюсь, это поможет вам

...