setNeedsDisplay не будет вызывать drawRect

Важный:

Я выяснил проблему, но модератор удалил ее по некоторым причинам:

Я попытался вызвать функцию непосредственно с кнопки, вместо того, чтобы использовать эту функцию в контроллере вида.

Я до сих пор не до конца понимаю, почему это не сработало, поэтому я приму любой ответ на этот вопрос.

Главный пост

Я пытаюсь сделать некоторые рисунки после нажатия кнопки UIB. Мой рисунок сделан в подклассе UIView. У меня есть экземпляр этого подкласса в моем ViewController. У меня также есть UIButton в моем ViewController, который вызывает функцию подкласса. В этой функции я вызываю

[self setNeedsDisplay];

Когда я загружаю свое приложение, drawRect вызывается один раз в момент загрузки представления, но никогда не вызывается снова, хотя setNeedsDisplay вызывается при каждом нажатии кнопки. Я посмотрел на много похожих вопросов и не нашел решения.

Я опубликую весь мой код здесь:

AEViewController.h

#import <UIKit/UIKit.h>
#import "AEGraphView.h"

@interface AEViewController : UIViewController{

IBOutlet AEGraphView *theView;

}
-(IBAction)updateAEGraphView:(id)sender;
@end

AEViewController.m

#import "AEViewController.h"

@interface AEViewController ()

@end

@implementation AEViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    theView = [[AEGraphView alloc] init];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
    } 
    else {
        return YES;
    }
}
-(IBAction)updateAEGraphView:(id)sender{
    [theView UpdateView];
}

@end

AEGraphView.h

#import <UIKit/UIKit.h>

@interface AEGraphView : UIView{


    CGContextRef mainContext;
    int power;
    int multiplier;


}
-(void)prepareGraphics;
- (void) drawLineFrom:(CGPoint)p1 To:(CGPoint)p2;
-(void)UpdateView;
@end

AEGraphView.m

#import "AEGraphView.h"

@implementation AEGraphView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    return self;
}


// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
    [self prepareGraphics];
    // Drawing code
    NSLog(@"called");
    if (power == 0) {
        [self drawLineFrom:CGPointMake(100,100) To:CGPointMake(-50, -2)];
    }
    else {
        [self drawLineFrom:CGPointMake(0, 0) To:CGPointMake(150, 150)];
    }
    [super drawRect:rect];

}

-(void)prepareGraphics{
    mainContext = UIGraphicsGetCurrentContext();
    CGContextSetShouldAntialias(mainContext, TRUE);
    CGContextSetLineWidth(mainContext, 2);
    CGContextSetLineCap(mainContext, kCGLineCapRound);

}
- (void) drawLineFrom:(CGPoint)p1 To:(CGPoint)p2{
    NSLog(@"%f,%f  to %f,%f", p1.x,p1.y,p2.x,p2.y);
    // Begin a path.
    CGContextBeginPath(mainContext);

    // Add a line to the path.
    CGContextMoveToPoint(mainContext, p1.x, p1.y);
    CGContextAddLineToPoint(mainContext, p2.x, p2.y);

    // Stroke and reset the path.
    CGContextStrokePath(mainContext);
}
-(void)UpdateView{
    if (power == 0) {
        power = 1;
    }
    else {
        power = 0;
    }
    [self setNeedsDisplay];
}
@end

2 ответа

Решение

Решение было иметь функцию, вызываемую из кнопки вместо вызова из функции в контроллере представления, который был вызван кнопкой.

Вы уверены, что ваш выход, который указывает на ваш пользовательский UIView, подключен? Проверьте, если это nil, Кроме того, вы убедились, что ваша функция вызывается?

Другие вопросы по тегам