2016-05-08 4 views
5

これは少し複雑ですが、誰かが私を助けてくれることを願っています。 OSXアプリケーションのドラッグアンドドロップ機能を構築しようとしています。ドラッグアンドドロップ機能swift OSX

enter image description here

これは、今見ている方法です。 したがって、ユーザーがビューの周りにドラッグアンドドロップできるテキストフィールドは1つだけです。 1つのテキストフィールドでは単純ですが、いくつかのテキストフィールドがある場合は複雑になり、どのようにアプローチするのか分かりません。 これは私が現在持っているものです。

@IBOutlet weak var test: NSTextField! 

@IBAction override func mouseDragged(theEvent: NSEvent) { 
    NSCursor.closedHandCursor().set() 
    var event_location = theEvent.locationInWindow 

    test.frame.origin.x = event_location.x - 192 
    test.frame.origin.y = event_location.y 
} 

テストは私のNSTextFieldの名前です。私はそれの名前を知っているので、それをarroundに移動するのは簡単です。しかし、ユーザーがさらにテキストフィールドを追加した場合(左のペインを参照)、このテキストフィールドの名前を持たないため(最初の入力の「テスト」など)、このテキストフィールドの処理方法はわかりません。

私はこのコードを経由してテキストフィールドを追加してい:

let input = NSTextField(frame: CGRectMake(width, height, 100, 22)) 
    self.MainView.addSubview(input) 

がどのように私は(ビュー上に複数存在する場合)、選択されたテキストフィールドを決定してからドラッグを介して適切なを移動し、ドロップすることができますか?

ドラッグ&ドロップは、私はサンプルアプリケーションを用意していること、単一の静的テキストフィールドのため

答えて

4

を働いているので、この検討してください。

https://github.com/melifaro-/DraggableNSTextFieldSample

アイデアがNSTextFieldを継承SelectableTextFieldを導入することです。 SelectableTextFieldは、テキストフィールド選択イベントに関する関心のあるリスナーのサブスクリプションのための機能を提供します。ブロック変数はdidSelectCallbackです。ここでは、処理コードを設定する必要があります。このような何か:

textField.didSelectCallback = { (textField) in 
    //this peace of code will be performed once mouse down event 
    //was detected on the text field 
    self.currentTextField = textField 
} 

テキストフィールドが選択されたら、上記のコールバックメカニズムを使用することにより、我々はcurrentTextField変数に格納することができます。したがってmouseDraggedの機能がViewControllerと呼ばれる場合はcurrentTextFieldを認識しており、適切に対応することができます。サンプルアプリの場合は、ドラッグイベントの移動に合わせてcurrentTextFieldの原点を調整する必要があります。今はもっと良くなったと思っています。

P.S. NSTextFieldはそれを継承するためにオープンされているので、Interface Builderを含むNSTextFieldを使用するあらゆる場所でSelectableTextFieldを自由に使用することができます。

EDIT

私はあなたのサンプルをチェックアウトしました。残念ながら私はリポジトリにプルリクエストをコミット/作成できませんので、ここで私の提案を見つけてください:

override func viewDidLoad() { 
    super.viewDidLoad() 

    didButtonSelectCallback = { (button) in 

     if let currentButton = self.currentButton { 

      currentButton.highlighted = !currentButton.highlighted 

      if currentButton == button { 
       self.currentButton = nil 
      } else { 
       self.currentButton = button 
      } 
     } else { 
      self.currentButton = button 
     } 

     button.highlighted = !button.highlighted 
    } 

    addButtonAtRandomePlace() 
    addButtonAtRandomePlace() 

    didButtonSelectCallback(button: addButtonAtRandomePlace()) 
} 

override func mouseDragged(theEvent: NSEvent) { 

    guard let button = currentButton else { 
     return 
    } 

    NSCursor.closedHandCursor().set() 

    button.frame.origin.x += theEvent.deltaX 
    button.frame.origin.y -= theEvent.deltaY 
} 

private func addButtonAtRandomePlace() -> SelectableButton { 

    let viewWidth = self.view.bounds.size.width 
    let viewHeight = self.view.bounds.size.height 

    let x = CGFloat(rand() % Int32((viewWidth - ButtonWidth))) 
    let y = CGFloat(rand() % Int32((viewHeight - ButtonHeight))) 

    let button = SelectableButton(frame: CGRectMake(x, y, ButtonWidth, ButtonHeight)) 
    button.setButtonType(NSButtonType.ToggleButton) 
    button.alignment = NSCenterTextAlignment 
    button.bezelStyle = NSBezelStyle.RoundedBezelStyle 
    button.didSelectCallback = didButtonSelectCallback 
    self.view.addSubview(button) 

    return button 
} 
+0

パーフェクト!あなたはあなたの答えを編集し、私がそれを理解できるようにあなたがしたステップを説明することができますか? NSTextfieldのクラスと同様に、SelectableTextFieldの仕組みは? – Anokrize

+0

ねえ、確かに。投稿を更新します。 –

+0

もう一度、お試しいただきありがとうございます。私はただ一つの質問が残っている、私はまたボタンや他のオブジェクトの周りにドラッグabelですか?私がボタンでそれを作ろうとしたサンプルアプリケーションをチェックしてください。なぜそれが動作していないのか教えていただけますか? https://github.com/tsafadi/DraggableButton – Anokrize

関連する問題