Как добавить кнопку «Назад» на панель навигации через раскадровку?

Я сейчас очень озадачен. Везде в Интернете я вижу учебные пособия по добавлению пользовательской кнопки «Назад», но я даже не могу заставить работать кнопку по умолчанию.

В моем MainViewController у меня есть performSegueWithIdentifier(...), а затем, на другом конце, я хочу, чтобы на панели навигации была кнопка «Назад» слева. Как этого добиться? Кажется, я не могу найти никаких учебников в Интернете. Я пробовал использовать UINavigationController, и всякий раз, когда я перетаскиваю «Элемент навигации» в раскадровке на панель навигации, мой заголовок заменяется, а кнопки «Назад» по-прежнему нет.

Как добавить кнопку «Назад» по умолчанию?


person David    schedule 26.01.2015    source источник
comment
Вы должны иметь возможность редактировать его заголовок в меню инспектора при выборе файла UINavigationItem. В противном случае, если вы правильно внедрили свое представление в UINavigationController, кнопка «Назад» должна сгенерироваться автоматически.   -  person AstroCB    schedule 26.01.2015
comment
UINavigationItem изменяет мой заголовок, и, похоже, нет способа выбрать тип кнопки в любом меню инспектора. Я не уверен, как правильно встроить UINavigationController   -  person David    schedule 26.01.2015
comment
Вы не видите этого в меню?   -  person AstroCB    schedule 26.01.2015
comment
Я делаю, но ничего из того, что я пишу в части кнопки «Назад», не работает.   -  person David    schedule 26.01.2015
comment
Кнопка «Назад» появляется по умолчанию, когда вы нажимаете новый контроллер представления на контроллер навигации (через код или переход). Покажите нам изображение вашей раскадровки, чтобы мы могли видеть, что вы делаете, а также любой код, который вы используете для отправки нового контроллера представления (в минимальном примере в этом нет необходимости).   -  person Robotic Cat    schedule 26.01.2015
comment
Если контроллер UINavigation был встроен в контроллер представления на вашей раскадровке, и вы выполняете push-переход от этого контроллера представления к другому, контроллер представления назначения автоматически добавляет к нему панель навигации/контроллер вместе с поведением по умолчанию для представлений push/pop. -- который включает в себя кнопку «Назад». Можете ли вы сделать снимок экрана, как выглядит ваша раскадровка?   -  person Louis Tur    schedule 26.01.2015
comment
О, теперь я понял ваш вопрос... Секунду... Я напишу ответ.   -  person Lyndsey Scott    schedule 26.01.2015
comment
@David Вы пробовали предложение в моем ответе? У меня такое чувство, что люди не понимают ваш первоначальный вопрос... Добавление элемента навигации фактически сбросит заголовок так, как вы заметили. Вам нужно использовать элемент Bar Button, чтобы установить кнопку «Назад» в вашем интерфейсе.   -  person Lyndsey Scott    schedule 26.01.2015
comment
@LyndseyScott Нужно ли мне использовать UINavigationController, если я пойду по этому пути? Как бы я сделал, чтобы элемент кнопки панели отображал функциональность обычной кнопки «Назад»? Я не возражаю против сброса заголовка, если бы вместо этого я мог просто использовать этот атрибут заголовка.   -  person David    schedule 26.01.2015
comment
@David В этом случае вам не нужно использовать UINavigationController. Просто свяжите элемент Bar Button Item как IBAction, как с любой другой кнопкой, и пусть метод IBAction выполнит отклонение представления.   -  person Lyndsey Scott    schedule 26.01.2015


Ответы (2)


Кнопка «Назад» по умолчанию… по умолчанию :). Я приведу вам быстрый пример. Создайте новый проект с одним представлением. Перейдите в раскадровку, щелкните контроллер одного представления, затем перейдите в меню «Редактор» -> «Встроить» -> «Контроллер навигации». Теперь вы увидите 2 контроллера представления: один является контроллером навигации, а второй — исходным контроллером представления. Вы заметите, что контроллер навигации теперь является начальным представлением приложения, и будет линия, соединяющая переходы, указывающая, что контроллер представления является корневым контроллером представления контроллера навигации. Затем добавьте еще один UIViewController (путем перетаскивания) рядом с исходным контроллером представления. Теперь у вас будет 3 контроллера представления, контроллер навигации, исходный контроллер представления и новый контроллер представления. Добавьте UIButton в левом верхнем углу исходного контроллера представления. Затем перетащите элемент управления с кнопки на новый контроллер представления и выберите переход к шоу. Если вы сейчас попробуете запустить приложение в симуляторе, вы сначала увидите исходный контроллер представления. Нажмите кнопку, и вы увидите новый контроллер представления с кнопкой «Назад»! Вы получите кнопку «Назад», даже не пытаясь, потому что она используется по умолчанию.

Изменить

Судя по комментариям, цель состоит в том, чтобы перейти прямо к MainViewController, если пользователь вошел в систему, и перейти к LogInViewController, если пользователь не вошел в систему.

Присвойте переходу push из LogInViewController в MainViewController идентификатор, перейдя к схеме, выбрав переход, перейдите к инспектору удостоверений и присвойте ему идентификатор. В ViewDidAppear LogInViewController проверьте, вошел ли пользователь в систему. Если это так, выполните переход. Это даст кнопку возврата на MainViewController контроллеру LogInView.

В моем приложении я делаю все немного по-другому.

Альтернатива: я делаю LogInViewController начальным контроллером представления приложения, но не встраиваю его в UINavigationController. Затем я добавляю MainViewController в раскадровку и встраиваю его в контроллер навигации. Я предлагаю встроить его в контроллер навигации, если у вас есть другие представления, которые вы хотите отобразить, и у вас есть кнопка «Назад» для MainViewController. Добавьте UIButton в LogInViewController и перетащите элемент управления из него в контроллер навигации. Выберите текущий модальный переход. Выберите переход в схеме раскадровки и в инспекторе атрибутов дайте ему имя, например «присутствует MainViewController». В методе ViewDidAppear LogInViewController проверьте, вошел ли пользователь в систему, и если это так, вызовите [self performSegueWithIdentifier:@"present MainViewController" sender:nil]; Это представит MainViewController, если пользователь вошел в систему, но не в противном случае. В MainViewController не будет кнопки «Назад», потому что это контроллер корневого представления контроллера навигации, который был представлен модально. Если вы хотите, чтобы верхняя левая кнопка была кнопкой для выхода пользователя из системы, вы можете добавить UIBarButton в левую часть MainViewController. Теперь перейдите к коду LogInViewController и добавьте - (IBAction) nameOfUnwindSegue : (UIStoryboardSegue *) segue{} Вернитесь к раскадровке и перетащите управление от этой кнопки на панели к значку выхода в верхней части контроллера представления в раскадровке. Выберите nameOfUnwindSegue (вы можете назвать это как хотите). Это создает переход отката, который закроет контроллер представления. Вы можете указать идентификатор, щелкнув его в раскадровке, перейдя к инспектору атрибутов и присвоив ему идентификатор ". В методе prepareForSegue в MainViewController вы можете проверить, равен ли segue.identifier идентификатору, и если да, вызовите метод выхода из системы.

person Josh Gafni    schedule 26.01.2015
comment
Итак, у меня есть LoginRegisterViewController, который переходит в MainViewController. Я хочу, чтобы это был RootViewController для моего NavigationController. Оттуда я перехожу к контроллеру, в котором мне нужна кнопка «Назад». Как мне правильно подключить представление навигационного контроллера в раскадровке? - person David; 26.01.2015
comment
Точно так же, как я описал выше; однако вы должны сообщить раскадровке, что то, что я называл исходным и новым UIViewControllers, является не просто UIViewControllers, а подклассом UIViewController. Предполагая, что у вас уже есть файлы LoginRegisterViewController и MainViewController, которые наследуются от UIViewController, все, что вам нужно сделать, это щелкнуть исходный контроллер представления, щелкнуть инспектор удостоверений и вместо класса ViewController изменить его на LoginRegisterViewController. Щелкните новый контроллер представления и сделайте то же самое с MainViewController. - person Josh Gafni; 26.01.2015
comment
Однако я не хочу, чтобы LoginRegisterViewController был частью стека. Есть ли способ просто запустить его из MainViewController. - person David; 26.01.2015
comment
Ваша цель - перейти прямо в MainViewController, если пользователь уже вошел в систему, а также иметь возможность выйти из системы и вернуться в LogINViewController? Я спрашиваю, потому что пользователю немного неприятно показывать кнопку «Назад», даже не видя экрана. Но я предполагаю, что они вошли в систему в какой-то момент? - person Josh Gafni; 26.01.2015
comment
Если пользователь не вошел в систему, он получает LoginRegisterViewController. Если они вошли в систему, я обхожу LoginRegisterViewController и перехожу прямо к MainViewController. Я не хочу, чтобы у MainViewController была кнопка «Назад». Фактически, это, вероятно, единственный ViewController, которому в любом случае нужна кнопка «Назад», поэтому, возможно, UINavigationController является излишним, но продолжают ли ViewController складываться, даже если UINavigationController отсутствует? - person David; 26.01.2015
comment
Благодарю вас! Я очень новичок в разработке iOS x.X - person David; 26.01.2015
comment
Не волнуйтесь! Кстати... Я очень рекомендую CS 193p, который бесплатно доступен в iTunes U. Это курс Стэнфорда по разработке iOS. Последний курс (только начинающийся) на Swift, но вы всегда можете пройти предыдущий на Objective-C. Он проходит через сегменты, а что нет. - person Josh Gafni; 26.01.2015
comment
Кстати... если вы найдете ответ полезным, не могли бы вы его принять? :) - person Josh Gafni; 26.01.2015
comment
Первоначальный вопрос OP гласил: я пытался использовать UINavigationController, и всякий раз, когда я перетаскиваю «Элемент навигации» в раскадровке на панель навигации, мой заголовок заменяется, а кнопки «Назад» по-прежнему нет. Как я сказал в своем ответе и как вы заметили бы, если вы попробуете это самостоятельно в раскадровке, если вы перетащите элемент навигации на панель навигации, он будет служить заголовком, не кнопка. ОП должен вместо этого перетаскивать элемент кнопки панели на свою панель навигации, чтобы создать кнопку ... Я думаю, вы усложнили вопрос. - person Lyndsey Scott; 27.01.2015

Как вы указываете в своем вопросе: "Я пытался использовать UINavigationController, и всякий раз, когда я перетаскиваю "Элемент навигации" в раскадровке на панель навигации, мой заголовок заменяется, а кнопки "Назад" по-прежнему нет. ."

Если вы перетащите «элемент навигации» на панель навигации, вы получите именно то поведение, которое вы описали — ваш «элемент навигации» будет служить заголовком, а не кнопка. Чтобы добавить пользовательскую кнопку «Назад» на панель навигации в раскадровке, вместо добавления «Элемент навигации» на панель навигации вам нужно добавить «Элемент кнопки панели».

person Lyndsey Scott    schedule 26.01.2015
comment
Несмотря на отрицательное голосование, это отвечает на вопрос ОП. Я думаю, что другие плакаты и комментаторы усложнили проблему. - person Lyndsey Scott; 27.01.2015
comment
хорошо.. я надеюсь, что я все еще был полезен :) - person Josh Gafni; 27.01.2015
comment
@JoshGafni кажется, что вы помогли ОП немного лучше понять вещи, поэтому ваш ответ очень полезен. - person Lyndsey Scott; 27.01.2015
comment
@narner Я понимаю ... Я думаю, что большинство людей, посетивших эту ветку, не поняли вопрос в том виде, в котором он был сформулирован. Я даже сначала с трудом это понял. - person Lyndsey Scott; 27.01.2015