Odpowiedz na ten temat
Pokaż wyniki od 1 do 10 z 10
  1. Avatar Moriquendi
    Dołączył
    Oct 2009
    Skąd
    Zamość
    Postów
    233

    Cytuj | #1

    Hej,

    Mam obiekt:
    Kod:
    UITextField *myTextField;
    Użytkownik wprowadza na klawiaturze iphone'a tekst do tego pola tekstowego i wszystko śmiga.

    Chciałbym jednak ograniczyć maksymalną ilość wpisywanych znaków do tego pola.
    Jak to zrobić?

    Póki co tylko napisałem funkcję która jest wywoływana za każdym razem gdy tekst ulegnie zmianie.
    Kiedy rozmiar napisu jest większy od 10, skracam go.

    Kod:
    - (IBAction)textFieldEdited:(id)sender
    {
    	NSString *n_string = nil;
    	
    	if([myTextField.text length] == 10)
    	{
    		n_string = [myTextField.text substringToIndex: [myTextField.text length] - 1]; 
    		
    		myTextField.text = n_string // ERROR - crash
    	}
    
    }
    Problemem jest ta linijka:
    Kod:
    myTextField.text = n_string // ERROR
    Rozumiem, że nie można tak przypisywać NSStringów...
    Jak więc mogę to zrobić ? :/
    Komputer: iMac 27"
    Telefon: iPhone 3G
    Tablet: iPad 2 64GB


  2. Avatar pio11
    Dołączył
    Mar 2008
    Postów
    1,591

    Cytuj | #2

    Kod:
    myTextField.text = [NSString stringWithString:n_string];
    Pozdrawiam
    Komputer: Mac Mini C2D 2.0 | 120 GB | 500 GB | 3 GB RAM | Lion
    Telefon: LG-P500 iPhone 3G 16 GB | 4.2.1 - R.I.P
    Tablet: iPad 32 GB WiFi - 3G - znaleziono pod choinką

  3. Avatar Moriquendi
    Dołączył
    Oct 2009
    Skąd
    Zamość
    Postów
    233

    Cytuj | #3

    Dzięki :]
    Komputer: iMac 27"
    Telefon: iPhone 3G
    Tablet: iPad 2 64GB

  4. Avatar danteusz
    Dołączył
    Jun 2009
    Skąd
    Wrocław-Psie Pole, Wroclaw, Poland, Poland
    Postów
    450

    Cytuj | #4

    Cytat Napisał Moriquendi Zobacz post
    Hej,

    Problemem jest ta linijka:
    Kod:
    myTextField.text = n_string // ERROR
    Rozumiem, że nie można tak przypisywać NSStringów...
    Jak więc mogę to zrobić ? :/
    Brakuje średnika

    A tak na serio, wydaje mi się że to powinno działać. Sposób pio11 jest dobry, jestem tylko ciekaw co to był za błąd i skąd się wziął.
    Komputer: Macbook Pro '11 15 cali
    Telefon: iPhone 3GS

  5. Avatar pio11
    Dołączył
    Mar 2008
    Postów
    1,591

    Cytuj | #5

    O rzeczywiście nie ma średnika . Ale wtedy błąd byłby gdzieś dalej. Tak jak teraz patrzę to oba sposoby działają . Więc sam nie wiem jak to jest
    Komputer: Mac Mini C2D 2.0 | 120 GB | 500 GB | 3 GB RAM | Lion
    Telefon: LG-P500 iPhone 3G 16 GB | 4.2.1 - R.I.P
    Tablet: iPad 32 GB WiFi - 3G - znaleziono pod choinką

  6. Avatar wojtkow SM? Tylko S...


    Dołączył
    May 2007
    Skąd
    Poznań
    Postów
    3,620

    Cytuj | #6

    Oj panowie, panowie.
    Podstawienie:
    Kod:
    myTextField.text = n_string;
    powoduje, że oba wskaźniki (myTextField.text i n_string) wskazują na ten sam obiekt w pamięci.

    Kod w postaci:
    Kod:
    myTextField.text = [NSString stringWithString:n_string];
    Tworzy nową kopię obiektu w pamięci.

    Różnica będzie widoczna po wykonaniu [n_string release];
    Komputer: MBA 11.6" i7 1.8GHz 4GB RAM 256GB SSD, iMac 27" i7 2.8GHz 8GB RAM 240 GB SSD + 1 TB HDD
    Telefon: iPhone 4
    Odtwarzacz: iPhone 4
    Tablet: iPad (2012) 4G, iPad WiFi
    Moje programy w AppStore:
    iOS => Project Planner | Project Planner HD
    OSX => Project Planner Viewer
    Zgodnie z regulaminem nie udzielam porad poprzez PW - masz pytanie, pytaj na forum.

  7. Avatar Moriquendi
    Dołączył
    Oct 2009
    Skąd
    Zamość
    Postów
    233

    Cytuj | #7

    A w tej mojej funkcji, nie mam na koniec
    [n_string release];

    Czy to oznacza, że po opuszczeniu funkcji będę miał wyciek?
    Ja w c++ głównie piszę i mam ciągoty żeby to traktować jako zmienną lokalną ;p
    Komputer: iMac 27"
    Telefon: iPhone 3G
    Tablet: iPad 2 64GB

  8. Avatar danteusz
    Dołączył
    Jun 2009
    Skąd
    Wrocław-Psie Pole, Wroclaw, Poland, Poland
    Postów
    450

    Cytuj | #8

    Cytat Napisał wojtkow Zobacz post
    Oj panowie, panowie.
    Podstawienie:
    Kod:
    myTextField.text = n_string;
    powoduje, że oba wskaźniki (myTextField.text i n_string) wskazują na ten sam obiekt w pamięci.

    Kod w postaci:
    Kod:
    myTextField.text = [NSString stringWithString:n_string];
    Tworzy nową kopię obiektu w pamięci.

    Różnica będzie widoczna po wykonaniu [n_string release];
    OK, ale tak jak pisze Moriquendi, tam nie ma release. String jest inicjowany wartością z textfielda, więc release tam byłby wręcz błędem. Bez szczegółów crasha ciężko powiedzieć co go powoduje.

    Moriquendi, release robisz tam gdzie jest użyty init, copy lub retain, tutaj nie ma takiej potrzeby
    Ostatnio edytowane przez danteusz ; 18.08.2011 o 09:57
    Komputer: Macbook Pro '11 15 cali
    Telefon: iPhone 3GS

  9. Avatar Moriquendi
    Dołączył
    Oct 2009
    Skąd
    Zamość
    Postów
    233

    Cytuj | #9

    Czyli w tym przypadku n_string jest zmienną lokalną która przestaje istnieć po opuszczeniu funkcji.

    Kiedy jednak napiszę
    Kod:
    n_string = [... init/copy/retain];
    to zmienna będzie istnieć tak długo aż ją usunę ponieważ wtedy dokonuje się alokacja ? :>
    Dziwne to obj-c :]
    Komputer: iMac 27"
    Telefon: iPhone 3G
    Tablet: iPad 2 64GB

  10. Avatar danteusz
    Dołączył
    Jun 2009
    Skąd
    Wrocław-Psie Pole, Wroclaw, Poland, Poland
    Postów
    450

    Tu raczej chodzi o to że jak nie ma w inicjalizatorze czegoś o nazwie init to w większości przypadków autorelease jest robiony gdzieś głębiej i nie musisz się tym przejmować
    Komputer: Macbook Pro '11 15 cali
    Telefon: iPhone 3GS

Odpowiedz na ten temat