ios : композиторът на sms съобщения не се показва

Имам UITableViewController, представящ списък с контакти, когато потребителят избере ред, той ще покаже UIActionSheet, за да поиска от потребителя действие (обаждане, изпращане на sms...).

Потребителят избира действие и този първи UIActionSheet ще покаже друг UIActionSheet, който съдържа телефонни номера.

Потребителят избира телефонен номер и това трябва да показва съставителя на SMS съобщение.

Проблемът е, че когато потребителят избере телефонен номер, изгледът за съставяне на съобщения не се показва (само черен екран) и получавам MessageComposeResultCancelled в didFinishWithResult на MFMessageComposeViewController.

Което генерира това предупреждение „Предупреждение: Опит за отхвърляне от контролера за преглед, докато се изпълнява презентация или отхвърляне!“

Как мога правилно да се обадя и да покажа съставителя на SMS съобщения?

(това работи перфектно, ако го извикам директно, когато потребителят избере ред в списъка с didSelectRowAtIndexPath)

Ето малко код:

1- извикване на първия UIActionSheet в метода didSelectRowAtIndexPath:

UIActionSheet *popupQuery;
...
[popupQuery showInView:self.view];

2- извикване на втори UIActionSheet в clickedButtonAtIndex метод:

UIActionSheet *popupQuery2;
...
[popupQuery showInView:self.view];

3- от същия метод, повикване към съставител на съобщения:

[self sendSMS:@"" recipientList:[phoneNumbers objectAtIndex:buttonIndex]];

методът, който показва съставителя на съобщения:

    (void)sendSMS:(NSString *)bodyOfMessage recipientList:(NSArray *)recipients
{
    MFMessageComposeViewController *controller = [[MFMessageComposeViewController alloc] init];
    if([MFMessageComposeViewController canSendText])
    {
        controller.body = bodyOfMessage;
        controller.recipients = recipients;
        controller.messageComposeDelegate = self;

        [self presentModalViewController:controller animated:YES];
    }
}

person dzk    schedule 13.03.2013    source източник
comment
Можете ли да публикувате част от кода за това как показвате/отхвърляте вашите контролери за изглед? Както можете да видите от съобщението за грешка, има проблем с начина, по който са представени/отхвърлени.   -  person Petar    schedule 13.03.2013
comment
Това случва ли се на действително iDevice или току-що е тествано на симулатора? canSendText Връща булева стойност, показваща дали текущото устройство може да изпраща текстови съобщения. Въпреки това canSendText може да върне true в симулатора, тъй като може да имате инсталирано приложението за съобщения на вашия Mac (вижте допълнителен въпрос mby .me/Gw)   -  person Dan Clarke    schedule 13.03.2013
comment
Тествам на iphone 5   -  person dzk    schedule 13.03.2013


Отговори (2)


решение, намерено тук: MFMessageComposeViewController показва празен/бял екран

    controller.recipients = [NSArray arrayWithObject:theRecipients];

theRecipients беше масив, съдържащ само един елемент (избраният телефонен номер)

person dzk    schedule 18.03.2013

Тъй като не искате да опитвате да показвате две модални контроли едновременно, използвайте actionSheet:didDismissWithButtonIndex: делегиран метод, така че листът с действия да бъде скрит, когато започнете да показвате контролера за съобщения.

Следният код показва композитор, който не се отменя автоматично. Мога да видя 0 в log, което е стойността на MessageComposeResultCancelled, само когато натисна бутона Cancel. Опитвате ли се да направите хак чрез автоматично натискане на бутона send?

композитор от делегат на лист с действия

MFMessageComposeViewController.h

enum MessageComposeResult {
    MessageComposeResultCancelled, //0
    MessageComposeResultSent,      //1
    MessageComposeResultFailed     //2
};

MyViewController.m

-(IBAction)onButtonPressed:(id)sender {
    UIActionSheet * sheet = [[UIActionSheet alloc] initWithTitle:@"Title"
                                                        delegate:self
                                               cancelButtonTitle:@"Go out"
                                          destructiveButtonTitle:@"Show message composer"
                                               otherButtonTitles:nil, nil];
    [sheet showInView:self.view];
}

-(void) actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex {
    MFMessageComposeViewController *controller = [[MFMessageComposeViewController alloc] init];
    if([MFMessageComposeViewController canSendText])
    {
        controller.body = @"body";
//        controller.recipients = recipients;
        controller.messageComposeDelegate = self;

        [self presentModalViewController:controller animated:YES];
    }
}

-(void) messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result {
    NSLog(@"%d", result);
    [controller dismissModalViewControllerAnimated:YES];
}
person A-Live    schedule 13.03.2013
comment
работата е там, че приложението получава MessageComposeResultCancelled точно след извикване на съставителя на съобщения - person dzk; 13.03.2013
comment
@dzk Случва ли се, когато показваш композитор от actionSheet:didDismissWithButtonIndex:? - person A-Live; 13.03.2013
comment
да, вместо да показва съставителя на съобщения, той показва празен екран като този img594.imageshack. us/img594/7624/screenshot20130302at931.png - person dzk; 13.03.2013
comment
@dzk актуализира отговора с доказателство за концепцията. Моля, споделете вашия метод на делегиране. - person A-Live; 13.03.2013
comment
Използвам код, подобен на този на A-Live. Не, не се опитвам да симулирам действието за изпращане. Просто показвам автора на съобщението. Понякога в регистрационните файлове имам и това съобщение: - init Error Domain=_UIViewServiceInterfaceErrorDomain Code=3 Операцията не може да бъде завършена. (_UIViewServiceInterfaceErrorDomain грешка 3.) - Контролерът за отдалечено композиране изтече (НЕ)! - person dzk; 13.03.2013
comment
Правя го от UITableViewController. Ако в същия файл преместя кода в табличния изглед didSelectRowAtIndexPath, той работи перфектно - person dzk; 13.03.2013
comment
решение, намерено тук: stackoverflow.com/questions/15138497/ - person dzk; 18.03.2013
comment
@dzk Интересно, може да искате да подадете сигнал за грешка. - person A-Live; 18.03.2013