- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我看过其他SO问题,但看不到我需要的帮助:我有一个Cocoa应用程序,其中NSViewControllers在NSTabView中子类化。
一切正常,除了 - 当我第一次运行应用程序时,选项卡 0 内容不显示。当我选择选项卡 1,然后选择选项卡 0 时,选项卡 1 显示,选项卡 0 显示正常。
我需要一些关于如何初始化选项卡 View 的建议,因为我猜我正在做一些奇怪的事情。
这就是我到目前为止正在做的事情:
- (void)windowDidLoad
{
NSLog(@"%s", __FUNCTION__);
NSViewController *newController = nil;
newController = [[FirstViewController alloc]
initWithNibName:@"FirstViewController" bundle:nil];
NSTabViewItem *item;
[[self aTabView] selectFirstTabViewItem:newController];
newController.view.frame = aTabView.contentRect;
[item setView:firstViewController.view];
self.currentViewController = newController;
}
更新,根据 Peter Hosey 的精彩评论,我的工作代码如下:
- (void)windowDidLoad
{
NSLog(@"%s", __FUNCTION__);
firstViewController = [[FirstViewController alloc]
initWithNibName:@"FirstViewController" bundle:nil];
secondViewController = [[SecondViewController alloc]
initWithNibName:@"SecondViewController" bundle:nil];
thirdViewController = [[ThirdViewController alloc]
initWithNibName:@"ThirdViewController" bundle:nil];
NSTabViewItem *item;
if (firstViewController != nil) {
item = [aTabView tabViewItemAtIndex:0];
[item setView:[[self firstViewController] view]];
//[firstViewController.view.frame = aTabView.contentRect];
self.currentViewController = firstViewController;
}
}
- (BOOL)switchViewController:(NSTabView*)tabView item:(NSTabViewItem*)nextItem {
NSLog(@"%s", __FUNCTION__);
NSViewController *newController = nil;
newController.view = NO;
// assume a different identifier has been assigned to each tab view item in IB
itemIndex = [tabView indexOfTabViewItemWithIdentifier:[nextItem identifier]];
switch (itemIndex) {
case 0:
newController = firstViewController;
break;
case 1:
newController = secondViewController;
break;
case 2:
newController = thirdViewController;
break;
}
if (newController != nil) {
[nextItem setView:newController.view];
newController.view.frame = tabView.contentRect;
self.currentViewController = newController;
/*
NSLog(@"%s: myTabView.contentRect=%@ currentViewController.view.frame=%@",
__FUNCTION__, NSStringFromRect(aTabView.contentRect),
NSStringFromRect(currentViewController.view.frame));
*/
return YES;
}
else {
// report error to user here
NSLog(@"Can't load view for tab %ld", (long)itemIndex);
return NO;
}
}
- (BOOL)tabView:(NSTabView*)tabView shouldSelectTabViewItem:(NSTabViewItem*)tabViewItem {
return [self switchViewController:tabView item:tabViewItem];
}
最佳答案
NSViewController *newController = nil;
newController = [[FirstViewController alloc]
initWithNibName:@"FirstViewController" bundle:nil];
此声明和语句可以合并为一个带有初始值设定项的声明。
在 init
和 windowDidLoad
方法中执行此操作没有意义;您创建两个单独的 FirstViewController。
NSTabViewItem *item;
您永远不会创建 NSTabViewItem 并将其分配给此变量。如果您期望 selectFirstTabViewItem:
消息执行此操作,(1) 不,那不是 what that does (2) 它不可能做到这一点,因为它不知道你的变量,甚至不知道你有一个变量。
在 ARC 下,该变量被隐式初始化为 nil
,因此所有尝试使用此处项目的后续消息将不执行任何操作。如果您没有使用 ARC,则当您尝试使用它时,初始化此变量失败将导致(可能是间歇性的)崩溃。
[[self aTabView] selectFirstTabViewItem:newController];
在这里传递你 Shiny 的新 View Controller (其中之一)不会做我认为你认为它会做的事情。
selectFirstTabViewItem:
是一个操作方法;它的参数是消息的发送者,通常应该是一个控件或菜单项。当您将其设置为按钮、菜单项等的操作时,该按钮/菜单项/无论什么都将是发送者。
将 View Controller 作为发送者传递是没有意义的。此外, selectFirstTabViewItem:
不会更改第一个选项卡 View 项目(如果有的话)的任何内容,并且它绝对不会假设或检查其发送者是 VC,如果是,则设置项目的 View VC 认为。它选择第一个选项卡 View 项(使其成为当前选项卡),仅此而已。
这个方法很可能会忽略它的参数。如果要将第一个选项卡 View 项的 View 设置为 VC 的 View ,则必须自己执行此操作。当然,您必须首先获取(或创建)选项卡 View 项。
[item setView:firstViewController.view];
在 ARC 下,这不会执行任何操作;在 MRC 下,它可能会崩溃(见上文)。
我假设这段代码来自 NSWindowController 子类。我进一步假设这个厕所有一个 Nib 。
aTabView
是一个 socket 并且已连接到 WC 的 Nib 中。 aTabView
应该是一个使用 IBOutlet
关键字声明的简单属性。不要为其实现任何自定义访问器方法;只需声明该属性,将其连接到 nib 中,然后在代码中访问它即可。initWithWindow:
和 windowDidLoad
中或从中创建) )windowDidLoad
中将选项卡 View 的项目替换为 VC 的 View 。确保窗口未设置为初始可见;仅在填充至少第一个选项卡 View 项后才需要显示它。关于在 Nib 中创建的选项卡 View 的一个注释:最初可见的项目(选项卡)是您在 Nib 中可见的项目。确保在保存之前将选项卡 View 切换回其第一个选项卡。
关于cocoa - 如何在 NSTabView 中设置初始 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17214464/
我正在创建一个简单的 Web 浏览器并想实现选项卡。为此,我使用了 NSTabView。我基本上希望每个选项卡都有一个 WebView 来显示加载的网站。我从只有一个选项卡开始,想在创建新选项卡时添加
我尝试在 cocoa 中做一个简单的程序,一个带有2个项目的NSTabVew,在第一个项目中我将内容设置为字符串var,在第二个选项卡中我显示这个值。我创建了两个对象类(Prima 和 Seconda
正如其他地方所讨论的,NSTabView 没有 setBackgroundColor 方法,并且子类化 NSTabView 并使用 drawRect 来控制它不再起作用 - 因为它不会绘制顶部 10%
我有一个带有蓝色背景颜色的窗口 Controller 所有 subview Controller 的背景颜色都可以在蓝色背景下正常工作,就像它们的父窗口 Controller 一样,除了 NSTabV
随着我的 Cocoa 应用程序的出现,我的 NSWindowController 正在变得huuuuuuuuuuge。我的窗口有一个 NSTabView,其中的每个选项卡都有自己的 NSViewCon
我想为 NSTabViewItem 绘制自己的选项卡。我的选项卡应该看起来不同,并且从左上角开始而不是居中。 我该怎么做? 最佳答案 可以将 NSTabView 的样式设置为 Tabless,然后使用
我正在尝试在选择 View 时使用幻灯片为 NSTabView 的每个 View 设置动画。我以一种时尚的方式工作,但它只会在我第一次选择新的选项卡 View 时进行动画处理。之后我在切换选项卡 Vi
是否有任何不错的 NSTabView 替代品?最好开源。看起来像 xcode4 中的选项卡(或任何其他现代选项卡式应用程序)的东西,支持拖放、关闭按钮等。 我很惊讶地发现 SDK 除了非常有限的 NS
我有一个带有多个选项卡的 NSTabView,每个选项卡都包含一个 NSScrollView。在 scollviews 中,我动态放置使用自动布局和约束调整大小的自定义 View 。 现在,如果我将自
我想制作一个像 CleanMyMac 或其他应用程序一样的 NSTabView。 最佳答案 从未尝试过如此大量地自定义 NSOutlineView 或 NSTableView 但我怀疑它是否会足够接近
我有一个带有多个选项卡 View 项目的NSTabView。当用户点击某个按钮时,选项卡 View 会更改为这些项目之一,以显示从网站 api 返回的内容。我尝试创建一个中间选项卡 View 项来告诉
我看过其他SO问题,但看不到我需要的帮助:我有一个Cocoa应用程序,其中NSViewControllers在NSTabView中子类化。 一切正常,除了 - 当我第一次运行应用程序时,选项卡 0 内
我有一个包含 NSTabView 的应用程序。每当用户更改选项卡时,我都需要运行一个操作。我怎样才能做到这一点? 最佳答案 我不能完全确定您的问题,但我认为您正在寻找 NSTabViewDelegat
我有一个带有许多 NSView 项目的 NSTabView。我想调整选项卡 View 的大小,以便显示的 View 始终紧贴选项卡 View 。 我已经在tabView的委托(delegate)did
我有一个应用程序,其中的选项卡是根据配置文件的项目数动态绘制的(我知道,这不是最好的主意,但这是客户的要求)。问题是选项卡无法放入 NSTabView,它们被截断了。我不知道 NSTabView 中是
[tabView setBackgroundColor:[NSColor colorWithCalibratedRed:0.227f green:0.251f blue:0.337 alpha:0.8
我的应用程序包含一个带有两个选项卡的 NSTabView。此外,应用程序本身有一个playState,它是一个枚举。 playState 保存在 Singleton 中。 typedef enum {
我有一个 NSTabView,我在其中分配并在其选项卡上加载相同的 NSViewController: IRCView *viewirc = [[IRCView alloc] initWithNibN
我正在开发一个带有 NSTabView 和多个 NSTabViewItems 的应用程序。每个 NSTabViewItems 都有一个 WebView subview 。 WebView 按预期工作,
在具有多个选项卡的 NSTabViewController 中,我没有意识到默认情况下选择选项卡时,不会为您提供新的 View 实例。有没有办法强制始终加载 View 的新实例? 最佳答案 忽略为什么
我是一名优秀的程序员,十分优秀!