我在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
答案 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.
}