簡體   English   中英

有時無法以編程方式創建的UIButton觸發按鈕單擊事件

[英]Button click event not firing sometimes for programmatically created UIButton

我已經從情節UIScrollView添加了UIScrollView ,並且在該滾動視圖中有另一個UIView作為容器視圖。 UIScrollView后面,我也有一個UIImageView作為同級。 這是我的View層次結構。

在此處輸入圖片說明

現在,我以編程方式將視圖添加到此容器視圖中。

-(void)setUI
   {
      int i;
      for ( i=0; i<[array count]; i++) {

      NSLog(@"Object at index %i  %@",i,[array objectAtIndex:i]);

      UIView *view=[self GetAlertView:i];

    [self.contentView addSubview:view];
    float sizeOfContent = 0;

    if (notY+viewParent.frame.size.height>self.contentView.frame.size.height) {
        CGRect frame=self.contentView.frame;
        frame.size.height=notY;
        self.contentView.frame=frame;
    }



    self.mainScroll.contentSize = self.contentView.frame.size;


}

這就是我生成視圖的方式。

-(UIView *)GetAlertView :(int)index
     {
       viewParent=[[UIView alloc] initWithFrame:CGRectMake(10, notY,     self.view.frame.size.width-20, 100)];
[viewParent setBackgroundColor:[UIColor clearColor]];
[viewParent setUserInteractionEnabled:YES];


UIImageView *backImage=[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, viewParent.frame.size.width, viewParent.frame.size.height)];
[backImage setImage:[UIImage imageNamed:@"AlertBack"]];


//-------TITLE LABEL--------------

UILabel *lblTitle=[[UILabel alloc] initWithFrame:CGRectMake(20, 20, viewParent.frame.size.width-60, 30)];

[lblTitle setText:[[[array objectAtIndex:index] objectForKey:@"Info"] valueForKey:@"Headline"]];
[lblTitle setFont:[UIFont fontWithName:@"HelveticaNeue-Bold" size:15]];
[lblTitle setTextAlignment:NSTextAlignmentLeft];
[lblTitle setTextColor:[UIColor whiteColor]];

//-------ICON IMAGE------------

UIImageView *imgIco=[[UIImageView alloc] initWithFrame:CGRectMake(lblTitle.frame.origin.x+lblTitle.frame.size.width, 20, 30, 30)];

NSString *imgUrl=[[[[array objectAtIndex:index] objectForKey:@"Info"] objectForKey:@"Resource"] valueForKey:@"Uri"];
if([[array objectAtIndex:index] valueForKey:@"Realimg"]!=nil)
{
    [imgIco setImage:[[array objectAtIndex:index] valueForKey:@"Realimg"]];
}
else
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSURL *imageURL = [NSURL URLWithString:imgUrl];
        NSData *imageData = [NSData dataWithContentsOfURL:imageURL];
        UIImage *image = [UIImage imageWithData:imageData];
        dispatch_async(dispatch_get_main_queue(), ^{
            if(image!=nil){
                @try {
                    NSMutableDictionary *objectDict=[[NSMutableDictionary alloc] initWithDictionary:[[array objectAtIndex:index] mutableCopy]];
                    [objectDict setObject:image forKey:@"Realimg"];
                    [array replaceObjectAtIndex:index withObject:objectDict];

                }
                @catch (NSException *exception) {

                }
                @finally {

                }

            }

            [imgIco setImage:image];

        });
    });

}


UILabel *lblMessage=[[UILabel alloc] initWithFrame:CGRectMake(20, lblTitle.frame.origin.y+lblTitle.frame.size.height+10, viewParent.frame.size.width-40, 10)];
[lblMessage setUserInteractionEnabled:NO];

[lblMessage setNumberOfLines:0];
CGSize maximumLabelSize = CGSizeMake(viewParent.frame.size.width-40, FLT_MAX);
NSString *strDescript=[[[array objectAtIndex:index] objectForKey:@"Info"]valueForKey:@"Description"];


[lblMessage setText:strDescript];
[lblMessage setFont:[UIFont fontWithName:@"HelveticaNeue" size:14]];

CGSize expectedLabelSize = [strDescript sizeWithFont:lblMessage.font constrainedToSize:maximumLabelSize lineBreakMode:lblMessage.lineBreakMode];
//adjust the label the the new height.
CGRect newFrame = lblMessage.frame;
newFrame.size.height = expectedLabelSize.height;
lblMessage.frame = newFrame;
if (lblMessage.frame.size.height>10) {
    float extendedH=lblMessage.frame.size.height-10;


    CGRect newFrameMsg = viewParent.frame;
    newFrameMsg.size.height = viewParent.frame.size.height+extendedH;
    viewParent.frame = newFrameMsg;

    CGRect newImgFrame=backImage.frame;
    newImgFrame.size.height=backImage.frame.size.height+extendedH;
    backImage.frame=newImgFrame;

}

[lblMessage setTextColor:[UIColor whiteColor]];

NSLog(@"Circle %lu",[[[[[array objectAtIndex:index] objectForKey:@"Info"] objectForKey:@"Area"] objectForKey:@"Circle"] count]);
int circleCount=[[[[[array objectAtIndex:index] objectForKey:@"Info"] objectForKey:@"Area"] objectForKey:@"Circle"] count];

NSLog(@"Geocode %@",[[[[array objectAtIndex:index] objectForKey:@"Info"] objectForKey:@"Area"] objectForKey:@"Geocode"]);
NSString *strGeoCod=[[[[array objectAtIndex:index] objectForKey:@"Info"] objectForKey:@"Area"] objectForKey:@"Geocode"];

NSLog(@"Polygon %lu",[[[[[array objectAtIndex:index] objectForKey:@"Info"] objectForKey:@"Area"] objectForKey:@"Polygon"] count]);
int polygonCount=[[[[[array objectAtIndex:index] objectForKey:@"Info"] objectForKey:@"Area"] objectForKey:@"Polygon"] count];

UIImageView *imgEvac;
UIButton *btnEvac;


if (circleCount!=0 || [strGeoCod length]!=0 || polygonCount!=0) {
    //----------EVACUATE IMAGE---------------
    imgEvac=[[UIImageView alloc] initWithFrame:CGRectMake(20, lblMessage.frame.origin.y+lblMessage.frame.size.height+5, 20, 30)];
    [imgEvac setUserInteractionEnabled:NO];
    imgEvac.animationImages=[NSArray arrayWithObjects:[UIImage imageNamed:@"Evac1"],
                             [UIImage imageNamed:@"Evac2"],
                             [UIImage imageNamed:@"Evac3"],
                             [UIImage imageNamed:@"Evac4"],
                             [UIImage imageNamed:@"Evac5"],
                             [UIImage imageNamed:@"Evac6"],
                             [UIImage imageNamed:@"Evac7"],
                             [UIImage imageNamed:@"Evac8"],
                             [UIImage imageNamed:@"Evac9"],
                             [UIImage imageNamed:@"Evac10"],
                             [UIImage imageNamed:@"Evac11"],
                             [UIImage imageNamed:@"Evac12"],
                             [UIImage imageNamed:@"Evac13"],
                             [UIImage imageNamed:@"Evac14"],nil];
    imgEvac.animationDuration = 1.0f;
    imgEvac.animationRepeatCount = 0;
    [imgEvac startAnimating];



    //----------EVACUATE BUTTON-------------
    btnEvac=[UIButton buttonWithType:UIButtonTypeCustom] ;
    [btnEvac setTitle:@"Evacuate" forState:UIControlStateNormal];
    [btnEvac setTitleColor:[UIColor greenColor] forState:UIControlStateNormal];
    [btnEvac addTarget:self action:@selector(EvacuateClick:) forControlEvents:UIControlEventTouchUpInside];

    btnEvac.frame=CGRectMake(imgEvac.frame.origin.x+imgEvac.frame.size.width+5, lblMessage.frame.origin.y+lblMessage.frame.size.height+5, 75, 30);






    intlbldateX=btnEvac.frame.origin.x+btnEvac.frame.size.width;

}

else
{
    intlbldateX=20;
}





//----------DATE LABEL------------------
UILabel *lblDate=[[UILabel alloc] initWithFrame:CGRectMake(intlbldateX, lblMessage.frame.origin.y+lblMessage.frame.size.height+5, viewParent.frame.size.width-(intlbldateX+10), 30)];
[lblDate setUserInteractionEnabled:NO];
[lblDate setBackgroundColor:[UIColor redColor]];
[lblDate setText:[[array objectAtIndex:index]valueForKey:@"Sent"]];
[lblDate setFont:[UIFont fontWithName:@"HelveticaNeue-Bold" size:15]];
[lblDate setTextAlignment:NSTextAlignmentRight];
[lblDate setTextColor:[UIColor whiteColor]];

CGRect newFrame2=viewParent.frame;
newFrame2.size.height=viewParent.frame.size.height+10;
viewParent.frame=newFrame2;

CGRect newImgFrame2=backImage.frame;
newImgFrame2.size.height=backImage.frame.size.height+10;
backImage.frame=newImgFrame2;

// ---------垂直線--------------

UIView *vwVerticle=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, viewParent.frame.size.height)];
[vwVerticle setUserInteractionEnabled:NO];
[vwVerticle setBackgroundColor:[self colorWithHexString:[[[[[array objectAtIndex:index]objectForKey:@"Info"] objectForKey:@"Resource"] valueForKey:@"ColorCode"] stringByReplacingOccurrencesOfString:@"#" withString:@""]]];

[viewParent addSubview:backImage];
[viewParent addSubview:lblTitle];
[viewParent addSubview:imgIco];
[viewParent addSubview:lblMessage];
[viewParent addSubview:imgEvac];

[viewParent addSubview:lblDate];
[viewParent addSubview:vwVerticle];
[viewParent addSubview:btnEvac];


notY=viewParent.frame.origin.y+viewParent.frame.size.height+20;


return viewParent;

}

但是我的問題是btnEvac不可點擊。 但是有時我只能單擊一次。 這是我的按鈕單擊事件。

-(IBAction)EvacuateClick :(UIButton *)sender
  {
     NSLog(@"Evacuate clicked");
  }

有時這是第一次出現。 在那之后什么都沒有發生。 我不知道是什么原因。我也將滾動和容器視圖的用戶交互設置為“啟用”。 但不是初始圖像視圖。 我希望我也不想這樣做。 請幫我。

謝謝

這就是我將更多視圖加載到底部的方式

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
float bottomEdge = self.mainScroll.contentOffset.y + self.mainScroll.frame.size.height;
if (bottomEdge >= self.mainScroll.contentSize.height) {
    // we are at the end

    //[self performSelectorInBackground:@selector(callscrol) withObject:nil];
    [self callscrol];
}

}

-(void)callscrol

{

if(!loading&& !resNull)
{
    float offs = (self.mainScroll.contentOffset.y+self.mainScroll.bounds.size.height);
    float val = (self.mainScroll.contentSize.height);
    if (offs==val)
    {
        loading=YES;
        start_rec+=1;

        [self performSelectorInBackground:@selector(LoadData) withObject:nil];

    }
}

}

並從服務器獲取更多數據

-(void)LoadData

{

[self.actind startAnimating];
[self.actind setHidden:NO];
loading=YES;

NSString *serverURL =  [[[NSBundle mainBundle] infoDictionary] objectForKey:@"BaseURL"];
NSString *queryString=[NSString stringWithFormat:@"GetDisasterAlertsJson?authCode=%@&lastUpdated=%@&version=%@&langId=%@&pageNo=%@&noOfMessages=%@",dm.strAuthCode,lastUpdate,@"1.0",@"1",[NSString stringWithFormat:@"%i",start_rec],@"5"];
NSString *urlString=[NSString stringWithFormat:@"%@%@",serverURL,queryString];
// Create the request.
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];
// Create url connection and fire request
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
    if (!data) {
        NSLog(@"%s: sendAynchronousRequest error: %@", __FUNCTION__, connectionError);
        return;
    } else if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
        NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode];
        if (statusCode != 200) {
            NSLog(@"%s: sendAsynchronousRequest status code != 200: response = %@", __FUNCTION__, response);
            return;
        }
    }

    NSError *parseError = nil;
    NSData *dataXMLRemoved=[self ReplaceXMLData:data];
    NSLog(@"======= Data XML Removed ======== %@",dataXMLRemoved);
    dictionary = [NSJSONSerialization JSONObjectWithData:dataXMLRemoved options:NSJSONReadingAllowFragments error:&parseError];

    if (!dictionary) {
        NSLog(@"%s: JSONObjectWithData error: %@; data = %@", __FUNCTION__, parseError, [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
        resNull=NO;
        return;
    }


    // now you can use your `dictionary` object

    else
    {
        NSLog(@"JSON Dictionary================ %@",dictionary);
        array=[dictionary objectForKey:@"Cmessage"];
        NSLog(@"Array ####### %@",array);
        resNull=NO;
        loading=NO;
        [self.actind stopAnimating];
        [self.actind setHidden:YES];
        [self setUI];


    }
}];

}

我不確定這是否是您的問題,但是默認情況下,UIScrollViews會延遲從篩選到嵌入視圖的接觸,以提高滾動性能。 這可能看起來好像並不是每次都觸發按鈕,而實際上僅需要一秒鍾的時間,觸摸事件就會在嵌入式視圖上觸發。

嘗試在滾動視圖上關閉此設置。

self.mainScroll.delaysContentTouches = NO;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM