Нераспознанный селектор отправлен в экземпляр ошибки из представления контроллера навигации служебного приложения

У меня есть служебное приложение. Я реализовал этот код на оборотной стороне, который вызывает представление обратной связи для отправки электронного письма, например, руководство. Это работает, но затем, когда я нажимаю кнопку UIButton «Отправить отзыв», мое приложение сразу же вылетает с ошибкой *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIViewController sendMail]: unrecognized selector sent to instance 0x89c1960'..

Я проверил эти вещи:

Я правильно объявил делегат и реализовал его для MailComposer.

Мой метод sendMail связан с событием TouchUp для кнопки.

Мои имена методов совпадают:

- (IBAction)sendMail;

и

- (IBAction)sendMail 
{
if ([MFMailComposeViewController canSendMail]) 
{
    MFMailComposeViewController *mfViewController = [[MFMailComposeViewController alloc] init];
    mfViewController.mailComposeDelegate = self;

    [self presentModalViewController:mfViewController animated:YES];

}
else 
{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Status:" message:@"Your phone is not currently configured to send mail." delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil];

    [alert show];
}

}

Код не попадает в этот метод, потому что у меня установлена ​​точка останова в верхней части реализации метода, но она не вызывается. Также не активировалась точка останова в ViewDidLoad.

Если внимательно посмотреть на эту ошибку:

reason: '-[UIViewController sendMail]: unrecognized selector sent to instance 

кажется, что ожидается контроллер представления с именем sendMail, а не метод. Я прочитал этот сообщение, которое кажется очень похожим, но я не вижу никаких других имен контроллеров представления. в раскрывающемся списке xib Identity. Я думаю, что это часть моей проблемы, но я не уверен, как это исправить.

Может быть, я должен представлять MFMailComposer через контроллер просмотра? Если да, то я не уверен, как это сделать.

Мы ценим любые предложения.


person Jazzmine    schedule 06.12.2011    source источник


Ответы (1)


Вы неправильно назначили тип UIViewController своему пользовательскому контроллеру представления. Вы должны выбрать тип класса, который фактически применяется к вашему пользовательскому контроллеру представления (тот, который содержит реализацию метода sendMail).

Проблема с вашим кодом/настройкой заключается в том, что ваш настраиваемый контроллер представления создается с типом UIViewController. Но UIViewController не реализует никакого метода с именем sendMail, поэтому вы получаете исключение.

Поскольку вы не указываете имя класса вашего пользовательского контроллера представления, я просто приму его ради этого ответа; MyCustomViewController

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

введите здесь описание изображения

РЕДАКТИРОВАТЬ

Из ваших комментариев я вижу, что вы фактически создаете экземпляр контроллера представления с помощью кода. В этом случае замените свой путь следующим:

MyCustomViewController *controller = [[MyCustomViewController alloc] initWithNibName:@"ExMobSendFeedback" bundle:nil]; 
controller.title = @"Feedback"; 
[self.navigationController pushViewController:controller animated:YES];
[controller release];
person Till    schedule 06.12.2011
comment
Да, я использую IB для настройки всего. Я не вижу имя моего контроллера просмотра (XMSendMail) в списке классов пользовательских классов на вкладке «Идентификация», пока мое представление выделено. Есть ли что-то еще, что я должен сделать, чтобы получить список контроллеров просмотра? Кстати, я создал контроллер просмотра XMSendMail, добавив новые файлы. Спасибо - person Jazzmine; 06.12.2011
comment
Просто введите его в поле «Класс» в разделе «Пользовательский класс». - person Till; 06.12.2011
comment
Это не сработало, он запищал и не принял имя. Контроллер представления создается программно следующим образом: UIViewController *controller = [[UIViewController alloc] initWithNibName:@ExMobSendFeedback bundle:nil]; так что, может быть, поэтому он не отображается в списке классов. Однако файлы (.h, .m, .xib) уже существуют. Кстати, спасибо, что работали со мной над этим. controller.title = @Обратная связь; [self.navigationController pushViewController: анимированный контроллер: YES]; - person Jazzmine; 06.12.2011
comment
Ок прогресс. Я взял вашу модификацию и изменил ее в программе и импортировал для нее заголовочный файл, и это не выдало никаких ошибок. Однако я заметил, что имя контроллера представления по-прежнему не отображается в списке классов. Именно тогда я заметил, что на самом деле у меня нет контроллера представления в моем списке объектов в xib, только представление и кнопка. Поэтому я добавил вьюконтроллер, увидел там имя ExMobSendMail и запустил приложение. Это сработало как чемпион - Спасибо за вашу помощь. - person Jazzmine; 06.12.2011