gpt4 book ai didi

cocoa - 当 NSViewController 提供 View 时,如何将自动布局与基于 View 的 NSTableView 一起使用?

转载 作者:行者123 更新时间:2023-12-03 16:03:05 29 4
gpt4 key购买 nike

我制作了以下示例应用程序来说明我的问题。

  • 左 View 是占位符 View (在 Interface Builder 中添加)。当应用程序加载时,我添加一个由 NSViewController 管理的 subview 。 NSViewController 绘制不同颜色的矩形,每个矩形都是一个 NSView,这些彩色 View 的布局由以编程方式创建并添加到 -loadView 的约束管理。 Controller 的方法。

  • 右侧 View 是 NSTableView(在 Interface Builder 中添加)。当应用程序加载时,我使用相同的 NSViewController 类为 TableView 提供 View (仅添加一行)。

当我将 subview 添加到占位符 View 时,我还添加了两个附加约束,

[_placeholderView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[CTRL_VIEW]|" options:0 metrics:nil views:views]];
[_placeholderView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[CTRL_VIEW]|" options:0 metrics:nil views:views]];

这些约束将 subview 的框架设置为等于 super View 的边界。一切都很好。

但是,当我使用委托(delegate)方法 -tableView:viewForTableColumn:row: 提供 NSTableView 的 View 时,该 View 尚未添加到表中。因此它没有 super View ,因此还不能将约束添加到 View 中。这就是为什么 TableView 中的 View 与 TableView 单元格没有相同的边界。

所以我的问题是如何向我提供给 TableView 的 View 添加约束? TableView 添加后是否可以再次访问该 View ?这看起来有点黑客风格。

Two views using autolayout.

AppDelegate.h 的源代码,

#import <Cocoa/Cocoa.h>
@class BlahViewController;

@interface AppDelegate : NSObject <NSApplicationDelegate, NSTableViewDataSource, NSTableViewDelegate>

@property (assign) IBOutlet NSWindow *window;

/* Left view controller and place holding view */
@property (strong) BlahViewController *viewController;
@property (weak) IBOutlet NSView *placeholderView;

/* Right view (which is an NSTableView) */
@property (weak) IBOutlet NSTableView *tableView;


@end

和AppDelegate.m,

#import "AppDelegate.h"
#import "BlahViewController.h"

@interface AppDelegate ()
@property NSMutableArray *tableData;
@end

@implementation AppDelegate

- (id)init
{
self = [super init];
if (self) {

_tableData = [[NSMutableArray alloc] init];
[_tableData addObject:[[BlahViewController alloc] initWithNibName:@"BlahViewController" bundle:nil]];
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"NSConstraintBasedLayoutVisualizeMutuallyExclusiveConstraints"];
}
return self;
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {

/* Add a managed subview to the place holder view*/
_placeholderView.layer.backgroundColor = CGColorCreateGenericGray(0.5, 1.0);
_viewController = [[BlahViewController alloc] initWithNibName:@"BlahViewController" bundle:nil];
[_viewController.view setFrame:_placeholderView.bounds];
[_placeholderView addSubview:_viewController.view];

/* Additional constraints so the managed subview resizes with the place holder view */
NSDictionary *views = @{ @"CTRL_VIEW" : _viewController.view };
[_placeholderView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[CTRL_VIEW]|" options:0 metrics:nil views:views]];
[_placeholderView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[CTRL_VIEW]|" options:0 metrics:nil views:views]];

}

-(NSInteger) numberOfRowsInTableView:(NSTableView *)tableView
{
return [_tableData count];
}

-(id) tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
return [_tableData[row] view];
}


-(CGFloat) tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row {
return 150.;
}

@end

更新@jrturton

-(void) tableView:(NSTableView *)tableView didAddRowView:(NSTableRowView *)rowView forRow:(NSInteger)row 中添加约束工作了。

With constraints added.

@swalkner

我添加的约束非常基本,

-(void) tableView:(NSTableView *)tableView didAddRowView:(NSTableRowView *)rowView forRow:(NSInteger)row {
NSView *view = [rowView viewAtColumn:0];
NSDictionary *views = NSDictionaryOfVariableBindings(view);
[view.superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-12-[view]-12-|" options:0 metrics:nil views:views]];
[view.superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-12-[view]-12-|" options:0 metrics:nil views:views]];
}

最佳答案

您可以在将 View 添加到委托(delegate)方法tableView:willDisplayCell:forTableColumn:row:中的表后访问该 View 。此时,您可以添加约束,但您可能需要小心,不要一遍又一遍地添加相同的约束。

正如您自己发现的那样,方法 tableView:didAddRowView:forRow: 会是一个更好的地方,因为每个新 View 只会调用一次该方法。

您还可以通过在 View 上设置灵活的宽度自动调整大小蒙版而不是任何水平尺寸限制来实现此目的。添加单元格 View 时,表格可能会考虑到这一点。如果您小心的话,您可以混合搭配自动调整大小和约束。

我了解一些 iOS、一些自动布局,但只了解一点 OS X,所以我无法向您提供更多信息。我们不必担心 iOS 领域的单元格宽度发生太大变化!

关于cocoa - 当 NSViewController 提供 View 时,如何将自动布局与基于 View 的 NSTableView 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14300905/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com