2010-08-22 4 views
0
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientat ion duration:(NSTimeInterval)duration { 
UIInterfaceOrientation o = self.interfaceOrientation; 
if ((o == UIInterfaceOrientationPortrait) || (o == UIInterfaceOrientationPortraitUpsideDown)) {D = 1;[self setPaging];} 
if ((o == UIInterfaceOrientationLandscapeLeft) || (o == UIInterfaceOrientationLandscapeRight)) {D = 2;[self setPaging];}} 

Je duplique certaines de mes méthodes afin que je puisse avoir une vue pour le mode portrait et une autre mode pour le mode paysage. La plupart du temps, il a travaillé par exemple:- [ImageScrollView index2]: sélecteur non reconnu envoyé à l'instance

//-----------------------------------------------------------------------------* 
-(ImageScrollView*)imagescrollview{ 
if(imagescrollview == nil){ 
imagescrollview = [[viewClass alloc] initWithFrame:CGRectZero];} 
return imagescrollview;} 
//--*duplicate 
-(ImageScrollView2*)imagescrollview2{ 
if(imagescrollview2 == nil){ 
imagescrollview2 = [[viewClass alloc] initWithFrame:CGRectZero];} 
return imagescrollview2;} 
//-----------------------------------------------------------------------------* 
- (ImageScrollView *)dequeueRecycledPage{ 
ImageScrollView *page = [recycledPages anyObject]; 
if (page) { 
    [[page retain] autorelease]; 
    [recycledPages removeObject:page];} 
return page;} 
//--*duplicate 
- (ImageScrollView2 *)dequeueRecycledPage2{ 
ImageScrollView2 *page = [recycledPages anyObject]; 
if (page) { 
    [[page retain] autorelease]; 
    [recycledPages removeObject:page];} 
return page;} 

Le code ci-dessus (ma méthode dupliquée (s)) fonctionne! Mais le code ci-dessous provoque l'application crash ...

//-----------------------------------------------------------------------------* 
- (void)tilePages { 
if (D == 1) { 
// Calculate which pages are visible 
CGRect visibleBounds = pagingScrollView.bounds; 
int firstNeededPageIndex = floorf(CGRectGetMinX(visibleBounds)/ CGRectGetWidth(visibleBounds)); 
int lastNeededPageIndex = floorf((CGRectGetMaxX(visibleBounds)-1)/CGRectGetWidth(visibleBounds)); 
firstNeededPageIndex = MAX(firstNeededPageIndex, 0); 
lastNeededPageIndex = MIN(lastNeededPageIndex, [self pdfPageCount] - 1); 
// Recycle no-longer-visible pages 
for (ImageScrollView *page in visiblePages) { 
if (page.index < firstNeededPageIndex || page.index > lastNeededPageIndex) { 
[recycledPages addObject:page]; 
[page removeFromSuperview];}} 
[visiblePages minusSet:recycledPages]; 
// add missing pages 
for (int index = firstNeededPageIndex; index <= lastNeededPageIndex; index++) { 
if (![self isDisplayingPageForIndex:index]) { 
ImageScrollView *page = [self dequeueRecycledPage]; 
if (page == nil) { 
page = [[[ImageScrollView alloc] init] autorelease];} 
     [self configurePage:page forIndex:index]; 
     [pagingScrollView addSubview:page]; 
[visiblePages addObject:page];}}} 
else if (D == 2) { 
// Calculate which pages are visible 
CGRect visibleBounds = pagingScrollView.bounds; 
int firstNeededPageIndex = floorf(CGRectGetMinX(visibleBounds)/ CGRectGetWidth(visibleBounds)); 
int lastNeededPageIndex = floorf((CGRectGetMaxX(visibleBounds)-1)/CGRectGetWidth(visibleBounds)); 
firstNeededPageIndex = MAX(firstNeededPageIndex, 0); 
lastNeededPageIndex = MIN(lastNeededPageIndex, [self pdfPageCount] - 1); 
// Recycle no-longer-visible pages 
for (ImageScrollView2 *page in visiblePages) { 
if (page.index2 < firstNeededPageIndex || page.index2 > lastNeededPageIndex) { 
[recycledPages addObject:page]; 
[page removeFromSuperview];}} 
[visiblePages minusSet:recycledPages]; 
// add missing pages 
for (int index = firstNeededPageIndex; index <= lastNeededPageIndex; index++) { 
if (![self isDisplayingPageForIndex:index]) { 
ImageScrollView2 *page = [self dequeueRecycledPage2]; 
if (page == nil) { 
page = [[[ImageScrollView2 alloc] init] autorelease];} 
[self configurePage2:page forIndex2:index]; 
[pagingScrollView addSubview:page]; 
[visiblePages addObject:page];}}}} 


//-----------------------------------------------------------------------------* 
- (void)configurePage:(ImageScrollView *)page forIndex:(NSUInteger)index{ 
page.index = index; 
page.frame = [self frameForPageAtIndex:index]; 
[page displayTiledImageNamed:[self pdfPage: index] size:[self pdfSize: index]];} 
//--*duplicate 
- (void)configurePage2:(ImageScrollView2 *)page forIndex2:(NSUInteger) index {NSLog(@"1"); 
page.index2 = index;NSLog(@"4"); 
page.frame = [self frameForPageAtIndex:index];NSLog(@"5"); 
[page displayTiledImageNamed2:[self pdfPage: index] size:[self pdfSize: index]];NSLog(@"6");} 

l'accident a quelque chose à voir avec index2 (index2 est un double de l'indice) voir ici:

//-----------------------------------------------------------------------------* 
@interface ImageScrollView : UIScrollView <UIScrollViewDelegate> { 
UIView  *imageView; 
NSUInteger  index; 
} 
@property (assign) NSUInteger index; 
- (void)displayTiledImageNamed:(CGPDFPageRef)page size:(CGSize)imageSize; 
@end 
//--*duplicate 
@interface ImageScrollView2 : UIScrollView <UIScrollViewDelegate> { 
UIView  *imageView; 
NSUInteger  index2; 
} 
@property (assign) NSUInteger index2; 
- (void)displayTiledImageNamed2:(CGPDFPageRef)page size:(CGSize)imageSize; 
@end 

L'erreur dans la la console est:

2010-08-22 03:02:36.532 PDFmag[31408:207] p4 
2010-08-22 03:02:36.541 PDFmag[31408:207] *** -[ImageScrollView index2]: unrecognized selector sent to instance 0x148d10 
2010-08-22 03:02:36.551 PDFmag[31408:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[ImageScrollView index2]: unrecognized selector sent to instance 0x148d10' 
2010-08-22 03:02:36.565 PDFmag[31408:207] Stack: (
864992541, 
859229716, 
864996349, 
864492313, 
864454720, 
21249, 
18449, 
21417, 
838908048, 
839266120, 
839260480, 
864766485, 
839108308, 
839107980, 
839226672, 
839225216, 
839206800, 
839205012, 
875886564, 
864740651, 
864738335, 
875880904, 
838872112, 
838865456, 
11645, 
11560 
) 
terminate called after throwing an instance of 'NSException' 
Program received signal: “SIGABRT”. 

NSLog (@ "p4"); l'application a l'air de tomber en panne ici !! Je ne suis pas sûr de ce qui est arrivé à cause de cela, s'il vous plaît me conseiller.

Merci.

+0

il n'y a pas NSLog (@ « p4 ») dans le code affiché – ennuikiller

+0

Pourquoi vous ne mettez pas votre code en retrait? Voulez-vous que ce soit illisible? Nous vivons dans l'âge des disques durs de * téraoctet *; Ne transpire pas quelques milliers de caractères. –

Répondre

0

Première ... wot? Pourquoi créez-vous deux sous-classes, une w/index et l'autre avec index2? Cela est extrêmement déroutant et semblerait, à première vue, totalement inutile compte tenu des modèles de conception OO standard.

Il semble également être la cause première de votre problème. A savoir, vous passez une instance de ImageScrollView où vous voulez passer une instance de ImageScrollView.

La première chose que je ferais est de se débarrasser de tous les non-sens 2 sur les noms de méthodes. Il n'y a aucune raison pour ImageScrollView2 d'avoir un index2. Heck, vous pourriez même:

@interface AbstractImageScrollView : UIScrollView <UIScrollViewDelegate> { 
UIView  *imageView; 
NSUInteger  index; 
} 
@property (assign) NSUInteger index; 
- (void)displayTiledImageNamed:(CGPDFPageRef)page size:(CGSize)imageSize; 
@end 

Et puis:

@interface ImageScrollView1 : AbstractImageScrollView 
... 
@end 

@interface ImageScrollView2 : AbstractImageScrollView 
... 
@end 

Mettre en oeuvre le comportement commun dans la superclasse abstraite et les comportements uniques dans les deux sous-classes, y compris -displayTileImageNamed:size: remplaçant, le cas échéant.

0

bbum, je l'ai fait ce que vous avez dit, j'aime l'idée est très propre & bien rangé, mais ...

@implementation ISVportrate : ImageScrollView 
warning: cannot find interface declaration for 'ISVportrate' 
error: property 'index' attempting to use ivar 'index' declared in super class of 'ISVportrate' 
error: request for member 'showsVerticalScrollIndicator' in something not a structure or union 
error: request for member 'showsHorizontalScrollIndicator' in something not a structure or union 
error: request for member 'bouncesZoom' in something not a structure or union 
error: request for member 'clipsToBounds' in something not a structure or union 
error: request for member 'decelerationRate' in something not a structure or union 
error: request for member 'delegate' in something not a structure or union 
error: request for member 'zoomScale' in something not a structure or union 
error: request for member 'contentSize' in something not a structure or union 
error: request for member 'maximumZoomScale' in something not a structure or union 
error: request for member 'minimumZoomScale' in something not a structure or union 
error: request for member 'zoomScale' in something not a structure or union 
+0

N'ai-je pas besoin de ceux-ci où? @class ISVportrate; @class ISVLandscape; – user422241

+0

Vous ne pouvez pas avoir un '@ implementation' sans un' @ interface' pour la même classe. Le '@ interface' est où vous déclarez normalement la superclasse. Normalement, vous mettez le '@ interface' dans un en-tête et l'importez, mais il semble que vous ayez bourré cette classe ISVportrate dans le fichier d'implémentation d'une autre classe. –

+0

fixé! Merci les gars – user422241

Questions connexes