Возврат результата нажатия кнопки на UIAlertView в метод C ++ - PullRequest
0 голосов
/ 02 августа 2011

Мне нужно вызвать UIAlertView для отображения из файла C ++. В зависимости от нажатой кнопки, мне нужно вернуть bool самому классу C ++ (этот bool, в свою очередь, возвращается и используется в другом месте). Я хотел бы получить несколько советов о том, как вернуть результат в класс C ++. Я предположил, что мы не можем установить класс C ++ в качестве делегата для UIAlertView, поэтому мне нужно как-то передать, какая кнопка нажата в классе C ++.

Это пример вызова функции из C ++ (это класс C ++, но скомпилированный как Objective-C:

bool CPlatform::WarningMessage(const wchar_t* message)
{
    // Some functions to convert message to an NSString* wNSString

    MessagePopUp *message = [[MessagePopUp alloc] init];
    [message showPopUpWithMessage:wNSString];

    // This function should return true if OK is pressed, or False if Cancel is pressed.
}

Тогда у меня есть простой класс для отображения предупреждения

@interface MessagePopUp : NSObject <UIAlertViewDelegate> {
BOOL OKPressed;
}

- (void) showPopUpWithMessage:(NSString*)message;

@end

@implementation MessagePopUp

- (void) showPopUpWithMessage:(NSString*)message
{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Warning" message:message delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
    [alert show];
    [alert release];
}


- (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    // the user clicked one of the OK/Cancel buttons
    if (buttonIndex == 0)
    {
        NSLog(@"ok");
        OKPressed = true;

    }
    else
    {
        NSLog(@"cancel");
        OKPressed = false;
    }
}

@end

Можете ли вы порекомендовать способ возврата результата / OKPressed в функцию C ++?

Спасибо

Ответы [ 2 ]

1 голос
/ 02 августа 2011

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

Проблема заключается в цикле выполнения, и UIAlertView не блокирует для отображения alertView (т.е. после вызова [alert show]), вам необходимо вернуть управление iOS, что означает, что ваша функция C ++ bool CPlatform::WarningMessage(const wchar_t* message) должна вернитесь, пока не узнали, какая кнопка была нажата.

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

Лучше было бы пойти с потоком и определить обратный вызов в вашем классе C ++ CPlatform, который принимает OKPressed bool, который есть в вашем методе делегата clickedButtonAtIndex.

0 голосов
/ 02 августа 2011

Если вы можете смешивать два языка, тогда вы можете использовать концепцию объективного c, которая называется NSNotificationCenter.

Этот код добавляет слушателя к родителю класса "show the alert":

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(MethodYouWantToUseWhenClicked) 
                                             name:@"alertViewClicked" 
                                           object:showAlertClass];

Затем в классе просмотра предупреждений вы можете сделать следующее, чтобы отправить сообщение:

- (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
    // the user clicked one of the OK/Cancel buttons
    if (buttonIndex == 0)
    {
        // Not sure, but I think buttonIndex == 0 is actually cancel.
        NSLog(@"cancel");
        self.OKPressed = false;
        [[NSNotificationCenter defaultCenter] postNotificationName:@"alertViewClicked" 
                                                            object:self];
    } else {

        self.OKPressed = false;
        [[NSNotificationCenter defaultCenter] postNotificationName:@"alertViewClicked" 
                                                            object:self];
    }
}

Тогда вам просто нужно получить доступ к логическому свойству из вашего родительского класса / C ++.

...