【问题标题】:Consise simple example of working with NSCollectionView drag and drop使用 NSCollectionView 拖放的简单示例
【发布时间】:2012-02-02 15:06:33
【问题描述】:

我想弄清楚如何从表格视图中的字符串拖放到集合视图中。我知道有用于 collectionView 拖放的委托方法,但找不到任何如何实现它们的示例。我设置了收藏视图,它似乎工作正常,但不知道如何完成。

感谢任何帮助。

更新:我正在使用的集合视图设置有 3 个 NSTextFields 和每个集合项的 2 个复选框。在同一个视图中还有一个tableView。表格视图被传递了一个 MutableArray 字符串。我希望能够将字符串值从表视图行拖到集合视图项中的相应文本字段中。

这与用于集合视图的典型拖放方式不同。

【问题讨论】:

    标签: cocoa drag-and-drop collectionview


    【解决方案1】:

    我将回答我自己的问题,因为我今天花了很多时间试图弄清楚这一点,很多人都在这个过程中挣扎,主要是因为我感觉不好,我一直在向 Stack 社区询问所有这些集合视图问题周:

    我发现 NSTextField 的默认行为实际上允许放置,如果它是焦点。问题是我需要适当的 NSTextField 来自动关注鼠标进入的事件。事实证明,我什至不需要 NSCollectionView 拖放委托。我需要 NSTableView 拖动代表,我需要继承 NSTextField 并在其中实现鼠标事件(放置)代表。

    所以我的原始 collectionViewItem 类如下所示:

    //someClass.h 
    
    @interface SomeClass : NSObject{
    
        IBOutlet NSTextField *field1_;
        IBOutlet NSTextField *field2_;
        IBOutlet NSTextField *field3_;
    
        IBOutlet NSButton *chkBox1_; 
        IBOutlet NSButton *chkBox2_;       
    
    }     
      @porperty(readwrite, copy) NSTextField *filed1_;
    

    为所有 5 个出口制作属性以用于绑定目的。如果您按照 Mac OSX Dev Library 上的教程进行操作;集合视图编程指南,它会引导您完成设置集合视图的过程,但它使用绑定。

    所以现在关键是设置一个textField子类 //MyNSTextField.h #进口 @interface MyNSTextField : NSTextField{

        //mouse positioning 
        unsigned long last_;
    }
    
    //MyNSTextField.m
    #import "MtTextField.h"
    
    @implementation 
    
    -(void)dealloc{
        [super dealloc];
    }
    
    -(void)awakeFromNib{
    
    //register for dragged types
    //any other nib stuff
    }
    
    //three required mouse events
    -(unsigned long)draggingEntered:(id<NSDraggingInfo>)sender{
    
        //this forces the textfield to focus before drop
        [self.window makeFirstResponder: self];
    
       NSPasebord *pBoard;
       self->last_ = DragOperationNone;
       pBoard = [sender draggingPastboard];
    
      return self->last_;
    
    }
    
    -(unsigned long)draggingUpdated:(id<NSDraggingInfo>)sender{
    
        return self->last_;
    
    }
    
    
    -(void)draggingExited:sender{
    
       if([sender draggingSource] != self){
    
             self->last = NSDragOperationNone;
    
        }
    
    
      }   
    

    }//结束类

    现在只需返回原始类并将 textField 出口的名称从 NSTextField 更改为 MyNSTextField 并在集合视图中,选择每个文本字段并在检查器中为其分配新的类名,只要你有你的 tableview拖动代理设置,或者如果您是从其他来源拖动,请确保您设置了适当的拖动源代理,并且它应该可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 2013-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多