使用DYRateView的多个额定条

时间:2012-06-05 19:51:38

标签: iphone ios

我有一个有3个评级栏的视图。

如何在代码中区分它们?现在,如果我改变顶部,它看起来很好,但是如果我然后改变其中两个,它就不能将它们彼此分开。

代码来自git https://github.com/dyang/DYRateView

- (void)changedToNewRate:(NSNumber *)rate {
    NSString *rating = [NSString stringWithFormat:@"Rate: %d", rate.intValue];
    NSLog(@"rating: %@",rating);
}

这是看到变化的地方。

这是.m文件

#import "Survey.h"

@implementation Survey

@synthesize btnSubmit;

- (void)setUpEditableRateView {
    DYRateView *rateService = [[DYRateView alloc] initWithFrame:CGRectMake(0, 55, self.view.bounds.size.width, 40) fullStar:[UIImage imageNamed:@"StarFullLarge@2x.png"] emptyStar:[UIImage imageNamed:@"StarEmptyLarge@2x.png"]];
    rateService.padding = 20;
    rateService.alignment = RateViewAlignmentCenter;
    rateService.editable = YES;
    rateService.delegate =self;
    [scroller addSubview:rateService];
    [rateService release];

    DYRateView *rateFood = [[DYRateView alloc] initWithFrame:CGRectMake(0, 130, self.view.bounds.size.width, 40) fullStar:[UIImage imageNamed:@"StarFullLarge@2x.png"] emptyStar:[UIImage imageNamed:@"StarEmptyLarge@2x.png"]];
    rateFood.padding = 20;
    rateFood.alignment = RateViewAlignmentCenter;
    rateFood.editable = YES;
    rateFood.delegate = self;
   [scroller addSubview:rateFood];
   [rateFood release];

  DYRateView *rateCleanliness = [[DYRateView alloc] initWithFrame:CGRectMake(0, 200, self.view.bounds.size.width, 40) fullStar:[UIImage imageNamed:@"StarFullLarge@2x.png"] emptyStar:[UIImage imageNamed:@"StarEmptyLarge@2x.png"]];
   rateCleanliness.padding = 20;
   rateCleanliness.alignment = RateViewAlignmentCenter;
   rateCleanliness.editable = YES;
   rateCleanliness.delegate = self;
   [scroller addSubview:rateCleanliness];
   [rateCleanliness release];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{

   [textField resignFirstResponder];
   return YES;
}

- (void)changedToNewRate:(NSNumber *)rate {
    NSString *rating = [NSString stringWithFormat:@"Rate: %d", rate.intValue];
    NSLog(@"rating: %@",rating);
}

- (IBAction)btnSubmit:(id)sender{

}

-(IBAction)mainMenu{

[self dismissModalViewControllerAnimated:YES];   
}

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    [scroller setScrollEnabled:YES];
    [scroller setContentSize:CGSizeMake(320, 600)];
    scroller.BackgroundColor = [UIColor clearColor];

    [self setUpEditableRateView];

    [btnSubmit useGreenConfirmStyle];
 }


 - (void)viewDidUnload
 {
    [super viewDidUnload];
     // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
 }

 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
 {
     // Return YES for supported orientations
     return (interfaceOrientation == UIInterfaceOrientationPortrait);
 }

 @end

更新

确定新代码我添加了一个if语句

- (void)rateView:(DYRateView *)rateView changedToNewRate:(NSNumber *)rate {
    NSString *barName = [NSString stringWithFormat:@"%@", rateView];
    if (barName == @"rateView1") {
        NSString *bar1 = [NSString stringWithFormat:@"Rate: %d", rate.intValue];
        NSLog(@"bar 1: %@",bar1);
    }else if(barName == @"rateView2"){
        NSString *bar2 = [NSString stringWithFormat:@"Rate: %d", rate.intValue];
        NSLog(@"bar 2: %@",bar2);
    }else{
       NSLog(@"NO BAR: %@",barName);
    } 
  self.rateLabel.text = [NSString stringWithFormat:@"Rate: %d", rate.intValue];

  }

然而它可以工作而不是回到“rateView1”或2或3.我回来了

 NO BAR: <DYRateView: 0x78229b0; frame = (0 40; 320 20); opaque = NO; layer =
 <CALayer:0x7824900>>

这本质上是正确的,但我希望使用rateView的名称,例如“rateView1”

SOLUTION:

在.h文件中@property你的2或3个小节

@property(nonatomic, retain) DYRateView *rateView1,*rateView2;

在.m @synthesize他们

@synthesize rateView1;
@synthesize rateView2;

然后

(void)setUpEditableRateView {
    rateView1 = [[DYRateView alloc] initWithFrame:CGRectMake(0, 40, self.view.bounds.size.width, 20) fullStar:[UIImage imageNamed:@"StarFullLarge.png"] emptyStar:[UIImage imageNamed:@"StarEmptyLarge.png"]];
    rateView1.padding = 20;
    rateView1.alignment = RateViewAlignmentCenter;
    rateView1.editable = YES;
    rateView1.delegate = self;
    [self.view addSubview:rateView1];
    [rateView1 release];

    rateView2 = [[DYRateView alloc] initWithFrame:CGRectMake(0, 100, self.view.bounds.size.width, 20) fullStar:[UIImage imageNamed:@"StarFullLarge.png"] emptyStar:[UIImage imageNamed:@"StarEmptyLarge.png"]];
    rateView2.padding = 20;
    rateView2.alignment = RateViewAlignmentCenter;
    rateView2.editable = YES;
    rateView2.delegate = self;
    [self.view addSubview:rateView2];
    [rateView2 release];

    // Set up a label view to display rate
    self.rateLabel = [[[UILabel alloc] initWithFrame:CGRectMake(0, 80, self.view.bounds.size.width, 20)] autorelease];
    self.rateLabel.textAlignment = UITextAlignmentCenter;
    self.rateLabel.text = @"Tap above to rate";
    [self.view addSubview:self.rateLabel];
}

然后最后

- (void)rateView:(DYRateView *)rateView changedToNewRate:(NSNumber *)rate {

    if (rateView == rateView1) {
        NSString *bar1 = [NSString stringWithFormat:@"Rate: %d", rate.intValue];
        NSLog(@"bar 1: %@",bar1);
    }else if(rateView == rateView2){
        NSString *bar2 = [NSString stringWithFormat:@"Rate: %d", rate.intValue];
        NSLog(@"bar 2: %@",bar2);
    }else{
        NSLog(@"NO BAR: %@",rateView);
    }     
    self.rateLabel.text = [NSString stringWithFormat:@"Rate: %d", rate.intValue];   
}

2 个答案:

答案 0 :(得分:4)

感谢您使用DYRateView!

当前版本的DYRateView不支持同时监听多个实例,但这并不意味着我们无法做到这一点。 :)

如果您不介意更新源代码,可以在DYRateView.m中找到名为notifyDelegate的方法,并将[self.delegate performSelector:@selector(changedToNewRate:) withObject:[NSNumber numberWithFloat:self.rate]]更改为[self.delegate performSelector:@selector(rateView:changedToNewRate:) withObject:self withObject:[NSNumber numberWithFloat:self.rate]]。通过这种方式,您可以将rateView本身作为参数传递给其侦听器。

我还没有尝试过上面的代码,因为此时我无法访问我的Mac,但我认为这应该可以让您了解如何实现目标。

答案 1 :(得分:0)

我只是为每个评分视图设置标记以区分它们,所以在您的示例中,我为每个评分添加一个标记:

#define serviceTag 1
#define foodTag 2
#define cleanlinessTag 3

- (void)setUpEditableRateView {
       DYRateView *rateService = [[DYRateView alloc] initWithFrame:CGRectMake(0, 55, self.view.bounds.size.width, 40) fullStar:[UIImage imageNamed:@"StarFullLarge@2x.png"] emptyStar:[UIImage imageNamed:@"StarEmptyLarge@2x.png"]];
       rateService.padding = 20;
       rateService.alignment = RateViewAlignmentCenter;
       rateService.editable = YES;
       rateService.tag = serviceTag;
       rateService.delegate =self;
       [scroller addSubview:rateService];
       [rateService release];

       DYRateView *rateFood = [[DYRateView alloc] initWithFrame:CGRectMake(0, 130, self.view.bounds.size.width, 40) fullStar:[UIImage imageNamed:@"StarFullLarge@2x.png"] emptyStar:[UIImage imageNamed:@"StarEmptyLarge@2x.png"]];
       rateFood.padding = 20;
       rateFood.alignment = RateViewAlignmentCenter;
       rateFood.editable = YES;
       rateFood.tag = foodTag;
       rateFood.delegate = self;
       [scroller addSubview:rateFood];
       [rateFood release];

       DYRateView *rateCleanliness = [[DYRateView alloc] initWithFrame:CGRectMake(0, 200, self.view.bounds.size.width, 40) fullStar:[UIImage imageNamed:@"StarFullLarge@2x.png"] emptyStar:[UIImage imageNamed:@"StarEmptyLarge@2x.png"]];
       rateCleanliness.padding = 20;
       rateCleanliness.alignment = RateViewAlignmentCenter;
       rateCleanliness.editable = YES;
       rateCleanliness.delegate = self;
       rateCleanliness.tag = cleanlinessTag;
       [scroller addSubview:rateCleanliness];
       [rateCleanliness release];
    }

然后,在委托方法中,您只需检查标记:

- (void)rateView:(DYRateView *)rateView changedToNewRate:(NSNumber *)rate {
    switch (rateView.tag) {
        case foodTag:
           // Do something for food
           break;
        case serviceTag:
           // Do something for service
           break;
        case cleanlinessTag:
           // Do something for cleanliness
           break;
        default:
           break;
    }

  }