C4 在子视图之间来回导航



我又觉得很傻,但我无法在项目的子视图之间来回导航。只要它继续前进,我可以根据需要添加任意数量的子视图,但是一旦我想回到以前访问过的视图之一,我就有问题了......这是我的简化代码:

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

我认为你把程序复杂化了。

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

有助于改进方法的事项:

  1. 从子类中删除对画布的引用。
  2. 子类控制器的视图都发布touchesBegan通知...在工作区中使用它们,即 [self listenFor:@"touchesBegan" fromObject:firstOrSecondView.canvas and runMethod:@"switch:"];
  3. 通过更改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明显不同的内部功能,这应该对您有用......如果它们是相同的,那么您应该考虑将它们折叠到同一个子类中。

相关内容

  • 没有找到相关文章

最新更新