1

我再次感到愚蠢,但我无法在项目的子视图之间来回导航。只要继续前进,我就可以添加任意数量的子视图,但是一旦我想回到以前访问过的视图之一,我就有问题了……这是我的简化代码:

C4Workspace.h

#import "C4CanvasController.h"
#import "FirstView.h"
@interface C4WorkSpace : C4CanvasController{
    FirstView *firstView;
}
@end

C4Workspace.m

#import "C4Workspace.h"

@implementation C4WorkSpace

-(void)setup {
    firstView=[FirstView new];
    firstView.canvas.frame=CGRectMake(0, 0, self.canvas.width, self.canvas.height);
    firstView.canvas.userInteractionEnabled=YES;
    [firstView setup];
    firstView.mainCanvas=self.canvas;
    [self.canvas addSubview:firstView.canvas];
}

@end

第一视图.h

#import "C4CanvasController.h"
#import "SecondView.h"

@interface FirstView : C4CanvasController{
    C4Label *goToSecondView;
    SecondView *secondView;

}
@property (readwrite, strong) C4Window *mainCanvas;

@end

第一视图.m

#import "FirstView.h"
@implementation FirstView
-(void)setup{
    goToSecondView=[C4Label labelWithText:@"go to second View"];
    goToSecondView.origin=CGPointMake(20, 50);
    [self.canvas addLabel:goToSecondView];
    [self listenFor:@"touchesBegan" fromObject:goToSecondView andRunMethod:@"goToSecondView"];
}
-(void)goToSecondView{
    [goToSecondView removeFromSuperview];
    C4Log(@"second view");
    secondView=[SecondView new];
    secondView.canvas.frame=CGRectMake(0, 0, self.canvas.width, self.canvas.height);
    secondView.canvas.userInteractionEnabled=YES;
    [secondView setup];
    secondView.mainCanvas=self.canvas;
    [self.canvas addSubview:secondView.canvas];  
}
@end

第二视图.h

#import "C4CanvasController.h"
#import "FirstView.h"
@interface SecondView : C4CanvasController{
    C4Label *goToFirstView;
    FirstView *firstView;
}
@property (readwrite, strong) C4Window *mainCanvas;
@end

第二视图.m

#import "SecondView.h"
@implementation SecondView
-(void)setup{
    goToFirstView=[C4Label labelWithText:@"go to First View"];
    goToFirstView.origin=CGPointMake(20, 50);
    [self.canvas addLabel:goToFirstView];
    [self listenFor:@"touchesBegan" fromObject:goToFirstView andRunMethod:@"goToFirstView"];
}

-(void)goToFirstView{
    [goToFirstView removeFromSuperview];
    C4Log(@"first view");
    firstview=[FirstView new];
    firstview.canvas.frame=CGRectMake(0, 0, self.canvas.width, self.canvas.height);
    firstView.canvas.userInteractionEnabled=YES;
    [firstView setup];
    firstView.mainCanvas=self.canvas;
    [self.canvas addSubview:firstView.canvas];   
}
@end
4

1 回答 1

1

我认为你的程序过于复杂了。

哪个子视图的“控制”应该由包含的视图控制器完成,因此,如果两个视图都在画布上,那么它应该是处理切换的画布而不是对象本身。

有助于改进您的方法的事情:

  1. 摆脱子类对画布的引用。
  2. 您的子类控制器的视图都发布touchesBegan通知......在工作区中使用这些,即[self listenFor:@"touchesBegan" fromObject:firstOrSecondView.canvas and runMethod:@"switch:"];
  3. 通过更改zPosition或隐藏/显示适当的视图来切换...

我将您的实现减少到以下内容:

第一视图.m

#import "FirstView.h"
@implementation FirstView
-(void)setup{
    goToSecondView=[C4Label labelWithText:@"go to second View"];
    goToSecondView.origin=CGPointMake(20, 50);
    [self.canvas addLabel:goToSecondView];
    goToSecondView.userInteractionEnabled = NO;
}
@end

第二视图.m

#import "SecondView.h"
@implementation SecondView
-(void)setup{
    goToFirstView=[C4Label labelWithText:@"go to First View"];
    goToFirstView.origin=CGPointMake(20, 50);
    [self.canvas addLabel:goToFirstView];
    goToFirstView.userInteractionEnabled = NO;
}
@end

C4WorkSpace.m

#import "C4Workspace.h"
#import "FirstView.h"
#import "SecondView.h"

@implementation C4WorkSpace {
    FirstView *firstView;
    SecondView *secondView;
}

-(void)setup {
    firstView=[FirstView new];
    firstView.canvas.frame = self.canvas.frame;
    [firstView setup];
    firstView.canvas.userInteractionEnabled = YES;
    [self.canvas addSubview:firstView.canvas];

    secondView=[SecondView new];
    secondView.canvas.frame = self.canvas.frame;
    [secondView setup];
    secondView.canvas.userInteractionEnabled = YES;
    [self.canvas addSubview:secondView.canvas];

    secondView.canvas.hidden = YES;

    [self listenFor:@"touchesBegan"
        fromObjects:@[firstView.canvas, secondView.canvas]
       andRunMethod:@"switchView:"];
}

-(void)switchView:(NSNotification *)aNotification {
    C4View *v = (C4View *)aNotification.object;

    if([v isEqual:firstView.canvas]) {
        firstView.canvas.hidden = YES;
        secondView.canvas.hidden = NO;
    } else {
        firstView.canvas.hidden = NO;
        secondView.canvas.hidden = YES;
    }
}

@end

如果您的视图需要不同的功能,这应该对您有用,例如FirstView内部功能与SecondView......如果它们相同,那么您应该考虑将它们折叠到同一个子类中。

于 2013-10-23T19:32:57.800 回答