rootのvc
- (void)rblg{ int i; for(i=0;i<[rposArr count];i++){ if([[rposArr objectAtIndex:i]isEqual:[NSNull null]]){ [rposArr replaceObjectAtIndex:i withObject:@"used"];break; } } rblk=[[ReblogLike alloc]initWithFrame:CGRectMake(0,(sh-16)/2+i*16,sw,16) rorl:@"reblog" rid:[idArr objectAtIndex:now-1] rkey:[rblgkArr objectAtIndex:now-1] rpos:i num:now type:[typeArr objectAtIndex:now-1] cons:_consumer token:_accessToken url:[NSURL URLWithString:[NSString stringWithFormat:@"http://api.tumblr.com/v2/blog/%@.tumblr.com/post/reblog",shtname]]]; rblk.delegate=self; [self.view addSubview:rblk]; } -(void)rposReset:(int)rpos{ [rposArr replaceObjectAtIndex:rpos withObject:[NSNull null]]; }ReblogLike.h
@protocol ReblogLikeDelegateReblogLike.m-(void)rposReset:(int)rpos; @end @interface ReblogLike : UIImageView{ int rpos; id delegate; } @property(strong,nonatomic)id delegate; - (id)initWithFrame:(CGRect)frame rorl:(NSString *)rorl rid:(NSNumber *)rid rkey:(NSString *)rkey rpos:(int)rpos_ num:(int)num type:(NSString *)type cons:(OAConsumer *)cons token:(OAToken *)token url:(NSURL *)url; @end
- (id)initWithFrame:(CGRect)frame rorl:(NSString *)rorl rid:(NSNumber *)rid rkey:(NSString *)rkey rpos:(int)rpos_ num:(int)num type:(NSString *)type cons:(OAConsumer *)cons token:(OAToken *)token url:(NSURL *)url { self = [super initWithFrame:frame]; if (self) { // Initialization code sw=self.bounds.size.width,sh=self.bounds.size.height; rpos=rpos_; self.image=[UIImage imageNamed:@"img_black"];self.autoresizingMask=15; UIView *rBase=[[UIView alloc]initWithFrame:CGRectMake(0,0,sw,16)];rBase.autoresizingMask=13; title=[[UILabel alloc]init]; title.text=[NSString stringWithFormat:[rorl isEqual:@"reblog"]?@"REBLOG-ing...":@"LIK-ing..."]; title.font=sf(13);title.textColor=[UIColor whiteColor];title.backgroundColor=[UIColor clearColor]; CGFloat titlewidth=[title.text sizeWithFont:title.font constrainedToSize:CGSizeMake(sw,15) lineBreakMode:UILineBreakModeTailTruncation].width; UILabel *info=[[UILabel alloc]init]; info.text=[NSString stringWithFormat:@"(number %d - %@)",num,type]; info.font=sf(10);info.textColor=[UIColor whiteColor];info.backgroundColor=[UIColor clearColor]; CGFloat infowidth=[info.text sizeWithFont:info.font constrainedToSize:CGSizeMake(sw,12) lineBreakMode:UILineBreakModeTailTruncation].width; title.frame=CGRectMake(ceilf((sw-(titlewidth+infowidth))/2),0,titlewidth,15); info.frame=CGRectMake(ceilf(title.frame.origin.x+titlewidth+10),2,infowidth,12); [rBase addSubview:title];[rBase addSubview:info]; [self addSubview:rBase];//return self; OAMutableURLRequest *request=[[OAMutableURLRequest alloc] initWithURL:url consumer:cons token:token realm:nil signatureProvider:nil]; [request setHTTPMethod:@"POST"]; NSMutableArray *prmt=[NSMutableArray arrayWithObject:[[OARequestParameter alloc]initWithName:@"id" value:[NSString stringWithFormat:@"%@",rid]]]; [prmt addObject:[[OARequestParameter alloc]initWithName:@"reblog_key" value:rkey]]; //[prmt addObject:[[OARequestParameter alloc]initWithName:@"comment" value:@"comment"]]; [request setParameters:prmt]; OADataFetcher *fetcher=[[OADataFetcher alloc] init]; [fetcher fetchDataWithRequest:request delegate:self didFinishSelector:@selector(rblgTicket:didFinishWithData:) didFailSelector:@selector(rblgTicket:didFailWithError:)]; } return self; } - (void)rblgTicket:(OAServiceTicket *)ticket didFinishWithData:(NSData *)data{ NSDictionary *bd=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; if([[bd valueForKeyPath:@"meta.status"]intValue]==201){ title.text=@"REBLOG-ed."; [UIView animateWithDuration:3 delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{self.alpha=0;} completion:^(BOOL finished){ [self.delegate rposReset:rpos]; [self removeFromSuperview]; }]; //NSLog(@"rebloged."); } else NSLog(@"rblg failed."); } - (void)rblgTicket:(OAServiceTicket *)ticket didFailWithError:(NSError *)error{ NSLog(@"rblg Error! %@",error); }
できた。
delegateも難しく考えてたけど、単にずーっとやりたかったallocate元のインスタンスにメッセージを投げる方法だと考えればどーってことない。というか非常に使える。むしろ必須。わざわざnotification使ってたaccessTokenの取得ルーチンもdelegateに書き換えた。
0 件のコメント:
コメントを投稿