Я сделал следующий пример приложения, чтобы проиллюстрировать свой вопрос.
Левое представление является представлением заполнителя (добавлено в Интерфейсном Разработчике). Когда приложение загружается, я добавляю подпредставление, управляемое NSViewController. NSViewController рисует прямоугольники разного цвета, каждый из которых является NSView, и макет этих цветных представлений управляется ограничением, созданным программно и добавленным к методу
-loadView
контроллера.Правый вид - это NSTableView (добавлен в Interface Builder). Когда приложение загружается, я использую тот же класс NSViewController для предоставления представлений для представления таблицы (добавляется только одна строка).
Когда я добавляю подвид в представление заполнителя, я также добавляю два дополнительных ограничения:
[_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]];
Эти ограничения устанавливают фрейм подпредставления равными границам супервизора. Все хорошо.
Однако, когда я предоставляю представление для NSTableView с помощью метода делегата -tableView:viewForTableColumn:row:
, представление еще не было добавлено в таблицу. Таким образом, у него нет супервизора, поэтому ограничения (пока) не могут быть добавлены в представление. Вот почему представление в табличном представлении не имеет тех же границ, что и у табличного представления.
Итак, мой вопрос: как я могу добавить ограничения к представлению, которое я предоставляю для табличного представления? Могу ли я снова получить доступ к представлению после того, как представление таблицы добавило его? Это кажется немного взломанным.
Исходный код для 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
сработало.
@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]];
}
tableView:didAddRowView:forRow:
выглядит? Я бы хотел добиться того же, но не заставить это работать ... - person swalkner   schedule 09.07.2013