我再次感到愚蠢,但我无法在项目的子视图之间来回导航。我可以添加尽可能多的子视图,只要它只是前进,但只要我想回到之前访问过的一个视图我就有问题... 这是我的简化代码:
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
FirstView.h
#import "C4CanvasController.h"
#import "SecondView.h"
@interface FirstView : C4CanvasController{
C4Label *goToSecondView;
SecondView *secondView;
}
@property (readwrite, strong) C4Window *mainCanvas;
@end
FirstView.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
SecondView.h
#import "C4CanvasController.h"
#import "FirstView.h"
@interface SecondView : C4CanvasController{
C4Label *goToFirstView;
FirstView *firstView;
}
@property (readwrite, strong) C4Window *mainCanvas;
@end
SecondView.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
答案 0 :(得分:1)
我认为你过度使程序复杂化。
"控制"哪个子视图应由包含视图控制器完成,因此,如果两个视图在画布上,那么它应该是处理切换而不是对象本身的画布。
有助于改善您的方法:
touchesBegan
次通知...在工作区中使用这些视图,即[self listenFor:@"touchesBegan" fromObject:firstOrSecondView.canvas and runMethod:@"switch:"];
zPosition
或隐藏/显示相应的视图... 我将您的实施减少到以下内容:
<强> FirstView.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
<强> SecondView.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
明显不同的内部功能...如果它们相同,那么您应该考虑折叠他们进入同一个子类。