5
我试图创建一个绘制图层的UIViewController,并且如果此UIViewController是主图层,它工作正常。但是,如果我尝试初始化它的另一个控制器中,然后添加它的视图作为主控制器的观点,它导致以下错误的子观点:drawLayer:inContext - 发送到实例的无法识别的选择器
-[__NSCFType drawLayer:inContext:]: unrecognized selector sent to instance 0x155140
这里是我的自定义的UIViewController的相关代码(PDFPageViewController ):
- (void)loadDocument:(PDFDocument *)document
{
self._document = document;
CGRect pageRect = CGRectIntegral(CGPDFPageGetBoxRect(self._document.page, kCGPDFCropBox));
pageRect.origin.x = (self.view.frame.size.width/2) - (pageRect.size.width/2) - 35;
CATiledLayer *tiledLayer = [CATiledLayer layer];
tiledLayer.delegate = self;
tiledLayer.tileSize = CGSizeMake(1024.0, 1024.0);
tiledLayer.levelsOfDetail = 1000;
tiledLayer.levelsOfDetailBias = 1000;
tiledLayer.frame = pageRect;
contentView = [[UIView alloc] initWithFrame:pageRect];
[contentView.layer addSublayer:tiledLayer];
CGRect viewFrame = self.view.frame;
viewFrame.origin = CGPointZero;
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:viewFrame];
scrollView.delegate = self;
scrollView.contentSize = pageRect.size;
scrollView.maximumZoomScale = 1000;
[scrollView addSubview:contentView];
[self.view addSubview:scrollView];
NSLog(@"%@", self); // Just checking if there's nothing overwriting the layer's delegate
}
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
return contentView;
}
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
if(self._document) {
CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0);
CGContextFillRect(ctx, CGContextGetClipBoundingBox(ctx));
CGContextTranslateCTM(ctx, 0.0, layer.bounds.size.height);
CGContextScaleCTM(ctx, 1.0, -1.0);
CGContextConcatCTM(ctx, CGPDFPageGetDrawingTransform(self._document.page, kCGPDFCropBox, layer.bounds, 0, true));
CGContextDrawPDFPage(ctx, self._document.page);
}
}
的drawLayer方法是存在的,该CALayer的的委托是自。
这是我怎么称呼它在我的主控制器上:
pageViewController = [[[PDFPageViewController alloc] initWithNibName:NULL bundle:NULL] autorelease];
[pageViewController loadDocument:self.document];
[self.view addSubview:[pageViewController view]];
我不能这样做的正确方法?我不明白为什么这个工作正常,如果我在我的主控制器上绘制图层,并且如果绘制在PDFViewController上,则会导致错误。方法在那里,代表是self。那么为什么选择器失败?
这听起来像是内存管理问题。你有没有试过NSZombieEnabled?有没有机会过度发布某些东西?你在使用ARC吗? – jtbandes
@jbandes - 非常感谢!在NSZombieEnabled中,我看到了正如你所说的那样,这条消息已经发送到了我的视图控制器的一个解除分配的实例,然后我开始修复过度释放。请张贴这个问题的答案,以便我可以标记它,你可以获得赏金。 – Raphael
谢谢,很高兴我能帮忙!我认为你必须单独分配赏金,只是将它标记为答案不分配它。 – jtbandes