2013-03-12 2 views
1

Я хочу создать функцию, которая будет отображать UIActionSheet, ждать, пока пользователь нажмет кнопку, а затем вернуть кнопку нажатойКак не ждать, пока кнопка делегат называется

@interface UIActionSheetHandler() <UIActionSheetDelegate> 

@end 
@implementation UIActionSheetHandler 


-(NSInteger) buttonIndexWithMessage:(NSString *) title andArrayOfOptions:(NSArray *) options 
{ 

    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:title 
                  delegate:self 
                cancelButtonTitle:nil 
               destructiveButtonTitle:nil 
                otherButtonTitles:nil]; 

    for (NSString * strOption in options) { 
     [actionSheet addButtonWithTitle:strOption]; 
    } 

    [actionSheet showInView:[BGMDApplicationsPointers window]]; 

    //Wait till delegate is called. 
    return 0;//I want to return buttonIndex here. 
} 

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    //What should I put it here 
} 
@end 

Как сделать // Подождите, пока делегат призван ждать? О, да, я не хочу, чтобы главный поток подождал, но я думаю, что смогу решить эту проблему.

+1

И почему вы хотите это сделать? Индекс кнопки будет передан при нажатии кнопки – giorashc

+0

Поскольку у меня уже есть функция, которая ждет индекса кнопки. Легче программировать этот стиль. –

+0

Помните, если я не согласен :) ... – giorashc

ответ

1

Это один работает

self.operation=[NSOperationQueue new]; //These four line is necessary to suspend the whole thread. 
self.operation.suspended=true; //Okay make t 
[self.operation addOperationWithBlock:^{}]; 
[self.operation waitUntilAllOperationsAreFinished];//Don't get out of the function till user act. 

Затем на делегат

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    self.buttonIndex=buttonIndex; 
    self.operation.suspended=false; 
} 

Примечание: Я до сих пор ищет более элегантное решение.

+0

Я попытался использовать ваш код выше. Но мой основной поток постоянно останавливался для ожидания функции делегата. Моя функция делегата предназначена для GCDAsyncSocket. –

2

Я думаю, вы неправильно поняли концепцию делегата. Нельзя вернуть кнопку нажатой от buttonIndexWithMessage:andArrayOfOptions:

На самом деле, UIActionSheet даже не будет виден в этот момент времени.

После нажатия кнопки, команда UIActionSheet будет вызывать метод вашего делегата actionSheet:clickedButtonAtIndex:.

Итак, где вы положили //What should I put it here there, вам передается указатель кнопки, которая была нажата. Там вы можете реагировать на соответствующую кнопку. .: например

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    NSLog (@"Button pressed with index: %d", buttonIndex); 
} 
+0

Мне хорошо известно о концепции делегата. Я просто хочу использовать его по-другому. –

+0

Ах. Затем дайте нам знать результаты. Возможно, вы захотите реализовать свое собственное представление. –

Смежные вопросы