1

我创建了一个简单的窗口,目的是成为“向导”(我知道 Apple 指南基本上禁止您这样做,我试图说服客户,但无论如何。

这只是一个简单的视图,里面有两个自定义视图,一个在底部,包含一个“上一个”和“下一个”按钮,一个在顶部的更大的视图占据了大部分空间。

我将底部视图称为“NavigationView”,将顶部视图称为“ContainerView”。

我创建了一个数组来保存用户应该使用“下一个”和“上一个”按钮导航的一系列视图。

所以,这是我的代码。

- (IBAction) next:(id)sender{
    currentViewIndex++;
    [self animatePushView:YES];
}

- (IBAction)previous:(id)sender{
    currentViewIndex--;
    [self animatePushView:NO];
}

- (void) animatePushView:(BOOL)forward{
    NSView *nextView = [viewCollection objectAtIndex:currentViewIndex];

    for (NSView *subView in [containerView subviews]) {
        [subView removeFromSuperview];
    }

    [containerView addSubview:nextView];
    [nextView setFrame:containerView.bounds];

    [containerView setNeedsDisplay:YES];

}

我认为这很简单。我有一个数组,其中包含要显示的下一个视图。

发生的情况是,我发现下一个视图位于 ContainerView 的左下方。为什么会这样?

另外,正如您可能已经猜到的那样,我是管理视图的新手,尽管我已经在 Objective-c 上工作了很长时间,所以如果我缺少一些最佳实践,我愿意接受建议。谢谢!

编辑:

我忘了补充:其中一些视图有不同的大小,我希望能够根据视图大小更改窗口大小。

4

2 回答 2

1

[nextView setFrame:containerView.bounds];

您正在将容器视图边界分配给下一个视图框架( doc )。
您可能想要的是将当前视图框架分配给下一个视图框架,并可能调整宽度和高度。

保留对当前显示视图的引用,如下所示(_currentView 是类型的 ivar NSView *):

- (IBAction) next:(id)sender{
    currentViewIndex++;
    [self animatePushView:YES];
}

- (IBAction)previous:(id)sender{
    currentViewIndex--;
    [self animatePushView:NO];
}

- (void) animatePushView:(BOOL)forward{
    NSView *nextView = [viewCollection objectAtIndex:currentViewIndex];
    [nextView setFrame:_currentView.frame];

    [_currentView removeFromSuperview];    // _currentView is retained in the collection
    [containerView addSubview:nextView];
    _currentView = nextView;

    [containerView setNeedsDisplay:YES];
}
于 2013-05-09T11:29:29.137 回答
0

好的,我想通了..终于..

问题是我必须显示的第一个视图已经包含在 .xib 文件的容器视图中。

我真的不知道为什么,但这可能导致容器视图的保留计数出现问题,因为它在第一次单击时被释放。释放容器视图会将视图重新定位在 (0,0) 上,可能是因为它的框架为空,并且视图会闪烁,因为它没有正确保留。

从 .xib 文件中删除视图并通过代码添加它无论如何都可以正常工作。

于 2013-05-10T09:28:06.357 回答