C4在子视图之间来回导航

时间:2013-10-23 11:38:17

标签: ios navigation subviews 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

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

1 个答案:

答案 0 :(得分:1)

我认为你过度使程序复杂化。

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

有助于改善您的方法:

  1. 从子类中删除对画布的引用。
  2. 您的子类控制器的所有视图都发布touchesBegan次通知...在工作区中使用这些视图,即[self listenFor:@"touchesBegan" fromObject:firstOrSecondView.canvas and runMethod:@"switch:"];
  3. 切换为zPosition或隐藏/显示相应的视图...
  4. 我将您的实施减少到以下内容:

    <强> 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明显不同的内部功能...如果它们相同,那么您应该考虑折叠他们进入同一个子类。