2012-03-05 4 views
13

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

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

Login класса явно имеет SEGUE с идентификатором "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 в InterfaceBuilder (Ctrl + клик перетащить из Login в List) с использованием UIViewControllers themselfves (Login & List). Затем я назвал segue "LoginToList", другими словами, я дал ему этот идентификатор. Я нажал на сегмент, и в правом верхнем углу появилось поле «Идентификатор», которое я использовал.

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

+0

Как выглядит LoginToList? Можете ли вы добавить этот код к своему вопросу? –

+0

@AlanMoore 'LoginToList' - это не код, а класс. 'LoginToList' является идентификатором для segue, который я создал в построителе интерфейса. –

+0

Ах, моя ошибка, подумал, что это имя селектора! –

ответ

0

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

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

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

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

-1

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

loginToList 

Во-вторых, отключите и заново соедините ваши взгляды в ib.

третий, очистите проект (команда shift-k).

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

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

} 

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

+0

Вам не нужно готовитьForSegue, не требуется выполнять сеанс вообще. Вы используете его только в том случае, если хотите выполнить некоторую настройку до того, как начнется пожар. – lkraider

1
sharedLogin = [[self alloc] init]; 

попробовать это

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

вы должны установить ИмяИдентификатор в раскадровке LoginViewController

2

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

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

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

+2

Вручную созданный viewControllers как в не загруженном из NIB не может подключиться к ресурсам NIB. Невозможно повторно использовать контроллеры представлений вне или внутри контекстной раскладки. Это путаница, единственный и единственный viewController, который вы загружаете из раскадровки, связан с его единственным и единственным видом. Не могу быть повторно использован, не может быть разделен. –

+0

У меня есть аналогичная проблема. Я использую метод Methode, который запускается «dispatch_async», откуда я пытаюсь использовать свой интерфейс: «ivo_login_ViewController * loginViewController = [[ivo_login_ViewController alloc] init]; loginViewController dataProgress: @« Assignments laden »count: count]; но мой пользовательский интерфейс никогда не обновляется, также я не могу запустить новый ViewController. Что мне нужно изменить, чтобы использовать правильный ресурс NIB? @удаленный пользователь – safari

Смежные вопросы