Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: birdcageОтветов: 3

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

xcodeiossegue

Ответы

Ответ 1 · рейтинг 2 · u.gen

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

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

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

Ответ 2 · рейтинг 7 · user2327003

У меня была такая же проблема, и мне удалось решить ее с помощью 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];

}

Ответ 3 · JOM

В примечании к ошибке говорится, что "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, и поэтому не имел ожидаемого перехода.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы