![]() |
|
![]() ![]() ![]() |
|
Dimanoss |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 14.10.2010 Репутация: нет Всего: нет |
День добрый, о, всезнающий All.
Воткнулся в простенькую проблемку. Не могу переключиться между двумя ViewController'ами. Если в StoryBoard тупо рисую кнопку и связываю - всё, конечно, работает. Но мне нужно, чтобы по нажатию на кнопку проходила аутентификация, а только потом уж - смена экрана. Если можно, ткните мордахой в примерчик, как программно (в смысле - не с помощью StoryBoard) можно это осуществить. Да и в целом вопросец - как научить один контроллер видеть объекты/переменные другого.... Спасибо заранее... |
|||
|
||||
Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 10 Всего: 27 |
||||
|
||||
Dimanoss |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 14.10.2010 Репутация: нет Всего: нет |
Грешно, дядечка, над убогими смеяться. Как раз над книжками и сижу. Но там всё на уровне примеров, с классификацией не так всё гладенько, вот и не работают стандартные приёмчики, там описанные... |
|||
|
||||
Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 10 Всего: 27 |
Есть еще такой вариант:
делаете в сторибоарде переход как и делали раньше, но только не от кнопки, а от самого контроллера. Даете переходу имя какое-нибудь, а в обработчике кнопки пишете
вместо if (YES) - ваше условие |
|||
|
||||
Dimanoss |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 14.10.2010 Репутация: нет Всего: нет |
хмммм... не срастается чего-то. Есть три ВьюКонтроллера - первый/второй + "свитчер". Когда подключаю (#import) в m-файле первого контроллера h-файл второго, то при обращении идёт ошибка "Use of undeclared identifier".... Не видит объект, который в "свитче" нормально видим... Что-то я явно не туда подключаю, получается... :-( |
|||
|
||||
Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 10 Всего: 27 |
что такое "свитчер" и как вы пытаетесь обращаться?
|
|||
|
||||
anatox91 |
|
|||
![]() программист-самоучка ![]() ![]() Профиль Группа: Участник Сообщений: 699 Регистрация: 12.1.2008 Где: ++Украина.Крым++ Репутация: нет Всего: 13 |
забей ты на все эти сторибоарды, мой тебе совет, создавай Empty Project и пиши проект с нуля(ну или почти с нуля
![]() ![]() -------------------- The code is the design © Sony VAIO VGN-FW480J ![]() |
|||
|
||||
Dimanoss |
|
||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 14.10.2010 Репутация: нет Всего: нет |
Опять к проекту. В азах, видимо, плутаю. Те самые два ВьюКонтроллера. Вызов не работает. Файлы:
BIDFirstViewController.h:
BIDFirstViewController.m:
BIDSecondViewController.h:
BIDSecondViewController.m:
На выделенную красным строку в BIDFirstViewController.m компилятор ругается (Unexpected interface name, expected expression) где-то я опять пролетаю, да? Надо как-то явно второй контроллер именовать? |
||||||||
|
|||||||||
Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 10 Всего: 27 |
[self presentViewController:BIDSecondViewController animated:YES completion:nil];
Что это вообще? Вы передаете туда имя класса, а не контроллер. Разницу между объектом и классом понимаете? |
|||
|
||||
Dimanoss |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 14.10.2010 Репутация: нет Всего: нет |
Изначально такой вот вариант был:
но оно ошибку вызывало "Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Application tried to present a nil modal view controller on target BIDFirstViewController...." Вот и пытался попробовать через имя класса... Понимаю, фигню задумал... |
|||
|
||||
Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 10 Всего: 27 |
Это не меньшая фигня чем предыдущая. Вы либо читаете не те книги, либо просто обманываете, что читаете. Так как совершенно не знаете что такое ООП, и как им пользоваться. В данном случае вы просто объявили переменную класса BIDSecondViewController, а вам нужно создать объект этого класса. Переменная при объявлении имеет значение nil, то есть пустоту. А сообщение 'Application tried to present a nil modal view controller on target BIDFirstViewController...." означает что нельзя показать на экране контроллер, которого не существует (то есть nil) |
|||
|
||||
Dimanoss |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 14.10.2010 Репутация: нет Всего: нет |
Момент. Получается - при объявлении класса как таковой объект не создаётся? А как быть с первым контроллером? Я его явно не создавал, а он, тем не менее - на экране... (ошибка вылетает при обратке клика на кнопке)
|
|||
|
||||
Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 10 Всего: 27 |
Первый контроллер создается автоматически сторибоардом. Вы можете воспользоваться сторибоардом для создания контроллера,
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MyStoryboard" bundle:nil]; UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"MyViewController"]; Имя контроллера прописывается в самом контроллере в сторибоарде в поле Storyboard ID |
|||
|
||||
Shklyar |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 211 Регистрация: 28.11.2007 Где: Kyiv Репутация: нет Всего: 3 |
Использовать сторибоард можно, но может попробовать все-таки создать объект?
Как-то так: BIDSecondViewController *svc = [[BIDSecondViewController alloc] init]; Bitter, извини. Ты толкаешь человека к самостоятельным действиям и это более правильно. Сторибоард же такая штуковина, которая вроде создана для упрощения программирования, но частенько (для меня) легче использовать код. Для переключения между двумя вью контроллерами я таки использую сторибоард с двумя вью контроллерами и сигвейем. Не знаю как в приведенном выше коде перейти обратно, к первому вью контроллеру, с его прежним состоянием.? --------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U |
|||
|
||||
Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 10 Всего: 27 |
к предыдущему контроллеру можно перейти вызвав внутри второго контроллера метод [self dismissViewControllerAnimated:YES completion:nil]
или если он был запушен в NavigationController то [self.navigationController popViewControllerAnimated:YES] то же самое можно сделать в первом контроллере по отношению к второму: [vc dismissViewControllerAnimated:YES completion:nil] и без изменений [self.navigationController popViewControllerAnimated:YES] Да пожалуйста, можно и кодом, это уж зависит от предпочтений программиста и заказчика. Просто речь изначально шла о сторибоарде Добавлено через 4 минуты и 58 секунд в добавление к перечисленным методам возврата в предыдущий контроллер, хочу сказать, что в сторибоарде для этого есть еще одна фишка. Называется Exit ![]() для этого надо в первом контроллере написать аутлет принимающий сегвей, а потом в сторибоарде для второго контроллера указать метод первого просто перетащив сегвей с кнопки на эту зеленую иконку (звучит запутанно но в реализации очень просто). |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | iOS | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |