我又觉得很傻,但我无法在项目的子视图之间来回导航。只要它继续前进,我可以根据需要添加任意数量的子视图,但是一旦我想回到以前访问过的视图之一,我就有问题了......这是我的简化代码:
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
第一视图
#import "C4CanvasController.h"
#import "SecondView.h"
@interface FirstView : C4CanvasController{
C4Label *goToSecondView;
SecondView *secondView;
}
@property (readwrite, strong) C4Window *mainCanvas;
@end
第一视图
#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
第二视图
#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
我认为你把程序复杂化了。
哪个子视图的"控制"应该由包含视图控制器完成,因此,如果两个视图在画布上,那么处理切换的应该是画布而不是对象本身。
有助于改进方法的事项:
- 从子类中删除对画布的引用。
- 子类控制器的视图都发布
touchesBegan
通知...在工作区中使用它们,即[self listenFor:@"touchesBegan" fromObject:firstOrSecondView.canvas and runMethod:@"switch:"];
- 通过更改
zPosition
或隐藏/显示适当的视图进行切换...
我将您的实现简化为以下内容:
第一视图
#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
第二视图
#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
明显不同的内部功能,这应该对您有用......如果它们是相同的,那么您应该考虑将它们折叠到同一个子类中。