Выполнение перехода из другого класса

Я пытаюсь вызвать executeSegueWithIdentifier из другого класса, который является классом NSObject, и я получаю эту ошибку:

Завершение работы приложения из-за необработанного исключения "NSInvalidArgumentException", причина:

 'Receiver (<DerinlikView: 0x95b1ac0>) has no segue with identifier 'DerinlikToPali''

Мой код:

Класс1 (NSObject):

    DerinlikView *derinlik = [DerinlikView alloc];
    [derinlik performSegue];

Класс2 (UIViewController):

- (void) performSegue
{
    [self performSegueWithIdentifier:@"DerinlikToPali" sender:self];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ( [[segue identifier] isEqualToString:@"DerinlikToPali"]  )
    {
        Palinolojik *pali = segue.destinationViewController;
    }
}

person birdcage    schedule 18.03.2013    source источник
comment
просто подумал, проверили ли вы идентификатор в раскадровке, и это правильное написание для вашего идентификатора? Мне пришлось изменить свой комментарий, так как я был неправ в первом разделе. просто проверьте идентификатор в раскадровке и убедитесь, что он правильный.   -  person Adrian P    schedule 18.03.2013
comment
да, я пытаюсь перейти от класса NSObject к контроллеру представления. Я также пытался поместить его в класс NSObject, но это не сработало. Я поместил код перехода как есть в класс NSObject.   -  person birdcage    schedule 18.03.2013
comment
Вы проверили идентификатор, который соединяет класс контроллера представления со следующим представлением? идентификатор перехода может быть проблемой. а также в вашем методе перехода Palinolojik является местом назначения перехода, но в вашем классе объектов ns идентификатор связан с derinlikview. представление назначения должно быть одним из них, а не обоими.   -  person Adrian P    schedule 18.03.2013
comment
DerinlikView — это имя Class2. Я проверил соединения. Они в порядке. Если я звоню из Class2, это работает, но мне нужно выполнить переход из класса NSObject. На самом деле я ищу решение, которое позволит мне выполнить переход из класса NSObject. Я имею в виду от Class2 до Palinolojik.   -  person birdcage    schedule 18.03.2013
comment
поэтому вы говорите, что когда вы вызываете [self performSegue] в своем Class2, он выполняет переход, но когда вы вызываете тот же метод из другого класса, такого как [derinlik performSegue], он говорит has no segue with identifier 'DerinlikToPali'   -  person u.gen    schedule 18.03.2013
comment
Точно это правда..   -  person birdcage    schedule 18.03.2013
comment
это навигационное приложение?   -  person u.gen    schedule 18.03.2013
comment
да Я использую раскадровку и модальные переходы для навигации.   -  person birdcage    schedule 18.03.2013
comment
попробуйте обновить свой вопрос с помощью снимка экрана вашей раскадровки   -  person u.gen    schedule 18.03.2013
comment
здесь вы можете найти пример проекта, который демонстрирует мою проблему ссылка   -  person birdcage    schedule 18.03.2013


Ответы (3)


Я не верю, что в вашей раскадровке или ваших переходах нет ничего плохого.

Проблема должна быть в этой строке =

DerinlikView *derinlik = [DerinlikView alloc];

Когда вы выделяете новый указатель контроллера представления для вашего Class2, он не может найти переход, связанный с вашим представлением.

Решением было бы передать указатель вашего инициированного класса Class2 на класс NSObject.

в вашем class1.h:

@interface Class1 : NSObject
{
    Class2 *viewController;
}

@property (nonatomic,strong) Class2 *viewController;

в классе 1.м

@synthesize viewController;

[self.viewController performSegue];

В классе 2.м:

Class1 *callNsObject= [[Class1 alloc] init];
UIViewController *currentVC=self;//this is the part you need the pass current viewcontrollers pointer to your nsobject class depends on your project thee are multiple ways of doing it.
callNsObject.viewController=currentVC;

Важно: я не знаю иерархии вашего контроллера представления Class2, поэтому в строке UIViewController *currentVC=self; вы должны изменить self на указатель текущего контроллера представления.

Например, если это приложение, основанное на навигации, вы можете получить текущий контроллер представления, UIViewController *currentVC = self.navigationController.visibleViewController;

Также я предполагаю, что ваше представление Class2 помещается в стек, прежде чем вы вызовете свой метод Class1

person u.gen    schedule 18.03.2013
comment
Он не запускал метод PerformSegue в Class2. где я должен разместить этот код --› Class1 *callNsObject= [[Class1 alloc] init]; UIViewController *currentVC=self;//это часть, в которой вам нужно передать текущий указатель viewcontrollers на ваш класс nsobject, зависит от вашего проекта, есть несколько способов сделать это. callNsObject.viewController=currentVC; - person birdcage; 18.03.2013
comment
это пример, когда вы вызываете свой Class1 (NSObject) и передаете текущий указатель контроллера представления Class2 на ваш Class1. Вам нужно поместить его, прежде чем вызывать методы Class1 - person u.gen; 18.03.2013

У меня была такая же проблема, и мне удалось решить ее с помощью NSNotificationCenter.

В файле .m класса NSObject я добавил:

[[NSNotificationCenter defaultCenter] postNotificationName:@"performsegue"
                                                    object:nil];

В файле .m класса ViewController -

1. В -(void) viewDidLoad я добавил:

 [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(performsegueNotification:)
                                             name:@"performsegue"
                                           object:nil];

2. В -(void) viewDidUnload я добавил:

[[NSNotificationCenter defaultCenter] removeObserver:self];

3.Создал метод PerformsegueNotification:

-(void)performsegueNotification:(NSNotification *) notif
{

    [self performSegueWithIdentifier: @"PresentView" sender:self];

}
person user2327003    schedule 16.05.2013

В примечании к ошибке говорится, что «DerinlikToPali» не найден в StoryBoard.

Перейдите на свой StoryBoard, выберите переход и проверьте его инспектор атрибутов (меню «Вид» — «Утилиты» — «Показать инспектор атрибутов»). Убедитесь, что идентификатор — это та же строка, которую вы используете в PerformSegueWithIdentifier.

Обновление (после просмотра SampleProject):

  • SampleClass *sample = [SampleClass alloc] в общем случае должен быть "alloc init", чтобы вы не только выделяли память, но и выполняли полную инициализацию объекта.
  • Метод SampleClassToSegue() не создает объект ViewController, как вы ожидали. Сначала см. выше «alloc init», но в этом случае вам нужно больше (ниже). В противном случае у вас НЕ будет действительного объекта UIViewController. Обратите внимание, что вы должны сначала дать ему имя на StoryBoard, чтобы вы могли создать его (используя это имя). Альтернативой является использование XIB вместо StoryBoard, и в этом случае вы используете initWithNibName:bundle:

    ViewController *vc = [[UIStoryboard storyboardWithName:@"MainStoryboard_iPad" bundle:nil] instanceiateViewControllerWithIdentifier:@"viewController"];

  • Самая большая проблема логична, и я надеюсь, что это только внутри этого SampleProject: объект A создается, создает объект B, который создает объект A и вызывает его метод... за исключением того, что создание объекта A снова создает объект B --> и у нас есть вечный цикл, и что-то рухнет .

В любом случае, мой обновленный ответ заключается в том, что ваше создание объекта не было завершено до того, как вы попытались запустить переход. В частности, «ViewController» еще не был фактическим UIViewController, определенным в StoryBoard, и поэтому не имел ожидаемого перехода.

person JOM    schedule 18.03.2013
comment
Я знаю, что ты имеешь в виду, но это там. Когда я вызываю его из Class2, он работает. Но я пытаюсь вызвать один и тот же переход из другого класса. Это моя проблема.. - person birdcage; 18.03.2013