Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как переключиться между двумя ViewController? 
:(
    Опции темы
Dimanoss
  Дата 22.7.2013, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 14.10.2010

Репутация: нет
Всего: нет



День добрый, о, всезнающий All.

Воткнулся в простенькую проблемку.  Не могу переключиться между двумя ViewController'ами.  Если в StoryBoard тупо рисую кнопку и связываю - всё, конечно, работает.  Но мне нужно, чтобы по нажатию на кнопку проходила аутентификация, а только потом уж - смена экрана.

Если можно, ткните мордахой в примерчик, как программно (в смысле - не с помощью StoryBoard) можно это осуществить.  Да и в целом вопросец - как научить один контроллер видеть объекты/переменные другого....

Спасибо заранее...
PM MAIL   Вверх
Bitter
Дата 22.7.2013, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 10
Всего: 27



Ууууу, да у вас знания на уровне ХэлоВорда, а читать книжки это дьявол придумал  smile 

Цитата(Dimanoss @  22.7.2013,  10:14 Найти цитируемый пост)
как программно (в смысле - не с помощью StoryBoard) можно это осуществить

[self presentViewController:vc animated:YES completion:nil];

Цитата(Dimanoss @  22.7.2013,  10:14 Найти цитируемый пост)
 как научить один контроллер видеть объекты/переменные другого

#import "ДругойВьюКонтроллер.h"
PM MAIL ICQ Skype   Вверх
Dimanoss
Дата 22.7.2013, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 14.10.2010

Репутация: нет
Всего: нет



Цитата(Bitter @ 22.7.2013,  10:34)
Ууууу, да у вас знания на уровне ХэлоВорда, а читать книжки это дьявол придумал  smile 


Грешно, дядечка, над убогими смеяться.  Как раз над книжками и сижу.  Но там всё на уровне примеров, с классификацией не так всё гладенько, вот и не работают стандартные приёмчики, там описанные...
PM MAIL   Вверх
Bitter
Дата 22.7.2013, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 10
Всего: 27



Есть еще такой вариант:
делаете в сторибоарде переход как и делали раньше, но только не от кнопки, а от самого контроллера. Даете переходу имя какое-нибудь, а в обработчике кнопки пишете

Код

- (void)didTouchButton:(id)sender {
    if (YES) {
        [self performSegueWithIdentifier:@"MySegue"];
    }
}


вместо if (YES) - ваше условие
PM MAIL ICQ Skype   Вверх
Dimanoss
Дата 22.7.2013, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 14.10.2010

Репутация: нет
Всего: нет



Цитата(Bitter @  22.7.2013,  10:34 Найти цитируемый пост)
#import "ДругойВьюКонтроллер.h" 


хмммм... не срастается чего-то.  Есть три ВьюКонтроллера - первый/второй + "свитчер".  Когда подключаю (#import) в m-файле первого контроллера h-файл второго, то при обращении идёт ошибка "Use of undeclared identifier".... Не видит объект, который в "свитче" нормально видим...  Что-то я явно не туда подключаю, получается... :-(

PM MAIL   Вверх
Bitter
Дата 22.7.2013, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 10
Всего: 27



что такое "свитчер" и как вы пытаетесь обращаться?
PM MAIL ICQ Skype   Вверх
anatox91
Дата 8.8.2013, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: нет
Всего: 13



забей ты на все эти сторибоарды, мой тебе совет, создавай Empty Project и пиши проект с нуля(ну или почти с нуля smile ), быстрее разберешься smile


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
Dimanoss
  Дата 13.8.2013, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 14.10.2010

Репутация: нет
Всего: нет



Опять к проекту.  В азах, видимо, плутаю.  Те самые два ВьюКонтроллера.  Вызов не работает. Файлы:

 BIDFirstViewController.h:
Код

#import <UIKit/UIKit.h>
@interface BIDFirstViewController : UIViewController
- (IBAction)firstButtonPressed;
@end



 BIDFirstViewController.m:
Код

#import "BIDFirstViewController.h"
#import "BIDSecondViewController.h"
@interfaceBIDFirstViewController ()
@end
@implementation BIDFirstViewController

-(IBAction)firstButtonPressed
{
    [self presentViewController:[color=red]BIDSecondViewController[/color] animated:YES completion:nil];
}
@end



 BIDSecondViewController.h:
Код

#import <UIKit/UIKit.h>
@interface BIDSecondViewController : UIViewController
- (IBAction)secondButtonPressed;
@end



 BIDSecondViewController.m:
Код

#import "BIDSecondViewController.h"
@interfaceBIDSecondViewController ()
@end
@implementation BIDSecondViewController
@end



На выделенную красным строку в  BIDFirstViewController.m компилятор ругается (Unexpected interface name, expected expression)

где-то я опять пролетаю, да?  Надо как-то явно второй контроллер именовать?
PM MAIL   Вверх
Bitter
Дата 13.8.2013, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 10
Всего: 27



[self presentViewController:BIDSecondViewController animated:YES completion:nil];

Что это вообще? Вы передаете туда имя класса, а не контроллер. Разницу между объектом и классом понимаете?
PM MAIL ICQ Skype   Вверх
Dimanoss
Дата 13.8.2013, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 14.10.2010

Репутация: нет
Всего: нет



Изначально такой вот вариант был:
Код

BIDSecondViewController *svc;
[selfpresentViewController:svc animated:YEScompletion:nil];


но оно ошибку вызывало "Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Application tried to present a nil modal view controller on target BIDFirstViewController...."

Вот и пытался попробовать через имя класса...  Понимаю, фигню задумал...


PM MAIL   Вверх
Bitter
Дата 13.8.2013, 16:24 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 10
Всего: 27



Цитата(Dimanoss @  13.8.2013,  15:22 Найти цитируемый пост)
BIDSecondViewController *svc;
[selfpresentViewController:svc animated:YEScompletion:nil];


Это не меньшая фигня чем предыдущая.
Вы либо читаете не те книги, либо просто обманываете, что читаете. Так как совершенно не знаете что такое ООП, и как им пользоваться.
В данном случае вы просто объявили переменную класса BIDSecondViewController, а вам нужно создать объект этого класса. Переменная при объявлении имеет значение nil, то есть пустоту. А сообщение  'Application tried to present a nil modal view controller on target BIDFirstViewController...." означает что нельзя показать на экране контроллер, которого не существует (то есть nil)

PM MAIL ICQ Skype   Вверх
Dimanoss
Дата 13.8.2013, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 14.10.2010

Репутация: нет
Всего: нет



Момент.  Получается - при объявлении класса как таковой объект не создаётся?  А как быть с первым контроллером?  Я его явно не создавал, а он, тем не менее - на экране... (ошибка вылетает при обратке клика на кнопке)
PM MAIL   Вверх
Bitter
Дата 13.8.2013, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 10
Всего: 27



Первый контроллер создается автоматически сторибоардом. Вы можете воспользоваться сторибоардом для создания контроллера,
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MyStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"MyViewController"];

Имя контроллера прописывается в самом контроллере в сторибоарде в поле Storyboard ID
PM MAIL ICQ Skype   Вверх
Shklyar
Дата 13.8.2013, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 28.11.2007
Где: Kyiv

Репутация: нет
Всего: 3



Использовать сторибоард можно, но может попробовать все-таки создать объект?
Как-то так: BIDSecondViewController *svc = [[BIDSecondViewController alloc] init];

Bitter, извини. Ты толкаешь человека к самостоятельным действиям и это более правильно. Сторибоард же такая штуковина, которая вроде создана для упрощения программирования, но частенько (для меня) легче использовать код. Для переключения между двумя вью контроллерами я таки использую сторибоард с двумя вью контроллерами и сигвейем. Не знаю как в приведенном выше коде перейти обратно, к первому вью контроллеру, с его прежним состоянием.?
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Bitter
Дата 13.8.2013, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 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]

Цитата(Shklyar @  13.8.2013,  23:08 Найти цитируемый пост)
но может попробовать все-таки создать объект?

Да пожалуйста, можно и кодом, это уж зависит от предпочтений программиста и заказчика. Просто речь изначально шла о сторибоарде

Добавлено через 4 минуты и 58 секунд
в добавление к перечисленным методам возврата в предыдущий контроллер, хочу сказать, что в сторибоарде для этого есть еще одна фишка. Называется Exit
user posted image
для этого надо в первом контроллере написать аутлет принимающий сегвей, а потом в сторибоарде для второго контроллера указать метод первого просто перетащив сегвей с кнопки на эту зеленую иконку (звучит запутанно но в реализации очень просто).
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | iOS | Следующая тема »


 




[ Время генерации скрипта: 0.1012 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.