Подтвердить что ты не робот

Причина NSInvalidArgumentException Приемник не имеет идентификатора с идентификатором

У меня проблема, с которой я сижу. У меня есть 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 Я не знаю, не хватает ли я чего-то глупого, но я не могу его обнаружить :(

EDIT: я создал segue в интерфейсе (ctrl + click перетащить от Login до List), используя UIViewControllers onesselfves (Login и List). Затем я назвал segue "LoginToList", другими словами, я дал ему этот идентификатор. Я нажал на сегмент, и в верхнем правом углу появилось поле "Идентификатор", которое я использовал.

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

sharedLogin = [[self alloc] init];

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

loginToList

второй, отключите и снова подключите свои представления в ib.

третий, очистите свой проект (shift-command-k).

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

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

}

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