кнопка возврата возвращается к другому UITableViewController, откуда она пришла

Скажем, у меня есть UITableViewController A и UITableViewController B. И A, и B загружают UIView C. Как сделать так, чтобы кнопка «Назад» в C всегда возвращалась к B, а не туда, откуда она пришла?

Вот конкретный пример: A=окно контактов в скайпе iphone. B=Окно чата, каждая строка представляет собой историю чата с другим человеком C=В окне чата отображается беседа с одним и тем же человеком.

C можно загрузить из A или B, но я хочу, чтобы кнопка «Назад» в окне чата ( C ) возвращалась только в окно чатов (B).

Ваше здоровье.


person Michael Z    schedule 21.01.2010    source источник


Ответы (4)


Вам будет трудно реализовать это в основном потому, что это плохой дизайн пользовательского интерфейса, и API его не поддерживает.

Вы, пользователь, ожидаете, что кнопка «Назад» вернет его к предыдущему представлению, как и в любом другом приложении, которое они используют. Переход к любому другому представлению запутает их еще больше, потому что это не иерархия, а цикл. Иногда пользователи выбирают B-->C-->B, но в других случаях A-->C-->B-->C. (Как они возвращаются в А?)

Вместо кнопки «Назад» в C у вас должна быть кнопка справа, которая всегда возвращает вас к B, независимо от того, как вы попали в C. Одна и та же кнопка в одном и том же контексте всегда должна давать один и тот же результат. Пользователям не нужно помнить, в каком невидимом режиме они находятся, чтобы предсказать действие кнопки.


Edit01: (Ответ на комментарии ниже)

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

Я думаю, вам придется начать с невидимого основного вида, а затем добавить к нему панель вкладок. В главном контроллере представления создайте атрибуты/выходы для каждого представления. В каждом представлении есть атрибут/выход, связанный с главным контроллером представления. Затем используйте кнопку «Назад» (которую я настоятельно рекомендую вам обозначить как «Чаты») метода вызова представления C в A и B, которая затем вызывает метод в главном контроллере представления, который (1) удаляет представление C либо с вкладки A, либо вкладка B (2) переключает вкладку на вкладку B, а затем (3) загружает представление B на вкладку B.

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

Для сравнения, посмотрите, как приложение для телефона справляется с той же ситуацией. Независимо от того, какую вкладку вы используете для совершения вызова, избранного, контактов, клавиатуры и т. д., вы все равно вернетесь к представлению этой вкладки, когда вызов будет завершен. Если вы хотите сделать вызов другим способом, просто нажмите соответствующую вкладку.

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

person TechZen    schedule 22.01.2010
comment
Привет. A и B - это UITableControllers, каждый из которых находится на вкладке в UITabBarController. Можно нажать A на панели вкладок, чтобы вернуться к A. Это может быть плохой дизайн, но это то, как Skype и Ebuddy делают на iphone, вы выбираете друга из контактов / друзей для чата, один раз в окне чата, назад кнопка ведет обратно к чатам, а не к контактам/друзьям. Этот пост был упрощен из моего другого поста по этой ссылке: stackoverflow.com/questions/2112716/ - person Michael Z; 22.01.2010
comment
Следуя вашему предложению, если вы прочитали мой последний комментарий, поскольку A и B являются UITableViewController, как мне убедиться, что C всегда возвращается к B? - person Michael Z; 22.01.2010
comment
Ответ на Edit01 Привет, TechZen: Большое спасибо за ваш ответ, я думаю, что ваше решение будет работать, принятие вашего предложения радикально изменит структуру моего приложения. Я надеюсь, что это не единственное решение. Этот дизайн пользовательского интерфейса интуитивно понятен для пользователей, проблема заключается на уровне реализации. Вы не совсем правы насчет того, как телефонное приложение справляется с одними и теми же ситуациями. Если вы идете к телефону-›выберите человека-›нажмите текстовое сообщение->кнопка назад говорит сообщение, а не контакты. Так что это именно ситуация A-›C-›B-›C-›B Большое спасибо за ваш вклад, я бы пока запомнил ваше решение. - person Michael Z; 23.01.2010
comment
В последовательности, которую вы описываете с телефонным приложением, телефонное приложение фактически закрывается перед запуском приложения SMS. Приложение SMS открывает окно сведений о сообщении для контакта, отправленного телефонным приложением. Кнопка обратного сообщения возвращает пользователя к представлению, которое он увидел бы, если бы сам открыл приложение SMS. Чтобы вернуться к приложению телефона, пользователь должен выйти из SMS и открыть приложение телефона. Однако, если вы считаете, что ваш дизайн — лучший/самый знакомый интерфейс, дерзайте. - person TechZen; 23.01.2010
comment
Это имеет смысл. Неудивительно, что загрузка приложения для сообщений занимает некоторое время. Спасибо, ТехЗен. - person Michael Z; 24.01.2010
comment
Я задал тот же вопрос в группе iphone google: получил ответ как: Sukima: я полагаю (хотя я понятия не имею), что эти приложения, такие как skype и Beejive, делают, когда представление A хочет представление C, оно сообщит вашему UITabBar о перемещении на вкладку чатов, затем нажмите на подробное представление C. Это на самом деле лучше, потому что тогда пользователь увидит, что представление изменилось благодаря тому факту, что на панели вкладок изменились основные моменты. from: Далее я читаю ветку stackoverflow. Теперь я понимаю, о чем вы спрашиваете. groups.google.com/group/iphone-appdev-auditors/ browse_thread/ - person Michael Z; 24.01.2010
comment
Да, это лучший подход. - person TechZen; 25.01.2010

Вы всегда будете возвращаться к представлению, которое называлось pushViewController

Не могли бы вы отправить A сообщение B, чтобы B позвонил pushViewController?
Возможно, я не понимаю вашу архитектуру, но думаю, что это сработает.

person justin    schedule 21.01.2010
comment
Спасибо за ваше предложение, возможно, будет невозможно отправить сообщение B. Вот примерный дизайн, если вам интересно stackoverflow.com/questions/2112716/ - person Michael Z; 22.01.2010

Если вы действительно хотите это сделать, вы можете создать метод в B, который выдвигает C, затем выталкивает B из A (без анимации) и вызывает метод, который выдвигает C. Конечно, когда вы выталкиваете C в B, A все еще будет под ним.

person blindjesse    schedule 22.01.2010
comment
Спасибо, мне нужно подумать над вашим решением. - person Michael Z; 24.01.2010

Я получил ответ от группа Google и последовал его совету, это работает:

От Сукима: Я считаю (хотя у меня нет реального представления), что эти приложения, такие как скайп и Beejive, делают, когда представление A хочет представление C, оно сообщит вашему UITabBar, чтобы перейти на вкладку чатов, а затем нажать на подробное представление C. Это на самом деле лучше, потому что тогда пользователь увидит, что представление изменилось из-за того, что панель вкладок изменила выделение. from: Далее я читаю ветку stackoverflow. Теперь я понимаю, о чем вы спрашиваете.

person Michael Z    schedule 17.02.2010