在UIAlertView之后返回BOOL

时间:2013-07-22 17:48:24

标签: objective-c cocoa-touch uialertview

我在iOS 6上使用越狱iPhone

我只是在按下UIAlertView

后才尝试返回BOOL值
%hook foo 
-(void)foo
{
   NSLog (@"foo");             
   UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"alertview"
                 message:@"alert"
                 delegate:self
                 cancelButtonTitle:@"Cancel"
                 otherButtonTitles:@"OK", nil];

   [alertView show];
   [alertView release];   

   if ( button OK )  //  only if button OK 
      %orig;
   }
   %new(v@:@@)
   +(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
  if ((buttonIndex == 1) {
         return true;
  }
}
%end

2 个答案:

答案 0 :(得分:3)

这不是用户输入在iOS中的工作方式。当你拨打[alertView show]时,它所做的就是向UIKit发出信号,当它下次更新屏幕时,警报视图应该是可见的。它不会显示警报视图本身,也不会等待用户按某事。它设置一个标志,然后立即返回。警报视图仅在代码返回并且UIKit更新屏幕后显示。

您的if ( button OK )语句在显示警报视图之前运行。此时无法将代码置于对用户输入的反应中。放置它的正确位置是委托方法alertView:clickedButtonAtIndex:

答案 1 :(得分:2)

逐步使用AlertView Delegates(正确):

请务必委托自己,并在.h头文件中设置UIAlertViewDelegate。

然后从您的操作或viewDidLoad或以下任何位置初始化您的警报视图:

 [[[UIAlertView alloc] initWithTitle:@"Alert Title" message:@"Select yes or no" delegate:self  cancelButtonTitle:@"Yes" otherButtonTitles:@"No", nil] show];

处理来自自我委派的警报,如下所示:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
      //this would be the yes button or cancel
      if (buttonIndex == 0){
        //set variable to false or user press cancel
       }
      if (buttonIndex == 1){
        //set variable to true or user press OK
       }
      // buttonIndex would by 1,2,3,4 depending on the number of otherButtons you have. Of course I'd suggest putting this into a case statement, instead of a mess of if thens. 
}