
[英]IPHONE: UIAlertView called twice in a custom function/IBAction
[英]UIAlertView getting called Twice in iPhone [duplicate]
我是iPhone新手,
长按Button时会显示Alert,但是长按Button时会再次调用我的警报视图。
这是我的代码段,
- (IBAction)longPressDetected:(UIGestureRecognizer *)gestureRecognizer {
//Gets text of Button.
UIButton *btn = (UIButton *)[gestureRecognizer view];
BtnText= [btn titleForState:UIControlStateNormal];
NSLog(@"longPressDetected");
UIAlertView* alert_view = [[UIAlertView alloc]
initWithTitle: @"Are you sure want to Delete ?" message:nil delegate: self
cancelButtonTitle: @"Yes" otherButtonTitles: @"No", nil];
[alert_view show];
[alert_view release];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex==0) {
[self ReloadView];
[alertView dismissWithClickedButtonIndex:0 animated:TRUE];
}
else{
[alertView dismissWithClickedButtonIndex:1 animated:TRUE];
}
}
任何帮助将不胜感激。
编辑:
-(void)viewWillAppear:(BOOL)animated
{
for(int i=0;i<10i++)
{
if(i!=0)
{
if (i%4==0)
{
ypos+=180;
xpos=30;
}
else
{
xpos+=200;
}
}
button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(xpos, ypos, 120,130);
[button setBackgroundImage:[UIImage imageNamed:@"ibook2.png"] forState:UIControlStateNormal];
[button setTitle:[NSString stringWithFormat:@"%@", [Downloadedepubs objectAtIndex:i]] forState:UIControlStateNormal];
[button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
LongPress = [[UILongPressGestureRecognizer alloc] init];
[LongPress addTarget:self action:@selector(longPressDetected:)];
LongPress.delegate = (id<UIGestureRecognizerDelegate>)self;
[button addGestureRecognizer:LongPress];
[self.view addSubview:button];
[LongPress release];
}
}
UILongPressGestureRecognizer
是一个长事件过程。 请检查事件状态是否已经开始,完成等。
- (IBAction)longPressDetected:(UIGestureRecognizer *)gestureRecognizer {
if (gestureRecognizer.state == UIGestureRecognizerStateBegan){
NSLog(@"Long press began");
} else if ( gestureRecognizer.state == UIGestureRecognizerStateRecognized ) {
NSLog(@"Long press UIGestureRecognizerStateRecognized");
}
else if (gestureRecognizer.state == UIGestureRecognizerStateEnded) {
NSLog(@"Long press Ended");
}
else {
NSLog(@"Long press detected.");
}
}
我认为,最好在您的情况下使用UIGestureRecognizerStateBegan状态。
请修改您的longPressDetected()
为
-(IBAction)longPressDetected:(UIGestureRecognizer *)gestureRecognizer {
if (gestureRecognizer.state == UIGestureRecognizerStateBegan){
UIButton *btn = (UIButton *)[gestureRecognizer view];
BtnText= [btn titleForState:UIControlStateNormal];
NSLog(@"longPressDetected");
UIAlertView* alert_view = [[UIAlertView alloc] initWithTitle: @"Are you sure want to Delete ?" message:nil delegate: self cancelButtonTitle: @"Yes" otherButtonTitles: @"No", nil];
[alert_view show];
[alert_view release];
alert_view = nil;
}
}
请检查以下所有UIGestureRecognizerStates
UIGestureRecognizerStatePossible, // the recognizer has not yet recognized its gesture, but may be evaluating touch events. this is the default state
UIGestureRecognizerStateBegan, // the recognizer has received touches recognized as the gesture. the action method will be called at the next turn of the run loop
UIGestureRecognizerStateChanged, // the recognizer has received touches recognized as a change to the gesture. the action method will be called at the next turn of the run loop
UIGestureRecognizerStateEnded, // the recognizer has received touches recognized as the end of the gesture. the action method will be called at the next turn of the run loop and the recognizer will be reset to UIGestureRecognizerStatePossible
UIGestureRecognizerStateCancelled, // the recognizer has received touches resulting in the cancellation of the gesture. the action method will be called at the next turn of the run loop. the recognizer will be reset to UIGestureRecognizerStatePossible
UIGestureRecognizerStateFailed, // the recognizer has received a touch sequence that can not be recognized as the gesture. the action method will not be called and the recognizer will be reset to UIGestureRecognizerStatePossible
// Discrete Gestures – gesture recognizers that recognize a discrete event but do not report changes (for example, a tap) do not transition through the Began and Changed states and can not fail or be cancelled
UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded // the recognizer has received touches recognized as the gesture. the action method will be called at the next turn of the run loop and the recognizer will be reset to UIGestureRecognizerStatePossible
您甚至可以无需输入UILongPressGestureRecognizer详细信息即可执行一些简单的操作来解决此问题。 定义一个BOOL isShowingAlertView
。 调用[alertView show]
,设置isShowingAlertView = YES
,而关闭它时,则设置isShowingAlertView = NO
。 在调用之前,您只需要检查: if (isShowingAlertView == NO)
,则只有它显示:
-(void)viewDidLoad
{
[super viewDidLoad];
isShowingAlert = NO;
}
- (IBAction)longPressDetected:(UIGestureRecognizer *)gestureRecognizer {
if (isShowingAlert == NO)
{
isShowingAlert = YES;
//Gets text of Button.
UIButton *btn = (UIButton *)[gestureRecognizer view];
BtnText= [btn titleForState:UIControlStateNormal];
NSLog(@"longPressDetected");
UIAlertView* alert_view = [[UIAlertView alloc]
initWithTitle: @"Are you sure want to Delete ?" message:nil delegate: self
cancelButtonTitle: @"Yes" otherButtonTitles: @"No", nil];
[alert_view show];
[alert_view release];
}
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
isShowingAlert = NO;
if (buttonIndex==0)
{
[self ReloadView];
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.