0

我正在构建一个具有两个拆分视图的应用程序(一个拆分视图在右侧拆分视图中)但是在升级到 OS X Lion 后我遇到了问题。

当您使用右下调整大小操作时,应用程序会崩溃,即同时更改高度和宽度。

当我注释掉这段代码时,奇怪的行为消失了,但是拆分视图会崩溃,这是我不想要的。

(-(BOOL)splitView:(NSSplitView *)splitView canCollapseSubview:(NSView *)subview) 不返回

-(void)splitView:(NSSplitView *)splitView resizeSubviewsWithOldSize:(NSSize)oldSize {
NSRect newFrame = [splitView frame];                           // get the new size of the whole splitView

if (newFrame.size.width == oldSize.width) {                 // if the width hasn't changed
    [splitView adjustSubviews];                                 // tell sender to adjust subviews
    return;
}

// grab the splitviews
NSView *left = [[splitView subviews] objectAtIndex:0];
NSView *right = [[splitView subviews] objectAtIndex:1];

float dividerThickness = [splitView dividerThickness];

// get the different frames
NSRect leftFrame = [left frame];
NSRect rightFrame = [right frame];

// change in width for this redraw
int dWidth  = newFrame.size.width - oldSize.width;

if ([splitView.identifier isEqualToString:@"MainSplitView"])
{
    // ratio of the left frame width to the right used for resize speed when both panes are being resized
    float rLeftRight = (leftFrame.size.width - MainMIN_LEFT_PANEL_W) / rightFrame.size.width;

    // resize the height of the left
    leftFrame.size.height = newFrame.size.height;
    leftFrame.origin = NSMakePoint(0,0);

    // resize the left & right pane equally if we are shrinking the frame
    // resize the right pane only if we are increasing the frame
    // when resizing lock at minimum width for the left panel
    if(leftFrame.size.width <= MainMIN_LEFT_PANEL_W && dWidth < 0) {
        rightFrame.size.width += dWidth;
    } else if(dWidth > 0) {
        rightFrame.size.width += dWidth;
    } else {
        leftFrame.size.width += dWidth * rLeftRight;
        rightFrame.size.width += dWidth * (1 - rLeftRight);
    }

    rightFrame.size.width = newFrame.size.width - leftFrame.size.width - dividerThickness;
    rightFrame.size.height = newFrame.size.height;
    rightFrame.origin.x = leftFrame.size.width + dividerThickness;
}
else if ([splitView.identifier isEqualToString:@"SecondSplitView"])
{
    //NSView *MainRight = [[SplitView subviews] objectAtIndex:1];
    //float MinWidth = MainRight.frame.size.width - SubMIN_RIGHT_PANEL_W;
    // ratio of the left frame width to the right used for resize speed when both panes are being resized
    float rLeftRight = (rightFrame.size.width - SubMIN_RIGHT_PANEL_W) / leftFrame.size.width;

    // resize the height of the left
    leftFrame.size.height = newFrame.size.height;
    leftFrame.origin = NSMakePoint(0,0);

    // resize the left & right pane equally if we are shrinking the frame
    // resize the right pane only if we are increasing the frame
    // when resizing lock at minimum width for the left panel
    if(rightFrame.size.width <= SubMIN_RIGHT_PANEL_W && dWidth < 0) {
        leftFrame.size.width += dWidth;
    } else if(dWidth > 0) {
        leftFrame.size.width += dWidth;
    } else {
        rightFrame.size.width += dWidth * rLeftRight;
        leftFrame.size.width += dWidth * (1 - rLeftRight);
    }

    leftFrame.size.width = newFrame.size.width - rightFrame.size.width - dividerThickness;
    leftFrame.size.height = newFrame.size.height;
    rightFrame.origin.x = leftFrame.size.width + dividerThickness;
}

[left setFrame:leftFrame];
[right setFrame:rightFrame]; }

崩溃日志:

    2011-08-24 18:36:15.670 MyApplication[29947:407] -[NSTextFieldCell length]: unrecognized selector sent to instance 0x10231a1c0
2011-08-24 18:36:15.672 MyApplication[29947:407] -[NSTextFieldCell length]: unrecognized selector sent to instance 0x10231a1c0
2011-08-24 18:36:15.675 MyApplication[29947:407] (
    0   CoreFoundation                      0x00007fff8cd31986 __exceptionPreprocess + 198
    1   libobjc.A.dylib                     0x00007fff8be11d5e objc_exception_throw + 43
    2   CoreFoundation                      0x00007fff8cdbd5ae -[NSObject doesNotRecognizeSelector:] + 190
    3   CoreFoundation                      0x00007fff8cd1e803 ___forwarding___ + 371
    4   CoreFoundation                      0x00007fff8cd1e618 _CF_forwarding_prep_0 + 232
    5   CoreFoundation                      0x00007fff8cc95176 CFStringGetLength + 118
    6   CoreFoundation                      0x00007fff8cc99d91 CFStringAppend + 241
    7   CoreFoundation                      0x00007fff8cc94c18 __CFStringAppendFormatCore + 11448
    8   CoreFoundation                      0x00007fff8cce73eb _CFStringCreateWithFormatAndArgumentsAux + 107
    9   CoreFoundation                      0x00007fff8cd5f7c2 _CFLogvEx + 114
    10  Foundation                          0x00007fff95aa153f NSLogv + 89
    11  Foundation                          0x00007fff95aa14dd NSLog + 130
    12  AppKit                              0x00007fff91cf1bc6 -[NSSplitView _validateSubviewFrames] + 2004
    13  AppKit                              0x00007fff91cb4e31 -[NSSplitView resizeSubviewsWithOldSize:] + 739
    14  AppKit                              0x00007fff91b9d5e5 -[NSView setFrameSize:] + 955
    15  AppKit                              0x00007fff91b9ce9a -[NSView setFrame:] + 268
    16  AppKit                              0x00007fff91c791a0 -[NSView resizeWithOldSuperviewSize:] + 1040
    17  AppKit                              0x00007fff91c78d15 -[NSView resizeSubviewsWithOldSize:] + 200
    18  AppKit                              0x00007fff91b9d5e5 -[NSView setFrameSize:] + 955
    19  AppKit                              0x00007fff91cb0899 -[NSWindow _oldPlaceWindow:] + 1551
    20  AppKit                              0x00007fff91c5b7bb -[NSWindow _setFrameCommon:display:stashSize:] + 1948
    21  AppKit                              0x00007fff91c5b019 -[NSWindow setFrame:display:] + 60
    22  AppKit                              0x00007fff91cab9db -[NSWindow(NSWindowResizing) _resizeWithEvent:] + 1223
    23  AppKit                              0x00007fff91cab4af -[NSTitledFrame mouseDown:] + 187
    24  AppKit                              0x00007fff91cab3c1 -[NSThemeFrame mouseDown:] + 626
    25  AppKit                              0x00007fff91c2b66e -[NSWindow sendEvent:] + 6280
    26  AppKit                              0x00007fff91bc3f19 -[NSApplication sendEvent:] + 5665
    27  AppKit                              0x00007fff91b5a42b -[NSApplication run] + 548
    28  AppKit                              0x00007fff91dd852a NSApplicationMain + 867
    29  MyApplication                         0x0000000100001e42 main + 34
    30  MyApplication                         0x0000000100001e14 start + 52
)
4

1 回答 1

0

发现这是一种奇怪的方法。

Cocoa With Love有一个很好的教程!

于 2011-08-25T15:39:49.960 回答