Frage

In IB Bibliothek, erzählt die Einführung uns, dass, wenn die Rückkehr Taste gedrückt wird, wird die Tastatur für UITextView verschwinden. Aber eigentlich die Rückkehr -Taste kann nur als '\ n' handeln.

Ich kann auf eine Schaltfläche hinzufügen und [txtView resignFirstResponder] die Tastatur auszublenden.

Aber ist es eine Möglichkeit, die Aktion für die Rückkehr Taste in der Tastatur hinzufügen, so dass ich brauche nicht UIButton zu hinzufügen?

War es hilfreich?

Lösung

UITextView hat keine Methoden, die aufgerufen wird, wenn der Benutzer die Return-Taste trifft. Wenn Sie der Benutzer in der Lage sein wollen, nur eine Zeile Text hinzufügen möchten, verwenden Sie einen UITextField. Schlagen die Rückkehr und Ausblenden der Tastatur für eine UITextView nicht die Schnittstelle Richtlinien entspricht.

Auch dann, wenn Sie dies tun wollen, die textView:shouldChangeTextInRange:replacementText: Methode der UITextViewDelegate implementieren und in diesem zu überprüfen, ob der Ersatztext ist \n, um die Tastatur auszublenden.

Es könnte auch andere Möglichkeiten, aber ich bin mir nicht bewusst irgend.

Andere Tipps

Dachte, ich würde das Snippet schreiben hier statt:

Vergewissern Sie sich Unterstützung für das UITextViewDelegate Protokoll erklären.

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {

    if([text isEqualToString:@"\n"]) {
        [textView resignFirstResponder];
        return NO;
    }

    return YES;
}

Swift 4.0 Update:

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    if text == "\n" {
        textView.resignFirstResponder()
        return false
    }
    return true
}

Ich weiß, das bereits beantwortet wurde, aber ich weiß nicht wirklich wie die Stringliteral für die Neuen-Zeile mit so hier ist das, was ich getan habe.

- (BOOL)textView:(UITextView *)txtView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    if( [text rangeOfCharacterFromSet:[NSCharacterSet newlineCharacterSet]].location == NSNotFound ) {
        return YES;
    }

    [txtView resignFirstResponder];
    return NO;
}

Swift 4.0 Update:

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
if (text as NSString).rangeOfCharacter(from: CharacterSet.newlines).location == NSNotFound {
    return true
}
txtView.resignFirstResponder()
return false
}

Ich weiß, das viele Male beantwortet wurde, aber hier sind meine zwei Cent auf die Frage.

fand ich die Antworten von samvermette und ribeto wirklich nützlich, und auch der Kommentar von maxpower im ribeto 's Antwort. Aber es gibt ein Problem mit diesen Ansätzen. Das Problem, das matt erwähnt in die samvermette 's Antwort und es ist, dass, wenn der Benutzer wünscht sein Inneres etwas mit einem Zeilenumbruch einfügen, würde die Tastatur verstecken ohne etwas einfügen.

Also mein Ansatz eine Mischung aus den oben genannten Lösungen drei ist und die Überprüfung nur dann, wenn die eingegebene Zeichenkette eine neue Linie ist, wenn die Länge der Zeichenfolge ist 1, so stellen Sie sicher, uns den Benutzer statt Einfügen ist die Eingabe.

Hier ist, was ich getan habe:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    NSRange resultRange = [text rangeOfCharacterFromSet:[NSCharacterSet newlineCharacterSet] options:NSBackwardsSearch];
    if ([text length] == 1 && resultRange.location != NSNotFound) {
        [textView resignFirstResponder];
        return NO;
    }

    return YES;
}

Ein eleganter Weg, um die Tastatur zu schließen, wenn der Benutzer irgendwo der Rahmen außerhalb der Tastatur tippt.

Zuerst stellen Sie Ihren Viewcontroller Sicht auf die Klasse „UIControl“ in der Identität Inspektor in UIBuilder. Ctrl ziehen den Blick in den Header-Datei des Viewcontroller und verknüpfen Sie es als eine Aktion mit dem Ereignisse als Touch Up Innen, wie zum Beispiel:

ViewController.h

-(IBAction)dismissKeyboardOnTap:(id)sender;

In der Hauptviewcontroller-Datei, ViewController.m:

-(IBAction)dismissKeyboardOnTap:(id)sender
    {
         [[self view] endEditing:YES];
    }

Sie können ein doppeltes Antippen oder lange Berührung mit ähnlichen Techniken erfordern. Möglicherweise müssen Sie Ihre Viewcontroller setzen einen UITextViewDelegate und schließen Sie das Textview mit dem Viewcontroller zu sein. Diese Methode funktioniert für beide UITextView und UITextField.

Quelle: Big Nerd-Ranch

EDIT: Ich möchte auch, dass hinzufügen, wenn Sie eine UIScrollView verwenden, die obige Technik nicht so leicht durch den Interface Builder arbeiten kann. In diesem Fall könnten Sie eine UIGestureRecognizer verwenden und die [[self Ansicht] endEditing: JA] rufen Methode in ihr statt. Ein Beispiel wäre:

-(void)ViewDidLoad{
    ....
    UITapGestureRecognizer *tapRec = [[UITapGestureRecognizer alloc] 
        initWithTarget:self action:@selector(tap:)];
    [self.view addGestureRecognizer: tapRec];
    ....
}

-(void)tap:(UITapGestureRecognizer *)tapRec{
    [[self view] endEditing: YES];
}

Wenn der Benutzer außerhalb der Tastatur tippt und keinen Eintrag Raum tippt, wird die Tastatur schließen.

Fügen Sie diese Methode in Ihren View-Controller.

Swift :

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
    if text == "\n" {
        textView.resignFirstResponder()
        return false
    }
    return true
}

Dieses Verfahren kann auch hilfreich sein für Sie:

/**
Dismiss keyboard when tapped outside the keyboard or textView

:param: touches the touches
:param: event   the related event
*/
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    if let touch = touches.anyObject() as? UITouch {
        if touch.phase == UITouchPhase.Began {
            textField?.resignFirstResponder()
        }
    }
}
-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    if([text isEqualToString:@"\n"])
        [textView resignFirstResponder];
    return YES;
}

yourtextView.delegate=self;

Fügen Sie auch UITextViewDelegate

Vergessen Sie nicht, Protokoll zu bestätigen

Wenn Sie nicht if([text isEqualToString:@"\n"]) hinzufügen, so können Sie nicht bearbeiten

Es gibt eine andere Lösung, während sie mit UITextView verwenden, Sie können in „textViewShouldBeginEditing“ und aus dieser Symbolleiste done Schaltfläche Symbolleiste als InputAccessoryView hinzufügen können Sie Tastatur entlassen, der Code hierfür ist folgende:

  

In viewDidLoad

toolBar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 44)]; //toolbar is uitoolbar object
toolBar.barStyle = UIBarStyleBlackOpaque;
UIBarButtonItem *btnDone = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(btnClickedDone:)];
[toolBar setItems:[NSArray arrayWithObject:btnDone]];
  

In textviewdelegate Methode

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView
{
     [textView setInputAccessoryView:toolBar];
     return YES;
}
  

In Aktion der Schaltfläche Fertig, die in Symbolleiste folgt:

-(IBAction)btnClickedDone:(id)sender
{
    [self.view endEditing:YES];
}

fand ich die Antwort von josebama die vollständigste und sauber seine Antwort in diesem Thread .

Im Folgenden finden Sie die Swift 4 Syntax für sie:

func textView(_ textView: UITextView, shouldChangeTextIn _: NSRange, replacementText text: String) -> Bool {
    let resultRange = text.rangeOfCharacter(from: CharacterSet.newlines, options: .backwards)
    if text.count == 1 && resultRange != nil {
        textView.resignFirstResponder()
        // Do any additional stuff here
        return false
    }
    return true
}

swift

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
    if text == "\n" {
        textView.resignFirstResponder()
    }
    return true
}

 und konfigurieren

Mit Navigationssteuerung Bar Host die Tastatur schließen:

in der H-Datei:

UIBarButtonItem* dismissKeyboardButton;

in der .m-Datei:

- (void)viewDidLoad {
    dismissKeyboardButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(dismissKeyboard)];
}

-(void)textViewDidBeginEditing:(UITextView *)textView {
    self.navigationItem.rightBarButtonItem = dismissKeyboardButton;
}

-(void)textFieldDidBeginEditing:(UITextField *)textField {
    self.navigationItem.rightBarButtonItem = dismissKeyboardButton;
}

-(void)dismissKeyboard {
    [self.textField resignFirstResponder];
    [self.textView resignFirstResponder];
    //or replace this with your regular right button
    self.navigationItem.rightBarButtonItem = nil;
}

Wie matt Kommentar zu samvermette, ich weiß nicht, wie die Idee des Erfassens „\ n“ entweder. Die „Rückkehr“ Schlüssel ist es für einen Grund in UITextView, dh zur nächsten Zeile natürlich gehen.

Die beste Lösung meiner Meinung nach ist die iPhone Nachricht App zu imitieren - die Symbolleiste hinzufügen (und Taste) auf der Tastatur.

Ich habe Code aus folgenden Blog-Post:

http://www.iosdevnotes.com/2011/02/iphone -Tastatur-Symbolleiste /

Schritte:

-Add-Symbolleiste auf Ihre XIB-Datei - stellen Sie die Höhe bis 460

-Add Symbolleiste auf die Schaltfläche Element (falls nicht bereits hinzugefügt). Wenn Sie mit der rechten ausrichten müssen, auch flexible bar Schaltfläche Artikel zu XIB hinzufügen und die Symbolschaltfläche Element verschieben

-Create Aktion, die Ihre Schaltfläche Artikel wie folgt zu ResignFirstResponder verlinken:

- (IBAction)hideKeyboard:(id)sender {
    [yourUITextView resignFirstResponder];
}

-Dann:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}

- (void)keyboardWillShow:(NSNotification *)notification {
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];

    CGRect frame = self.keyboardToolbar.frame;
    frame.origin.y = self.view.frame.size.height - 260.0;
    self.keyboardToolbar.frame = frame;

    [UIView commitAnimations];
}

- (void)keyboardWillHide:(NSNotification *)notification {
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];

    CGRect frame = self.keyboardToolbar.frame;
    frame.origin.y = self.view.frame.size.height;
    self.keyboardToolbar.frame = frame;

    [UIView commitAnimations];
}

Gerade dieses Problem eine andere Art und Weise gelöst.

  • Erstellen Sie eine Schaltfläche, die im Hintergrund platziert werden
  • Aus dem Attribut Inspektor, den Typ Schaltfläche, um benutzerdefinierte ändern, und die macht die Schaltfläche transparent.
  • die Schaltfläche Erweitern Sie die ganze Sicht abzudecken, und stellen Sie sicher, dass Sie die Taste hinter all dem anderen Objekt ist. Einfache Möglichkeit, dies zu tun, ist die Schaltfläche an die Spitze der Listenansicht im View
  • ziehen
  • Steuer zieht die Taste, um die viewController.h Datei und erstellen Sie eine Aktion (Sent Ereignis: Retuschieren nach innen) wie:

    (IBAction)ExitKeyboard:(id)sender;
    
  • In ViewController.m aussehen sollte:

    (IBAction)ExitKeyboard:(id)sender {
        [self.view endEditing:TRUE];
    }
    
  • Ausführen App, und wenn Sie von der Textview wegklicken, die Tastatur verschwindet

Fügen Sie einen Beobachter in viewDidLoad

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(textViewKeyPressed:) name: UITextViewTextDidChangeNotification object: nil];

und verwenden Sie dann den Wähler für "\ n" prüfen

-(void) textViewKeyPressed: (NSNotification*) notification {

  if ([[[notification object] text] hasSuffix:@"\n"])
  {
    [[notification object] resignFirstResponder];
  }
}

Es ist „\ n“ verwenden und nicht speziell für eine Return-Taste überprüfen, aber ich denke, das ist in Ordnung.

UPDATE

Siehe ribto Antwort unterhalb der verwendet [NSCharacterSet newlineCharacterSet] anstelle von \n

Versuchen Sie folgendes:

 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
    if ([text isEqualToString:@"\n"]) {
        [self.view endEditing:YES];
    }

    return YES;

}

// Sie können diese nutzen ...

Schritt 1: Der erste Schritt ist, um sicherzustellen, dass Sie die Unterstützung für das UITextViewDelegate Protokoll erklären. Dies wird in der Header-Datei erfolgt, wie zB hier der Header genannt

EditorController.h:

@interface EditorController : UIViewController  {
  UITextView *messageTextView;
}

@property (nonatomic, retain) UITextView *messageTextView;

@end

Schritt 2. Als nächstes müssen Sie den Controller, wie die UITextView Delegierter registrieren. Fortsetzung aus dem obigen Beispiel, hier ist, wie ich die UITextView mit EditorController als Delegierter initialisieren haben ...

- (id) init {
    if (self = [super init]) {
        // define the area and location for the UITextView
        CGRect tfFrame = CGRectMake(10, 10, 300, 100);
        messageTextView = [[UITextView alloc] initWithFrame:tfFrame];
        // make sure that it is editable
        messageTextView.editable = YES;

        // add the controller as the delegate
        messageTextView.delegate = self;
    }

Schritt 3. Und nun das letzte Stück des Puzzles ist Aktion als Reaktion auf die shouldCahngeTextInRange Nachricht zu nehmen, wie folgt:

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range 
  replacementText:(NSString *)text
{
    // Any new character added is passed in as the "text" parameter
    if ([text isEqualToString:@"\n"]) {
        // Be sure to test for equality using the "isEqualToString" message
        [textView resignFirstResponder];

        // Return FALSE so that the final '\n' character doesn't get added
        return FALSE;
    }
    // For any other character return TRUE so that the text gets added to the view
    return TRUE;
}

Swift Code

Implementieren UITextViewDelegate in Ihrer Klasse / Blick wie folgt:

class MyClass: UITextViewDelegate  { ...

setzen Sie den Textview Delegaten selbst

myTextView.delegate = self

Und dann implementieren, um die folgenden:

  func textViewDidChange(_ textView: UITextView) {
    if textView.text.characters.count >= 1 {

        if let lastChar = textView.text.characters.last {

            if(lastChar == "\n"){

              textView.text = textView.text.substring(to: textView.text.index(before: textView.text.endIndex))
              textView.resignFirstResponder()
            }
        }
    }
}

Bearbeiten Ich den Code aktualisiert, weil es nie eine gute Idee ist es, die Benutzereingabe in einem Textfeld auf eine workarround zu ändern und nicht das Zurücksetzen den Zustandes nach dem Hack Code abgeschlossen.

Sie können auch Tastatur, wenn Note in Aussicht Bildschirm auszublenden:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
     UITouch * touch = [touches anyObject];
     if(touch.phase == UITouchPhaseBegan) {
        [txtDetail resignFirstResponder];
      }
 }

Swift Antwort:

override func viewDidLoad() {
    super.viewDidLoad()
    let tapGestureReconizer = UITapGestureRecognizer(target: self, action: "tap:")
    view.addGestureRecognizer(tapGestureReconizer)
}

func tap(sender: UITapGestureRecognizer) {
    view.endEditing(true)
}

Ich habe diesen Code Responder zu ändern.

 - (BOOL)textView:(UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
    {
        if ([text isEqualToString:@"\n"]) {
            //[textView resignFirstResponder];
            //return YES;
            NSInteger nextTag = textView.tag + 1;
            // Try to find next responder
            UIResponder* nextResponder = [self.view viewWithTag:nextTag];
            if (nextResponder) {
                // Found next responder, so set it.
                [nextResponder becomeFirstResponder];
            } else {
                // Not found, so remove keyboard.
                [textView resignFirstResponder];
            }
            return NO; 


            return NO;
        }
        return YES;

    }

Ok. Jeder hat Antworten mit Tricks gegeben, aber ich denke, der richtige Weg, dies durch

zu erreichen ist

Anschließen der folgenden Aktion auf die " Did End On Exit " Veranstaltung in Interface Builder. (Rechtsklick auf die TextField und cntrl zieht von ‚ Haben am Austrittsende ‘ das folgenden Verfahren.

-(IBAction)hideTheKeyboard:(id)sender
{
    [self.view endEditing:TRUE];
}
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range  replacementText:(NSString *)text
{
    if (range.length==0) {
        if ([text isEqualToString:@"\n"]) {
            [txtView resignFirstResponder];
            if(textView.returnKeyType== UIReturnKeyGo){

                [self PreviewLatter];
                return NO;
            }
            return NO;
        }
    }   return YES;
}
+ (void)addDoneButtonToControl:(id)txtFieldOrTextView
{
    if([txtFieldOrTextView isKindOfClass:[UITextField class]])
    {
        txtFieldOrTextView = (UITextField *)txtFieldOrTextView;
    }
    else if([txtFieldOrTextView isKindOfClass:[UITextView class]])
    {
        txtFieldOrTextView = (UITextView *)txtFieldOrTextView;
    }

    UIToolbar* numberToolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0,
                                                                          0,
                                                                          [Global returnDeviceWidth],
                                                                          50)];
    numberToolbar.barStyle = UIBarStyleDefault;


    UIBarButtonItem *btnDone = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"btn_return"]
                                                                style:UIBarButtonItemStyleBordered
                                                               target:txtFieldOrTextView
                                                               action:@selector(resignFirstResponder)];

    numberToolbar.items = [NSArray arrayWithObjects:btnDone,nil];
    [numberToolbar sizeToFit];

    if([txtFieldOrTextView isKindOfClass:[UITextField class]])
    {
         ((UITextField *)txtFieldOrTextView).inputAccessoryView = numberToolbar;
    }
    else if([txtFieldOrTextView isKindOfClass:[UITextView class]])
    {
         ((UITextView *)txtFieldOrTextView).inputAccessoryView = numberToolbar;
    }
}

Die Frage fragt, wie es mit der Return-Taste zu tun, aber ich denke, das jemanden mit der Absicht, helfen könnte nur Tastatur verschwinden, wenn UITextView mit:

@IBOutlet weak var textView: UITextView!

private func addToolBarForTextView() {
  let textViewToolbar: UIToolbar = UIToolbar()
  textViewToolbar = UIBarStyle.Default
  textViewToolbar = [
    UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Done, target: self, action: #selector(self.cancelInput)),
    UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: self, action: nil),
    UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: self, action: #selector(self.doneInput))
  ]
  textViewToolbar()
  self.textView.inputAccessoryView = textViewToolbar //do it for every relevant textView if there are more than one
}

func doneInput() {
  self.textView.resignFirstResponder()
}

func cancelInput() {
  self.textView.text = ""
  self.textView.resignFirstResponder()
}

Anruf addToolBarForTextView () in der viewDidLoad oder eine anderen Lebenszyklus-Methode.

Es scheint, dass die perfekte Lösung für mich ist.

Cheers,

Murat

Ich weiß, es ist nicht die genaue Antwort auf diese Frage, aber ich fand diesen Thread nach dem Internet nach unten auf eine Antwort zu jagen. Ich gehe davon aus anderen dieses Gefühl teilen.

Dies ist meine Varianz der UITapGestureRecognizer, die ich zuverlässig und einfach zu bedienen -. Nur die Delegierten des Textview an die Viewcontroller gesetzt

Statt ViewDidLoad füge ich die UITapGestureRecognizer, wenn die Textview zur Bearbeitung aktiv werden:

-(void)textViewDidBeginEditing:(UITextView *)textView{
    _tapRec = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap:)];

    [self.view addGestureRecognizer: _tapRec];
    NSLog(@"TextView Did begin");
}

Wenn ich außerhalb des Textview tippen, wird die Ansicht beendet Editiermodus und die UITapGestureRecognizer entfernt sich so ich mit anderen Kontrollen in der Ansicht die Interaktion fortgesetzt werden kann.

-(void)tap:(UITapGestureRecognizer *)tapRec{
    [[self view] endEditing: YES];
    [self.view removeGestureRecognizer:tapRec];
    NSLog(@"Tap recognized, tapRec getting removed");
}

Ich hoffe, das hilft. Es scheint so offensichtlich, aber ich habe nie diese Lösung überall im Web gesehen - bin ich etwas falsch zu machen

Vergessen Sie nicht, die Delegaten für die Textview einstellen - sonst ResignFirstResponder wird nicht funktionieren.

Versuchen Sie dies.

NSInteger lengthOfText = [[textView.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length];

Für Xcode 6.4., Swift 1.2. :

   override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent)
    {
        super.touchesBegan(touches, withEvent: event)
        if let touch = touches.first as? UITouch
        {
            self.meaningTextview.resignFirstResponder()
        }
    }

Sie sollten UIToolbar hinzufügen UITextView nach oben leicht zu machen, anstatt shouldChangeTextIn mit

In Swift 4

let toolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50))
        toolbar.barStyle = .default
        toolbar.items = [
            UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil),
            UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(doneAction))
        ]
        textView.inputAccessoryView = toolbar
@objc func doneAction(){
 self.textView.resignFirstResponder()
}
-(BOOL)textFieldShouldReturn:(UITextField *)textField; // called from textfield (keyboard)

-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text; // good tester function - thanks
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top