Tankehjälp kring UITextView...

Tråden skapades och har fått 14 svar. Det senaste inlägget skrevs .
1

Jag har en textView kallad: contextAdd.

I den står det när programmet startar: Context i grå stil.
contextAdd är också firstResponder.

Jag vill att när användaren faktiskt börjar redigera så ska default texten försvinna och text färgen sättas till svart.

Här har ni min kod just nu:

- (void)textViewDidBeginEditing:(UITextView *)contextAdd {
		NSLog(@"1: %d", firstTime);
	if(firstTime == 1) {
		[self.contextAdd setTextColor:[UIColor blackColor]];
		[self.contextAdd setText:@""];
	}
}

- (BOOL)textViewShouldBeginEditing:(UITextView *)contextAdd {
	textViewContent = self.contextAdd.text;
	NSString *defaultContent = @Context;

	if([textViewContent isEqual:defaultContent]) {
		self.contextAdd.selectedRange = NSMakeRange(0,0);
		
		if(firstTime = 0) {
			firstTime = firstTime + 1;
		}
		NSLog(@"2: %d", firstTime);
	}
	
	return firstTime;
}

Det intressanta här är att 1: aldrig skrivs ut... så här ligger nog lösning men jag når den inte just nu....

  • Medlem
  • Sollentuna
  • 2010-08-14 20:55

Får du ingen varning om att firstTime aldrig/inte initieras?

  • Medlem
  • 2010-08-14 22:49
Ursprungligen av Mattias Hedman:

Jag har en textView kallad: contextAdd.

I den står det när programmet startar: Context i grå stil.
contextAdd är också firstResponder.

Jag vill att när användaren faktiskt börjar redigera så ska default texten försvinna och text färgen sättas till svart.

Här har ni min kod just nu:

if(firstTime = 0)

Den där raden ser inte bra ut En tilldelning i en if-sats är ett klassiskt misstag i C/C++/ObjC.

if( firstTime == 0)

kanske?

@frazze: Nej inga som helst varningar.

@arc: Där ser du! Jag hade stirrat mig blind på koden, men skumt att komplatorn inte sa till om tilldelning i en if-sats. Självklart ska det vara ==.

Ursprungligen av Mattias Hedman:

@arc: Där ser du! Jag hade stirrat mig blind på koden, men skumt att komplatorn inte sa till om tilldelning i en if-sats. Självklart ska det vara ==.

Det är egentligen inte alltför skumt eftersom det ur Cs perspektiv är helt okej kod.

Ett trick som jag brukar använda för att undvika det är att skriva konstanter till vänster. T. ex. är if (firstTime = 0) godkänd kod medan if (0 = firstTime) kommer att upptäckas av kompilatorn och ge ett felmeddelande.

Problemet kvarstår dock.
Jag vill att defaulttexten ska försvinna när jag börjar redigera inte när textView blir firstResponder.

Jag har letat runt och tror mig ha kommit något på spåren kanske...
Var tror nu om detta?
http://stackoverflow.com/questions/1328638/placeholder-in-uitextview

Senast redigerat 2010-08-15 08:26
  • Medlem
  • 2010-08-15 09:45
Ursprungligen av Mattias Hedman:

Problemet kvarstår dock.
Jag vill att defaulttexten ska försvinna när jag börjar redigera inte när textView blir firstResponder.

Jag har letat runt och tror mig ha kommit något på spåren kanske...
Var tror nu om detta?
Placeholder in UITextView - Stack Overflow

Men kan du inte använda de events som ett UITextField ger ifrån sig när användaren ändrar texten? (bl.a. "Editing did begin")

Edit: Aj då, ser att du har en UITextView och inte UITextField. Då finns ju inga events att ta hand om.

  • Medlem
  • 2010-08-15 10:05

Kan du inte använda

- (void)textViewDidChange: (UITextView *)textView

Den anropas för varje tangenttryckning du gör i ett UITextView så första gången den anropas är när du skriver in första bokstaven i din UITextView. I och med det kan du inte ta bort texten i UITextView helt för då försvinner den första bokstaven. Så då får du ta bort allt utom sista tecknet i UITextView.

[textView setTextColor:[UIColor blackColor]];
NSString *s = [[textView text]substringFromIndex:[[textView text] length] - 1];
[textView setText:s];

Kanske lite väl komplicerat om du nu ändå kommit på någon lösning?

  • Medlem
  • Sollentuna
  • 2010-08-15 09:06

Eller så ser du över vilka varningsflaggor som du har satta. Men det är tidigt på söndag så jag är lite dimmig på det ämnet. Återkommer kanske under dagen när jag tar en paus i klädkammarbygget x2...

Tack frazze!
Jag har kommit en bit på vägen... mycket if-satser blir det. Nu har jag kommit fram till det beteende jag vill ha men nu kan jag inte skriva längre...

- (void)textViewDidBeginEditing:(UITextView *)contextAdd {
		NSLog(@"1: %d", firstTime);
		self.contextAdd.selectedRange = NSMakeRange(0,0);
		[self.contextAdd setTextColor:[UIColor blackColor]];
		[self.contextAdd setText:@""];
}

-(BOOL)textViewShouldBeginEditing:(UITextView *)contextAdd {
	return TRUE;
}

-(void)textChanged:(NSNotification*)notification {
	textViewContent = contextAdd.text;

	if(firstTime >= 1) {
		if(firstTime == 1) {
			[contextAdd setText:@""];
		}
		[self.contextAdd setTextColor:[UIColor blackColor]];
	}
	else {
		[contextAdd setText:@Context];
		[self.contextAdd setTextColor:[UIColor lightGrayColor]];
		self.contextAdd.selectedRange = NSMakeRange(0,0);
		firstTime = firstTime + 1;
	}
}

Jag närmar mig men det är något som saknas...
Som det är nu börjar allt bra men jag kan inte skriva trots att default texten försvinner som den ska. Inte förrän jag har klickat i UITextField och sedan tillbaka så får jag skriva... nu är jag nära känner jag.
Dagas för skogspromenad med familjen.

Problemet som jag upplever det är att den text som är default-text från IB verkar räknas som ett event eller om det är att den blir firstResponder som gör det.

Men jag ska prova helt klart! Återkommer med rapport.

Hmmm okej nu funkar allt förutom att jag bara kan skriva en bokstav... den byts hela tiden när jag skriver... det är något med -1...
Men klickar jag på UITextField och går tillbaka så kan jag skriva som jag vill.

Och jag som gjorde detta eftersom det verkade lättare än att rita ett streck på skärmen.

Senast redigerat 2010-08-15 13:23

Ah! Såja! Nu är det klart!

// TextView förändraringar vid start och när man börjar redigera.
- (void)textViewDidBeginEditing:(UITextView *)contextAdd {
	self.contextAdd.selectedRange = NSMakeRange(0,0);
	if(firstTime == 1) {
		[self.contextAdd setTextColor:[UIColor blackColor]];
		[self.contextAdd setText:@""];
	}
}

-(BOOL)textViewShouldBeginEditing:(UITextView *)contextAdd {
	return TRUE;
}

- (void)textViewDidChange: (UITextView *)contextAdd {
	if(firstTime == 1) {
		[self.contextAdd setTextColor:[UIColor blackColor]];
		NSString *s = [[self.contextAdd text]substringFromIndex:[[self.contextAdd text] length] - 1];
		[self.contextAdd setText:s];
		firstTime = firstTime + 1;	
	}
	
	if(firstTime == 0) {
		[self.contextAdd setText:@Context];
		[self.contextAdd setTextColor:[UIColor lightGrayColor]];
		self.contextAdd.selectedRange = NSMakeRange(0,0);
		firstTime = firstTime + 1;		
	}
}

Nu ska jag bara fixa en metod om man lämar textViewn utan att skriva något så ska default-texten tillbaka.
Men det blir lätt.

Tack arc för dina tips och råd!

Hmmm appen fungerar inte på telefonen... och den funkar inte heller i simulatorn eller snarare den krashar. När firstTime blir 1 och den går in i textViewDidChanges if-sats för att sätta ändra saker i textViewn, då körs substringFromIndex och när man går från textView -> textField -> textView så är texten 0 och substringFromIndex blir då -1. *boom*

  • Medlem
  • 2010-08-15 15:24
Ursprungligen av Mattias Hedman:

och när man går från textView -> textField -> textView

Förstår inte riktigt vad du menar med det här? Det är väl alltid en UITextView?
Och menar du att text-propertyn inte är satt i UITextView? (dvs null)

Det jag menar med -> är att programmet startar med att textView är firstresponder sedan klickar (->) man på textField och sedan textView igen. Alltså samma.

Jag har kommit på en annan idé, vet inte om den är så snygg men men...
Jag har nu lagt en Label med texten i och när textViewDidChange-eventen kommer så gömmer jag labeln. Borde ge samma visuella effekt men enklare för mig.

1
Bevaka tråden