-2

I am using jailbroken iPhone on iOS 6

I am trying to return BOOL value only after pressing an UIAlertView

%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
4

2 回答 2

3

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

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

于 2013-07-22T17:52:42.070 回答
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. 
}
于 2013-07-22T17:55:09.010 回答