Pytanie iOS UITextView lub UILabel z klikalnymi linkami do akcji [duplicate]


To pytanie już zawiera odpowiedź:

Chcę zrobić UILabel lub UITextView z tekstem zawierającym 2 klikalne linki. Nie linki do stron internetowych, ale chcę połączyć te 2 linki z działaniami, jak zrobiłbym z UIButton. Wszystkie przykłady, które widziałem, to linki do linków do stron, ale tego nie chcę. Jak dobrze, tekst zostanie przetłumaczony na inne języki, więc pozycje muszą być dynamiczne.

Chcesz to zrobić:

enter image description here


67
2017-12-12 11:00


pochodzenie


Możesz po prostu nakładać przezroczyste przyciski na podkreślony tekst. - βhargavḯ
możesz też wybrać gest - kamalesh kumar yadav
Nie mogę nakładać przezroczystych przycisków na tekst, ponieważ zostanie on przetłumaczony na inne języki, więc pozycje ulegną zmianie. - Michael Koper
Dlaczego nie chcesz korzystać z widoku internetowego? - Sviatoslav Yakymiv
Ponieważ tekst nie jest dużo na stronach warunków i chcę, aby był zgryźliwy dla użytkownika. A także, po prostu chcesz wiedzieć, czy to możliwe. Być może będę musiał zrobić widoki internetowe w końcu. - Michael Koper


Odpowiedzi:


Musiałem rozwiązać ten sam problem: bardzo podobny tekst z tymi dwoma linkami w nim, w wielu wierszach i wymagający, aby mógł być przetłumaczony na dowolny język (w tym różne polecenia słowne itp.). Właśnie to rozwiązałem, więc pozwól mi podzielić się tym, jak to zrobiłem.

Początkowo myślałem, że powinienem utworzyć przypisany tekst, a następnie zmapować lokalizację dotknięcia dotykiem do regionów w tym tekście. Chociaż uważam, że jest to wykonalne, uważam też, że jest to zbyt skomplikowane podejście.

Oto co zrobiłem zamiast tego:

PODSUMOWANIE:

  • Masz bardzo prosty, niestandardowy znacznik w swojej angielskiej wiadomości, aby móc przeanalizować różne elementy
  • Poinstruuj swoich tłumaczy, aby opuścili znaczniki i przetłumaczyli resztę
  • Masz UIView, który może służyć jako kontener tej wiadomości
  • Podziel swoją angielską wiadomość na kawałki, aby oddzielić zwykły tekst od klikalnego tekstu
  • Dla każdego elementu utwórz UILabel na pojemniku UIView
  • W przypadku klikalnych elementów ustaw styl, pozwól interakcji użytkownika i utwórz narzędzie do rozpoznawania gestów
  • Wykonaj bardzo proste księgowanie, aby idealnie umieścić słowa w całej linii

SZCZEGÓŁ:

W widoku kontrolera viewDidLoad Umieściłem to:

[self buildAgreeTextViewFromString:NSLocalizedString(@"I agree to the #<ts>terms of service# and #<pp>privacy policy#", 
                                                     @"PLEASE NOTE: please translate \"terms of service\" and \"privacy policy\" as well, and leave the #<ts># and #<pp># around your translations just as in the English version of this message.")];

Wzywam metodę, która zbuduje wiadomość. Zwróć uwagę na znaczniki, które wymyśliłem. Możesz oczywiście wymyślić własną, ale kluczem jest to, że zaznaczam również końce każdego klikalnego regionu, ponieważ obejmują one wiele słów.

Oto metoda, która umieszcza wiadomość razem - patrz poniżej. Najpierw rozbijam angielską wiadomość na # postać (lub raczej @"#" strunowy). W ten sposób otrzymam każdy element, dla którego muszę utworzyć etykietę osobno. Pętlę ich i szukam podstawowych znaczników <ts> i <pp> aby wykryć, które fragmenty są linkami do czego. Jeśli fragment tekstu, z którym pracuję, jest linkiem, to trochę stylizuję i ustawię dla niego rozpoznawcę gestów. Oczywiście usuwam też znaki alfabetu. Myślę, że jest to naprawdę łatwy sposób na zrobienie tego.

Zwróć uwagę na pewne subtelności, na przykład w jaki sposób radzę sobie ze spacjami: po prostu odbieram spacje z (zlokalizowanego) ciągu znaków. Jeśli nie ma spacji (chińskiej, japońskiej), nie będzie również spacji między porcjami. Jeśli są spacje, to automatycznie usuwają porcje w razie potrzeby (np. Dla języka angielskiego). Kiedy jednak muszę umieścić słowo na początku następnego wiersza, muszę się upewnić, że usunięto z tego tekstu dowolny przedrostek spacji, ponieważ w przeciwnym razie nie jest on poprawnie wyrównany.

- (void)buildAgreeTextViewFromString:(NSString *)localizedString
{
  // 1. Split the localized string on the # sign:
  NSArray *localizedStringPieces = [localizedString componentsSeparatedByString:@"#"];

  // 2. Loop through all the pieces:
  NSUInteger msgChunkCount = localizedStringPieces ? localizedStringPieces.count : 0;
  CGPoint wordLocation = CGPointMake(0.0, 0.0);
  for (NSUInteger i = 0; i < msgChunkCount; i++)
  {
    NSString *chunk = [localizedStringPieces objectAtIndex:i];
    if ([chunk isEqualToString:@""])
    {
      continue;     // skip this loop if the chunk is empty
    }

    // 3. Determine what type of word this is:
    BOOL isTermsOfServiceLink = [chunk hasPrefix:@"<ts>"];
    BOOL isPrivacyPolicyLink  = [chunk hasPrefix:@"<pp>"];
    BOOL isLink = (BOOL)(isTermsOfServiceLink || isPrivacyPolicyLink);

    // 4. Create label, styling dependent on whether it's a link:
    UILabel *label = [[UILabel alloc] init];
    label.font = [UIFont systemFontOfSize:15.0f];
    label.text = chunk;
    label.userInteractionEnabled = isLink;

    if (isLink)
    {
      label.textColor = [UIColor colorWithRed:110/255.0f green:181/255.0f blue:229/255.0f alpha:1.0];
      label.highlightedTextColor = [UIColor yellowColor];

      // 5. Set tap gesture for this clickable text:
      SEL selectorAction = isTermsOfServiceLink ? @selector(tapOnTermsOfServiceLink:) : @selector(tapOnPrivacyPolicyLink:);
      UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                                   action:selectorAction];
      [label addGestureRecognizer:tapGesture];

      // Trim the markup characters from the label:
      if (isTermsOfServiceLink) 
        label.text = [label.text stringByReplacingOccurrencesOfString:@"<ts>" withString:@""];
      if (isPrivacyPolicyLink)  
        label.text = [label.text stringByReplacingOccurrencesOfString:@"<pp>" withString:@""];
    }
    else
    {
      label.textColor = [UIColor whiteColor];
    }

    // 6. Lay out the labels so it forms a complete sentence again:

    // If this word doesn't fit at end of this line, then move it to the next
    // line and make sure any leading spaces are stripped off so it aligns nicely:

    [label sizeToFit];

    if (self.agreeTextContainerView.frame.size.width < wordLocation.x + label.bounds.size.width)
    {
      wordLocation.x = 0.0;                       // move this word all the way to the left...
      wordLocation.y += label.frame.size.height;  // ...on the next line

      // And trim of any leading white space:
      NSRange startingWhiteSpaceRange = [label.text rangeOfString:@"^\\s*"
                                                          options:NSRegularExpressionSearch];
      if (startingWhiteSpaceRange.location == 0)
      {
        label.text = [label.text stringByReplacingCharactersInRange:startingWhiteSpaceRange
                                                         withString:@""];
        [label sizeToFit];
      }
    }

    // Set the location for this label:
    label.frame = CGRectMake(wordLocation.x,
                             wordLocation.y,
                             label.frame.size.width,
                             label.frame.size.height);
    // Show this label:
    [self.agreeTextContainerView addSubview:label];

    // Update the horizontal position for the next word:
    wordLocation.x += label.frame.size.width;
  }
}

A oto moje metody, które obsługują wykryte kliknięcia na tych linkach.

- (void)tapOnTermsOfServiceLink:(UITapGestureRecognizer *)tapGesture
{
  if (tapGesture.state == UIGestureRecognizerStateEnded)
  {
    NSLog(@"User tapped on the Terms of Service link");
  }
}


- (void)tapOnPrivacyPolicyLink:(UITapGestureRecognizer *)tapGesture
{
  if (tapGesture.state == UIGestureRecognizerStateEnded)
  {
    NSLog(@"User tapped on the Privacy Policy link");
  }
}

Mam nadzieję że to pomoże. Jestem pewien, że jest wiele mądrzejszych i bardziej eleganckich sposobów na zrobienie tego, ale właśnie to udało mi się wymyślić i działa dobrze.

Oto, jak wygląda w aplikacji:

Simulator screenshot of the end result

Powodzenia! :-)

Erik


96
2018-03-21 05:43



Ładne rozwiązanie. Co mam zrobić, jeśli chcę podkreślić tekst na temat prywatności i warunków, zamiast nadawać mu kolorowego charakteru? - iBug
Najlepszym sposobem podkreślenia słów jest ustawienie przypisanego ciągu znaków. Można określić podkreślenie w przypisanym łańcuchu i istnieją różne opcje podkreślenia do wyboru. To, co jest w tym miłe, w porównaniu do rysowania samemu na przykład, to to, że podkreślenie będzie starannie łamane na nisko wiszących literach, takich jak "g", "j" i "y" itp. - Erik van der Neut
Na przykład, aby ustawić ładne, grube podkreślenie, możesz zrobić coś takiego: NSMutableAttributedString * underlinedString = [[NSMutableAttributedString alloc] initWithString: label.text]; [podkreślenieString addAttribute: (NSString *) wartość kCTUnderlineStyleAttributeName: [NSNumber numberWithInt: kCTUnderlineStyleThick] zakres: (NSRange) {prefix.length, word.length}]; label.attributedText = underlinedString; - Erik van der Neut
Podczas pisania tego, zobaczysz wiele różnych opcji wyskakujących dla stylu podkreślenia, gdy zaczniesz pisać "kCTUnderline" - wybierz styl z listy: przerywany, pełny, podwójny, gruby itp. - Erik van der Neut
PODSUMOWANIE dla podkreślenia: podążaj za tym samym kodem co napisałem w roztworze, ale zamień logikę na kolorowanie słowa poprzez ustawienie podkreślenia przez NSMutableAttributedString. - Erik van der Neut


Jak zaimplementować niestandardowe akcje tekstowe (np. Przycisk) dla UITextView:

Najważniejsze zasady:

  1. Posługiwać się NSAttributedString jako sposób definiowania łącza do dotknięcia.
  2. Posługiwać się UITextViewDelegate złapać naciśnięcie linku.

Zdefiniuj ciąg adresu URL:

private let kURLString = "https://www.mywebsite.com"

Dodaj link do przypisanego ciągu:

let originalText = "Please visit the website for more information."
let attributedOriginalText = NSMutableAttributedString(string: originalText)

let linkRange = attributedOriginalText.mutableString.range(of: "website")
attributedOriginalText.addAttribute(.link, value: kURLString, range: linkRange)

Przypisz przypisany ciąg do widoku tekstowego:

textView.attributedText = attributedOriginalText

Wprowadzić w życie UITextViewDelegate (jest to naprawdę kluczowy element, który zapobiega otwieraniu strony internetowej URL i gdzie możesz zdefiniować własne działanie):

func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool {
    if (URL.absoluteString == kURLString) {
        // Do whatever you want here as the action to the user pressing your 'actionString'
    }
    return false
}

Możesz także dostosować sposób wyświetlania linku:

textView.linkTextAttributes = [
    NSAttributedStringKey.foregroundColor.rawValue : UIColor.red,
    NSAttributedStringKey.underlineStyle.rawValue : NSUnderlineStyle.styleSingle]

W jaki sposób implementuję niestandardowe akcje dla UILabel:

Zwykle używam TTTAttributedLabel.


35
2017-12-16 19:17



To najlepsza odpowiedź IMO. Bardzo prosta - xleon
Ważne: linki w widokach tekstowych są interaktywne tylko wtedy, gdy widok tekstowy można wybrać, ale nie można go edytować. Oznacza to, że jeśli wartość UITextView selectable właściwość jest TAK i isEditable właściwość to NIE. - Sirens


Oto pełny przykład wykonany w Swift 2 bez strąków.

import UIKit

class SomeViewController: UIViewController, UITextViewDelegate {
  @IBOutlet weak var terms: UITextView!

  let termsAndConditionsURL = "http://www.example.com/terms";
  let privacyURL = "http://www.example.com/privacy";

  override func viewDidLoad() {
    super.viewDidLoad()

    self.terms.delegate = self
    let str = "By using this app you agree to our Terms and Conditions and Privacy Policy"
    let attributedString = NSMutableAttributedString(string: str)
    var foundRange = attributedString.mutableString.rangeOfString("Terms and Conditions")
    attributedString.addAttribute(NSLinkAttributeName, value: termsAndConditionsURL, range: foundRange)
    foundRange = attributedString.mutableString.rangeOfString("Privacy Policy")
    attributedString.addAttribute(NSLinkAttributeName, value: privacyURL, range: foundRange)
    terms.attributedText = attributedString
  }

  func textView(textView: UITextView, shouldInteractWithURL URL: NSURL, inRange characterRange: NSRange) -> Bool {
    if (URL.absoluteString == termsAndConditionsURL) {
      let myAlert = UIAlertController(title: "Terms", message: nil, preferredStyle: UIAlertControllerStyle.Alert)
      myAlert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
      self.presentViewController(myAlert, animated: true, completion: nil)
    } else if (URL.absoluteString == privacyURL) {
      let myAlert = UIAlertController(title: "Conditions", message: nil, preferredStyle: UIAlertControllerStyle.Alert)
      myAlert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
      self.presentViewController(myAlert, animated: true, completion: nil)
    }
    return false
  }
}

21
2018-04-13 16:30



Działa świetnie, najpierw walczę, ale stwierdziłem, że widoki tekstu muszą mieć właściwość do wybrania w YE i można je edytować w NIE, aby działało. - Raúl Juárez
Świetne i proste: D - Chlebta
Dzięki Paulo! Również do ciebie Raul za cynk. Pracował jak urok - Kuldeep Kapade


Sprawdź tę klasę UILabel, to na pewno ci pomoże. Zrobiłem to samo, używając tego.

TTTAttributedLabel


10
2017-12-12 11:27





Oto przetłumaczona wersja zaakceptowanej odpowiedzi na C # dla Xamarin dla każdego, kto uzna to za przydatne:

        var str = "Or, #<li>log in# to see your orders."; 
        var strParts = str.Split('#');
        var ptWordLocation = new PointF (0, 0);

        if (strParts.Length > 1) {
            //Loop the parts of the string
            foreach (var s in strParts) {
                //Check for empty string
                if (!String.IsNullOrEmpty (s)) {
                    var lbl = new UILabel ();
                    lbl.Font = lbl.Font.WithSize (15);
                    lbl.TextColor = cpAppConstants.TextColorMessage;
                    lbl.UserInteractionEnabled = s.Contains ("<li>");
                    lbl.Text = s.Replace ("<li>", "");

                    if (s.Contains ("<li>")) {
                        lbl.TextColor = UIColor.FromRGB (200, 95, 40);

                        //Set tap gesture for this clickable text:
                        var gesture = new UITapGestureRecognizer ();
                        gesture.AddTarget(() => buildLoginLabel_onTap(gesture));
                        lbl.AddGestureRecognizer (gesture);
                    }

                    lbl.SizeToFit ();

                    //Lay out the labels so it forms a complete sentence again
                    if (vw.Frame.Width < ptWordLocation.X + lbl.Bounds.Size.Width) {
                        ptWordLocation.X = 0f;
                        ptWordLocation.Y += lbl.Frame.Size.Height;
                        lbl.Text.Trim ();
                    }

                    lbl.Frame = new RectangleF (ptWordLocation.X, ptWordLocation.Y, lbl.Frame.Size.Width, lbl.Frame.Size.Height);
                    vw.AddSubview (lbl);

                    //Update the horizontal width
                    ptWordLocation.X += lbl.Frame.Size.Width;
                }
            }
        }

5
2018-02-13 15:38





Kliknij tutaj wiedzieć, jak ustawić Listener dla textView

i dodaj

     UITapGestureRecognizer *listener = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapAction:)];

Napisz działanie, które chcesz wykonać w ramach

 - (void)tapAction:(UITapGestureRecognizer *)sender
{
}

Dodaj słuchacza do widoku według

      [self.view addGestureRecognizer:listener];

2
2017-12-12 13:12



Nie zapomnij ustawić userInteractionEnabled do YES - iCoder


Użyłem rozwiązania Erika, ale musiałem to zrobić za pomocą Swifta. Po konwersji znalazłem mały problem, w którym, jeśli masz dużo tekstu (więcej niż jedną linię), zanim dotarłeś do linku, to nie był on prawidłowo zawijany, więc dodałem funkcję dopasowaną do tekstu.

func setText(newText:String){

    // 1. Split the localized string on the # sign:
    let localizedStringPieces:NSArray = newText.componentsSeparatedByString("#")

    // 2. Loop through all the pieces:
    var msgChunkCount:Int = localizedStringPieces.count

    var wordLocation:CGPoint = CGPointMake(0.0, 0.0)

    for (var i:Int = 0; i < msgChunkCount; i++){

        let chunk:String = localizedStringPieces[i] as! String

        if chunk == ""{
            continue;     // skip this loop if the chunk is empty
        }

        // 3. Determine what type of word this is:
        let isTermsOfServiceLink:Bool = chunk.hasPrefix("<ts>")
        let isPrivacyPolicyLink:Bool  = chunk.hasPrefix("<pp>")
        let isLink:Bool = (Bool)(isTermsOfServiceLink || isPrivacyPolicyLink)


        var remainingText:String = chunk

        while count(remainingText)>0{

            // 4. Create label, styling dependent on whether it's a link:
            let label:UILabel = UILabel()
            label.font = UIFont.systemFontOfSize(methodFontSize)
            label.text = remainingText
            label.userInteractionEnabled = isLink

            if (isLink){
                label.textColor = UIColor(red: 110/255, green: 181/255, blue: 229/255, alpha: 1.0)
                label.highlightedTextColor = UIColor.yellowColor()

                // 5. Set tap gesture for this clickable text:
                var selectorAction:Selector =  isTermsOfServiceLink ? "tapOnTermsOfServiceLink" : "tapOnPrivacyPolicyLink"

                let tapGesture:UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: selectorAction)

                label.addGestureRecognizer(tapGesture)

                // Trim the markup characters from the label:
                if (isTermsOfServiceLink){
                    label.text = label.text?.stringByReplacingOccurrencesOfString("<ts>", withString: "", options: nil, range: nil)
                }
                if (isPrivacyPolicyLink){
                    label.text = label.text?.stringByReplacingOccurrencesOfString("<pp>", withString: "", options: nil, range: nil)
                }
            }else{
                label.textColor = UIColor.whiteColor()
            }

            // If this chunk of text doesn't fit at end of this line, then move it to the next
            // line and make sure any leading spaces are stripped off so it aligns nicely:

            label.sizeToFit()

            let labelHeight = label.frame.size.height

            var leftOverText:String = fitLabelToWidth(label, width: self.textContainer.frame.size.width - wordLocation.x)

            // if we can't fit anything onto this line then drop down
            if label.text == "" {
                //drop to a new line
                wordLocation.x = 0.0                       // move this word all the way to the left...

                wordLocation.y += labelHeight;  // ...on the next line.  (Have to use a constant here because if label has no text it also has no height)

                // refit the text
                label.text = remainingText
                leftOverText = fitLabelToWidth(label, width: self.textContainer.frame.size.width - wordLocation.x)

                //NB WE ARE ASSUMING HERE THAT AFTER DROPPING DOWN AT LEAST SOME OF THIS TEXT WILL FIT
                // IF THIS ISN'T THE CASE THEN THE LINE WOULD ALWAYS BE TOO BIG AND WE WOULD NEVER BE ABLE TO FIT IT ON ANYWAY!
            }

            // Set the location for this label:
            label.frame = CGRectMake(wordLocation.x, wordLocation.y, label.frame.size.width, label.frame.size.height)

            // Show this label:
            self.textContainer.addSubview(label)

            // Update the horizontal position for the next word:
            wordLocation.x += label.frame.size.width;

            // update our remaining text and get ready to go again
            remainingText = leftOverText
        }

    }

}

// fit the text label (formatted externally) to the desired with, chopping off text to make it so
// return the remaining text that didn't make the cut as a string
func fitLabelToWidth(label:UILabel, width:CGFloat)->String{
    let startingText:String = label.text!
    println("Trying to fit ::\(startingText)::")


    // if the string is null then we are done
    if startingText == ""{
        return ""
    }

    // if this fits already then we are done
    label.sizeToFit()
    if label.frame.size.width <= width{
        return ""
    }

    // so now we have to loop round trying to get this to fit
    var cutRange:Range<String.Index> = Range<String.Index>(start: startingText.startIndex, end: startingText.startIndex)
    var searchRange:Range<String.Index>

    var startSearchIndex:String.Index = startingText.startIndex
    var lastSearchIndex:String.Index = startSearchIndex

    var testText:String = ""
    var lastText:String = ""
    label.text = testText
    label.sizeToFit()

    while label.frame.size.width <= width{

        // store off the last used text as this might be as far as we go
        lastText = testText
        lastSearchIndex = startSearchIndex

        // set up the search range so we look for spaces missing out any previous ones
        searchRange = Range<String.Index>(start: startSearchIndex, end: startingText.endIndex)

        // cut out a range with the next occurrence of spaces
        cutRange = startingText.rangeOfString(" ", options: NSStringCompareOptions.CaseInsensitiveSearch, range: searchRange, locale: nil)!

        // get some text from the start of the string to our cut point (start)
        testText = startingText.substringToIndex(cutRange.startIndex)

        // move the search start to the point after the end of the spaces we just found
        startSearchIndex = cutRange.endIndex

        // try this in our label to see if it sizes ok
        label.text = testText
        label.sizeToFit()


    }

    // we leave the while when the string gets too big
    label.text = lastText
    label.sizeToFit()

    return startingText.substringFromIndex(lastSearchIndex)

}

1
2018-06-02 10:48





Możesz użyć poniższego kodu, aby dodać gest kliknięcia na UILable: -

Krok 1:

Delegate "UIGestureRecognizerDelegate" to your viewcontroller.h 

for example: 
  @interface User_mail_List : UIViewController<UIGestureRecognizerDelegate>

Krok 2:

//create you UILable
UILabel *title_lbl= [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
[title_lbl setText:@"u&me"];
[title_lbl setUserInteractionEnabled:YES];
[yourView addSubview:title_lbl];

Krok 3:

UITapGestureRecognizer *tap= [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(Prof_lbl_Pressed:)];//your action selector
[tap setNumberOfTapsRequired:1];
title_lbl.userInteractionEnabled= YES;
[title_lbl addGestureRecognizer:tap];

Krok 4:

-(void)Prof_lbl_Pressed:(id)sender{
   //write your code action
}

dzięki,


1
2018-02-27 08:53





Moje rozwiązanie dla klikalnych linków do akcji to:

myLabel.automaticLinkDetectionEnabled = YES;
myLabel.urlLinkTapHandler = ^(KILabel *myLabel, NSString *string, NSRange range) {
            [self attemptOpenURL:[NSURL URLWithString:string]];
            NSLog(@"URL tapped %@", string);
        };

Sprawdź również tę klasę UILabel, to ci pomoże.

https://github.com/Krelborn/KILabel


1
2018-04-18 20:10





Możesz korzystać z wielu nakładających się UILabel z userInteractionEnabled = YES na nim i dodaj UITapGestureRecognizer na tej etykiecie z różnymi pogrubionymi czcionkami.

Tutaj jest jednym z takich przykładów robienia tego.

Coś lubię to można też wypróbować.

Jeśli chcesz działającego rozwiązania tego, możesz spróbować "Fancy-Label". Wyszukaj w tym linku tekst "Oto moja implementacja" i kliknij go. Otrzymasz gotowy produkt do użycia. Nie zapomnij kliknąć przycisku "Przełącz" w aplikacji, którą uruchamiasz przy użyciu powyższego przykładu.

Mam nadzieję, że ci pomogę.


0
2017-12-12 11:23