2

我有一个视图,上面有 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”

解决方案:

在 .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];   
}
4

2 回答 2

4

感谢您使用 DYRateView!

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

如果您不介意更新源代码,您可以notifyDelegate在 DYRateView.m 中找到一个名为的方法,并将其更改[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,但我认为这应该让您了解如何实现您的目标。

于 2012-06-05T21:35:32.763 回答
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;
    }

  }
于 2012-08-02T20:54:28.200 回答