Objective c 如何将滚动输入传递到其他视图

Objective c 如何将滚动输入传递到其他视图,objective-c,cocoa,nsscrollview,Objective C,Cocoa,Nsscrollview,这个网站真的很棒 这次我有一个很简单的问题。我想将用户的任何滚动输入(可能是滚轮、触摸板等)传递到包含我自己子视图的NSScrollView 此时,如果用户仅在“我的子视图”框架之外的documentView上滚动,则滚动正常工作,但如果他们在光标位于子视图上时滚动,则不会发生任何事情。所以基本上我想让子视图识别滚动事件并将其传递回滚动视图 非常感谢您的帮助 干杯 编辑: 下面是我用来将子视图添加到documentView的代码 _milestoneView和_activityView都是NSV

这个网站真的很棒

这次我有一个很简单的问题。我想将用户的任何滚动输入(可能是滚轮、触摸板等)传递到包含我自己子视图的NSScrollView

此时,如果用户仅在“我的子视图”框架之外的documentView上滚动,则滚动正常工作,但如果他们在光标位于子视图上时滚动,则不会发生任何事情。所以基本上我想让子视图识别滚动事件并将其传递回滚动视图

非常感谢您的帮助

干杯

编辑: 下面是我用来将子视图添加到documentView的代码 _milestoneView和_activityView都是NSView子类,它们都有一个使用InstanceEnibWithOwner创建的对应nib,并相应地连接对象。它们包含一个NSTextField、PXListView,还有一些具有一个NSProgressingIndicator

-(void)useProject:(NSNumber *)projectId
{
[self resetView];

NSRect bounds = [[self view] bounds];
NSRect defaultFrame = NSMakeRect(20, NSMaxY(bounds)-93, NSMaxX(bounds)-20, 50);


//Prepare the milestone view
if (_milestoneView == nil)
    _milestoneView = [MilestoneView milestoneViewFromNibWithFrame:defaultFrame withProject:[BCLocalFetch projectForId:projectId]];
[_milestoneView reloadList];


//Prepare the activity view
if (_activityView == nil)
    _activityView = [ActivityView activityViewFromNibWithFrame:defaultFrame withProject:[BCLocalFetch projectForId:projectId]];

[self refresh];
}
然后,我使用刷新方法重新定位它们,因为内容大小不同,所以我希望有一个单独的方法

-(void)refresh
{
//Position the milestones first
[_milestoneView setFrameOrigin:NSMakePoint(20, NSMaxY([[self view] bounds])-[_milestoneView frame].size.height-60)];
if ([[_milestoneView milestones] count] > 0)
    [[self view] addSubview:_milestoneView];

//Now the activity view
[_activityView setFrameOrigin:NSMakePoint(20, [_milestoneView frame].origin.y-[_activityView frame].size.height-20)];
[[self view] addSubview:_activityView];

[self autosizeView];
}

-(void)autosizeView
{
//Resize the view to accommodate all subviews
NSRect oldFrame = [[self view] frame];
CGFloat lastY = [_activityView frame].origin.y;
if (lastY < 0) {
    CGFloat newHeight = oldFrame.size.height + (-lastY);
    [[self view] setFrameSize:NSMakeSize(oldFrame.size.width, newHeight)];
}
[[NSNotificationCenter defaultCenter] postNotificationName:@"BBContentDidResizeNotification" object:self];
}

好吧,我回到问题上来,终于解决了。其实实现非常简单。 我向PXListView添加了一个属性,以指向要滚动的NSScrollView。 然后,我实现了NSResponder的scrollWheel:方法,如下所示:

-(void)scrollWheel:(NSEvent *)theEvent
{
    //Pass scrolling to the superview
    [_scrollHandler scrollWheel:theEvent];
}

一切都很好

我猜这与NSEvent addLocalMonitorForEventsMatchingMask:handler有关:您描述的行为似乎很奇怪。。。您的子视图是否接受first responder/鼠标事件?据我所知,我还没有实现,我已经实现了acceptsFirstResponder并成为FirstResponder,并使它们返回NO。顺便问一下,我正在使用PXListView。您是否记录了鼠标事件的任何内容?不,我将如何执行此操作?