2016-05-08 10 views
5

To trochę skomplikowane, ale mam nadzieję, że ktoś mi pomoże. Próbuję utworzyć funkcję przeciągnij i upuść dla mojej aplikacji OSX.Swift and drop function OSX

enter image description here

Jak to wygląda w tej chwili. Jest więc tylko jedno pole tekstowe, które użytkownik może przeciągać i upuszczać wokół widoku. Jest to dość proste z tylko jednym polem tekstowym, ale jeśli jest kilka pól tekstowych, to staje się skomplikowane i nie wiem, jak się do nich zbliżyć. To co obecnie mam:

@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 
} 

testowy jest nazwa mojego NSTextField. Znam jego nazwę, więc łatwo ją przenieść. Ale jeśli użytkownik doda więcej pól tekstowych (zobacz na lewym panelu), to nie wiem jak adresować to pole tekstowe, ponieważ nie mam jego nazwy (jak "test" dla pierwszego wejścia).

dodaję pól tekstowych za pomocą tego kodu:

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

Jak mogę określić, które pole tekstowe (jeśli istnieje wiele na widoku) został wybrany, a następnie przenieść odpowiednią poprzez przeciągnij i upuść?

przeciągnij i upuść pracuje dla tego jednego statycznego pola tekstowego

Odpowiedz

4

Mam przygotował aplikację próbki, więc pomyśl o tym:

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

Chodzi o to, aby wprowadzić SelectableTextField która dziedziczy NSTextField . SelectableTextField zapewnia możliwość subskrypcji zainteresowanego słuchacza w przypadku zdarzenia wyboru pola tekstowego. Ma zmienną blokową didSelectCallback, w której musisz ustawić obsługę kodu. Coś takiego:

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

Stosując wspomniany mechanizm wywołania zwrotnego, gdy wybrane pole tekstowe, możemy przechowywać go w currentTextField zmiennej. Tak więc, gdy wywoływana jest funkcja mouseDragged z ViewController, jesteśmy świadomi currentTextField i możemy sobie z tym poradzić. W przypadku przykładowej aplikacji musimy dostosować pochodzenie currentTextField zgodnie z przesunięciem zdarzenia przeciągania. Mam nadzieję, że teraz stało się lepiej.

P.S. NSTextField jest otwarty do dziedziczenia z niego, dzięki czemu można swobodnie korzystać z naszego SelectableTextField wszędzie tam, gdzie używasz NSTextField, w tym z Interface Builder.

EDIT

Sprawdziłem swoje próbki. Nie jestem w stanie zatwierdzić/utworzyć żądania pobrania do repozytorium, więc znajdź moją propozycję tutaj:

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

Idealnie! Czy możesz po prostu edytować swoją odpowiedź i wyjaśnić kroki, które podjąłeś, aby ją zrozumieć? Jak klasa dla NSTextfield i jak działa SelectableTextField? – Anokrize

+0

Tak, na pewno. Zaktualizuje wpis. –

+0

Jeszcze raz dziękuję, wypróbowałem wszystko i zadziałało zgodnie z oczekiwaniami. Pozostało mi tylko jedno pytanie, czy ja też przeciągam przycisk lub inne obiekty? Sprawdź moją przykładową aplikację, w której próbowałem zrobić to za pomocą przycisku.Czy możesz mi powiedzieć, dlaczego to nie działa? https://github.com/tsafadi/DraggableButton – Anokrize