Причина NSInvalidArgumentException Получатель не имеет перехода с идентификатором - PullRequest
13 голосов
/ 05 марта 2012

У меня есть проблема, с которой я сижу.У меня есть UIViewController List и UIViewController Login.На Login у меня есть кнопка «Готово», а также еще одна скрытая кнопка на том же UIViewController, который имеет переход к List (Тип: push).Я дал ему идентификатор в конструкторе интерфейсов xcode с именем «LoginToList».Теперь из другого класса (класс, который работает, когда Login является активным контроллером) я вызываю:

[[Login sharedLogin] performSegueWithIdentifier:@"LoginToList"];

Класс Login явно имеет переход с идентификатором "LoginToList"

Тем не менее, я продолжаю получать:

 'NSInvalidArgumentException', reason: 'Receiver (<Login: 0x6d79d90>) has no segue with identifier 'LoginToList''

+ (id) sharedLogin выглядит так:

+ (id) sharedLogin {
    static Login *sharedLogin = nil;

    @synchronized(self) {
        if (sharedLogin == nil) {
            sharedLogin = [[self alloc] init];
        }

        return sharedLogin;
    }
}

Если у кого-нибудь есть идеи, почему он так говорит, я был бы рад это услышать!:D Я не знаю, упустил ли я что-то глупое, но не могу его обнаружить :(

РЕДАКТИРОВАТЬ: я создал переход в построителе интерфейсов (Ctrl + перетаскивание мышью из LoginList), используя сами UIViewControllers (Login & List).Затем я назвал segue "LoginToList" другими словами, я дал ему этот идентификатор.Я нажал на переход, и в правом верхнем углу появилось поле «Идентификатор», которое я использовал.

Я все еще получаю сообщение об ошибке, говорящее, что Login не имеет перехода с идентификатором "LoginToList".грустная

Ответы [ 4 ]

2 голосов
/ 18 сентября 2012

Что касается вашего фрагмента кода, похоже, что вы пытались создать синглтон из контроллера входа, но сделали это только наполовину.

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

Вы должны попытаться передать ссылку на экземпляр LoginController (инициализированные unsing сегменты раскадровки и т. Д.)в «другой класс» и использовать его.

1 голос
/ 25 июня 2012
sharedLogin = [[self alloc] init];

попробуйте это

sharedLogin = [self.storyboard instantiateViewControllerWithIdentifier:@"xxxx"];

Вы должны установить IdentifierName в раскадровке LoginViewController

0 голосов
/ 26 апреля 2012

Во-первых, я считаю, что сегы должны следовать правилам верблюдов. изменить на ...

loginToList

секунду, отключите и снова подключите ваши взгляды в ib.

в-третьих, очистите ваш проект (shift-command-k).

наконец, вы должны использовать что-то вроде этого метода ...

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"loginToList"]) {
        [[segue destinationViewController] setDelegate:self];
    }

}

для твоего перехода. затем настройте метод протокола делегата для отклонения контроллера представления.

0 голосов
/ 11 апреля 2012

не зная о том, что делает ваш инициал ...

я обнаружил, что пытался динамически [[alloc] init] контроллер представления для такого использования, мне пришлось вызвать initWithNibName: bundle: , и, таким образом, мне пришлось поставить мой контроллер вида в отдельном классе xib, поэтому он не запутался в раскадровке и не оставляет предупреждений о недоступной сцене.

без initWithNibName: bundle: , я предполагаю, что ваш вызов [[alloc] init] в sharedLogin неправильно связывает UIStorybardSegue *, который Вы явно создали контроллер представления Login таким образом, чтобы его можно было использовать из возвращаемого объекта.

(моя ситуация в том, что у меня был поповер на iPad и обычная навигация в iPhone. Для iPhone я использую скрытую кнопку с переходом в iPhone, но он выполняет переход к сцене и контроллеру представления, который несомненно, инициализируется в awakeFromNib:. для iPad, я помещаю в popover, а popover не связан ни с чем ... и инициализируется с помощью initWithNibName: bundle: для элемента, который находится в отдельном файле .xib.]

...