Objective c 如何在Objective OSX中使用NSPageController禁用NSTableView的滚动事件?

Objective c 如何在Objective OSX中使用NSPageController禁用NSTableView的滚动事件?,objective-c,cocoa,nstableview,Objective C,Cocoa,Nstableview,我有一个NSPageController——该控制器允许用户在视图之间水平滑动 问题是,在我们滑动到的视图上,有一个NSTableView。 此时,我无法切换回以前的视图,因为NSTableView正在“吞噬”所有的滑动手势。是否有人知道如何仅禁用NSTableView上的水平滚动,以便水平滑动指示器进入NSPageController的视图,而不是表格?试试这个 - (void)scrollWheel:(NSEvent *)theEvent { [self.nextResponder

我有一个
NSPageController
——该控制器允许用户在视图之间水平滑动

问题是,在我们滑动到的视图上,有一个
NSTableView
。 此时,我无法切换回以前的视图,因为
NSTableView
正在“吞噬”所有的滑动手势。是否有人知道如何仅禁用NSTableView上的水平滚动,以便水平滑动指示器进入
NSPageController的视图,而不是表格?

试试这个

- (void)scrollWheel:(NSEvent *)theEvent
{
    [self.nextResponder scrollWheel:theEvent];
}

希望它能有所帮助。

创建一个bool,让您的panGesture在
panScrollView
中进行操作

-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
self.blockPanGesture = YES;
}

-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:
    (BOOL)decelerate
{
self.blockPanGesture = NO;
}
然后

如果您亲自平移整个tableview,我会将手势识别器放在tableview上。。。否则还有

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {

// Return YES if you want the specified item to be editable.
return YES;
}

为你处理所有这些。。。但我想你不想用这个是有原因的。您也可以基于此逻辑进行构建,例如,您可能希望通过在-(void)scrollView WillBegindRagging:(UIScrollView*)scrollView等中添加类似的检查来调整scrollView何时也可以拖动。

使用NSScrollView的以下自定义类实现在Swift中解决

class HorizontalScrollDisabledTable: NSScrollView {
    var currentScrollIsHorizontal: Bool = true;

    override func scrollWheel(theEvent: NSEvent) {

        var phase: NSEventPhase = theEvent.phase

        /* Ensure that both scrollbars are flashed when the user taps trackpad with two fingers */
        if (phase == .MayBegin) {
            super.scrollWheel(theEvent) ;
            self.nextResponder?.scrollWheel(theEvent);
            return;
        }
        /* Check the scroll direction only at the beginning of a gesture for modern scrolling devices */
        /* Check every event for legacy scrolling devices */
        if (phase == .Began || (phase == .None && theEvent.momentumPhase == .None)) {
            currentScrollIsHorizontal = fabs(theEvent.scrollingDeltaX) > fabs(theEvent.scrollingDeltaY);
        }
        if (!currentScrollIsHorizontal ) {
            super.scrollWheel(theEvent);
        } else {
            self.nextResponder!.scrollWheel(theEvent);
        }
    }
}
下面是上面的滚轮方法的相同答案的代码,但在Objective中

-(void)scrollWheel:(NSEvent *)theEvent {

    NSEventPhase phase = [theEvent phase];

    /* Ensure that both scrollbars are flashed when the user taps trackpad with two fingers */
    if (phase == NSEventPhaseMayBegin) {
        [super scrollWheel:theEvent];
        [self.nextResponder scrollWheel:theEvent];
            return;
    }
    /* Check the scroll direction only at the beginning of a gesture for modern scrolling devices */
    /* Check every event for legacy scrolling devices */
    if (phase == NSEventPhaseBegan || (phase == NSEventPhaseNone && theEvent.momentumPhase == NSEventPhaseNone)) {
        currentScrollIsHorizontal = fabs(theEvent.scrollingDeltaX) > fabs(theEvent.scrollingDeltaY);
    }
    if (!currentScrollIsHorizontal ) {
        [super scrollWheel:theEvent];
    } else {
        [self.nextResponder scrollWheel:theEvent];
    }
}

除非你想在OS X和iOS之间共享你的项目,否则不要用一个或多个不相关的标签来混淆人们。iOS/UIKit与这个问题有什么关系?
-(void)scrollWheel:(NSEvent *)theEvent {

    NSEventPhase phase = [theEvent phase];

    /* Ensure that both scrollbars are flashed when the user taps trackpad with two fingers */
    if (phase == NSEventPhaseMayBegin) {
        [super scrollWheel:theEvent];
        [self.nextResponder scrollWheel:theEvent];
            return;
    }
    /* Check the scroll direction only at the beginning of a gesture for modern scrolling devices */
    /* Check every event for legacy scrolling devices */
    if (phase == NSEventPhaseBegan || (phase == NSEventPhaseNone && theEvent.momentumPhase == NSEventPhaseNone)) {
        currentScrollIsHorizontal = fabs(theEvent.scrollingDeltaX) > fabs(theEvent.scrollingDeltaY);
    }
    if (!currentScrollIsHorizontal ) {
        [super scrollWheel:theEvent];
    } else {
        [self.nextResponder scrollWheel:theEvent];
    }
}