setNeedsDisplay не вызывался

Я рисую синусоиду на UIView с помощью drawrect, и она связана с UIViewController. Он может рисовать один раз, когда я впервые загружаю контроллер представления. Я хочу, чтобы при изменении значения UISlider в ViewController менялась частота синусоиды. Я использую функцию setNeedsDisplay в IBAction, но она не работает. Вот мой код

//CROO.m
#import "CROO.h"

@implementation CROO
@synthesize frequency;
CGFloat fffff;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.frequency = fffff;
        [self setNeedsDisplay];
        // Initialization code
    }
    return self;

}

-(void)drawRect:(CGRect)rect
{

    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetLineWidth(context, 1);
    CGContextSetLineJoin(context, kCGLineJoinRound);
    NSLog(@"hi i am here %f",fffff);
    const CGFloat amplitude = 200/2;
    for(CGFloat x = 0; x < 600; x += 0.5)
    {
        CGFloat y = amplitude * cosf(2 * M_PI * (x / 600) * fffff) + 200;
        if(x == 0)
            CGContextMoveToPoint(context, x, y);
        else
            CGContextAddLineToPoint(context, x, y);
    }
    CGContextSetStrokeColorWithColor(context, [[UIColor greenColor] CGColor]);
    self.clearsContextBeforeDrawing = NO;

    CGContextStrokePath(context);
}

-(void)setFrequency:(CGFloat)f
{
    frequency = f;
    [self hello];
    NSLog(@"fre = %f",fffff);
}
-(void)hello
{
    fffff = frequency;
    [self setNeedsDisplay];
}
@end
//CosViewController.m
#import "CosViewController.h"
@interface CosViewController ()
@end

@implementation CosViewController
@synthesize frequency,currfrelab;
@synthesize cro;
float tempfreq;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    //cro = [[CROO alloc]initWithFrame:cro.frame];
    cro = [[CROO alloc]initWithFrame:cro.frame];

    //[self.view addSubview:cro];
    [cro setFrequency:frequency.value];
    //[self performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:YES];
    NSLog(@"freq = %f",cro.frequency);
    currfrelab.text = [NSString stringWithFormat:@"Frequency = %f",frequency.value];
    //[self.view setNeedsDisplayInRect:cro.frame];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
-(IBAction)updatefreq:(id)sender
{
   // cro = [[CROO alloc]init];
    CGFloat freq = [(UISlider *)sender value];
   // [self.view addSubview:cro];
    [cro setNeedsDisplay];
    //[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: [NSDate date]];
    currfrelab.text = [NSString stringWithFormat:@"Frequency = %f",freq];
    //[self.view performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:YES];

}
@end

person IvyBB    schedule 23.04.2013    source источник
comment
PS он может использовать данные начального значения ползунка для генерации волны. Так что класс CROO может получить значение.   -  person IvyBB    schedule 23.04.2013


Ответы (2)


Init вызывается только один раз, ну, init. Вызовите setNeedsDisplay с другого контроллера, чтобы снова вытолкнуть drawRect.

person Mark McCorkle    schedule 23.04.2013
comment
Тогда что мне менять? - person IvyBB; 23.04.2013
comment
Я добавил функцию для проверки setNeedsDisplay, но она все еще не работает. -(IBAction)testing:(id)sender { [cro setFrequency:10]; [cro setNeedsDisplay]; } Я нажимаю кнопку и вызываю эту функцию - person IvyBB; 23.04.2013
comment
Вы пытаетесь вызвать setNeedsDisplay из того же представления? Вам нужно вызывать его из вашего viewController. Что-то вроде [otherView setNeedsDisplay]; - person Mark McCorkle; 23.04.2013
comment
Если это не сработает, проблема заключается в том, как вы создали экземпляр UIView, который пытаетесь перерисовать. Создайте для него свойство, затем вызовите setNeedsDisplay для этого свойства. - person Mark McCorkle; 23.04.2013
comment
как создать для него свойство? - person IvyBB; 23.04.2013

person    schedule
comment
правильно ли значение частоты поступает внутри вытяжного прямоугольника... потому что только тогда вы увидите изменение синусоиды... - person BhushanVU; 24.04.2013
comment
Я проверил, что частота значений и fffff изменены в классе UIView. Но он не может перейти в drawrect... что я могу сделать? - person IvyBB; 24.04.2013
comment
cro = [[CROO alloc] initWithFrame:cro.frame]; здесь ваш объект cro не инициализирован, но вы предоставляете cro.frame... сделайте это, как показано ниже cro = [[CROO alloc]initWithFrame:CGRectMake(прямо вы хотите)]; - person BhushanVU; 24.04.2013
comment
(прямо вы хотите) должен быть размер cro uiview? кстати, это все еще не работает, когда я использую cro = [[CROO alloc] init]; - person IvyBB; 24.04.2013