Accurately and seamlessly splitting text into two UILabels - iphone

I'm trying to create a "wrapping" like effect for text around an image that has set dimensions.
___________
........|
........| image
label.1.|
........|___________
....................
.......label.2......
....................
....................
Here is the method im using right now:
- (NSArray *)splitString:(NSString*)str maxCharacters:(NSInteger)maxLength { //this will split the string to add to two UILabels
NSMutableArray *tempArray = [NSMutableArray arrayWithCapacity:1];
NSArray *wordArray = [str componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSInteger numberOfWords = [wordArray count];
NSInteger index = 0;
NSInteger lengthOfNextWord = 0;
while (index < numberOfWords) {
NSMutableString *line = [NSMutableString stringWithCapacity:1];
while ((([line length] + lengthOfNextWord + 1) <= maxLength) && (index < numberOfWords)) {
lengthOfNextWord = [[wordArray objectAtIndex:index] length];
[line appendString:[wordArray objectAtIndex:index]];
index++;
if (index < numberOfWords) {
[line appendString:#" "];
}
}
[tempArray addObject:line];
}
return tempArray;
}
I give it the maxCharacters value of where I want to split the text, which is the max height of the first UILabel. This method is essentially what I want, but sometimes the last line of the first UILabel is "higher" than others leaving a gap between the first UILabel and the second UILabel.
Here is how I use the method:
NSArray *splitStringArray = [self splitString:eventRecord.summary maxCharacters:280];
UILabel *firstSumValue = [[UILabel alloc] init];
NSString *firstSumString = [splitStringArray objectAtIndex:0];
CGSize maxFirstSumSize = CGSizeMake(185.0,150.0);
UIFont *firstSumFont = [UIFont fontWithName:#"HelveticaNeue-Bold" size:12];
CGSize firstSumStringSize = [firstSumString sizeWithFont:firstSumFont
constrainedToSize:maxFirstSumSize
lineBreakMode:firstSumValue.lineBreakMode];
CGRect firstSumFrame = CGRectMake(10.0, presentedValue.frame.origin.y + presentedValue.frame.size.height, 185.0, firstSumStringSize.height);
firstSumValue.frame = firstSumFrame;
firstSumValue.font = [UIFont fontWithName:#"HelveticaNeue" size:12];
firstSumValue.lineBreakMode = UILineBreakModeWordWrap;
firstSumValue.numberOfLines = 0 ;
[self.mainScrollView addSubview:firstSumValue];
firstSumValue.text = [splitStringArray objectAtIndex:0];
UILabel *secondSumValue = [[UILabel alloc] init];
NSInteger isSecond = 0; //no
if([splitStringArray count] > 1){
isSecond = 1; //yes
NSString *secondSumString = [splitStringArray objectAtIndex:1];
CGSize maxSecondSumSize = CGSizeMake(310.0,9999.0);
UIFont *secondSumFont = [UIFont fontWithName:#"HelveticaNeue-Bold" size:12];
CGSize secondSumStringSize = [secondSumString sizeWithFont:secondSumFont
constrainedToSize:maxSecondSumSize
lineBreakMode:secondSumValue.lineBreakMode];
CGRect secondSumFrame = CGRectMake(10.0, firstSumValue.frame.origin.y + firstSumValue.frame.size.height, 310.0, secondSumStringSize.height);
secondSumValue.frame = secondSumFrame;
secondSumValue.font = [UIFont fontWithName:#"HelveticaNeue" size:12];
secondSumValue.lineBreakMode = UILineBreakModeWordWrap;
secondSumValue.numberOfLines = 0 ;
[self.mainScrollView addSubview:secondSumValue];
secondSumValue.text = [splitStringArray objectAtIndex:1];
}
How do I keep everything consistent and aligned properly. Perhaps, there is a better method one could recommend. Not core text because it's out of my scope of knowledge.

Consider using a UIWebView instead, with the layout defined in a local HTML file. It can save you a lot of headache rather than trying to deal with complex layouts by hand.

Related

limit the UILabel to 500 character and than Truncate the UIlabel in IOS

I want to display first 500 character in UILabel and than display Truncate icon if there is more than 500 character available.But i dont know how can i limit 500 character to truncate the text?.
Here is my code
label2 = [[UILabel alloc] initWithFrame:CGRectMake(0, 350, self.bounds.size.width, 30)];
// In this case value of self.bounds.size.width is "427"
label2.backgroundColor = [UIColor clearColor];
label2.numberOfLines = 2;
label2.textAlignment = UITextAlignmentCenter;
label2.font = [UIFont systemFontOfSize:13];
[self addSubview:label2]
//Here is Implimentation code of my label
NSString *temp = [galleryEntryTree objectForKey:#"description"];// calling lebel text from database
coverView.label2.text = temp;
coverView.label2.adjustsFontSizeToFitWidth = NO;
coverView.label2.lineBreakMode = UILineBreakModeTailTruncation;
Just tell me guys how can i display min 500 character and than truncate it( if longer than 500)
Any help is appreciated
Just truncate the string if it's longer than 500 characters. Only caveat: make sure to not break it in the middle of a surrogate pair:
NSString *temp = [galleryEntryTree objectForKey:#"description"];
if ([temp length] > 500) {
NSRange range = [temp rangeOfComposedCharacterSequencesForRange:(NSRange){0, 500}];
temp = [temp substringWithRange:range];
temp = [temp stringByAppendingString:#" …"];
}
coverView.label2.text = temp;
To display only 500 character just use below code:
NSString *string = YOUR_TEXT;
if ([string length] >500) {
string = [string substringToIndex:500];
}
Hope this will help you.
All the best !!!
Here is how to do it in Swift 2.2:
let maxLength = 500
if originalString.characters.count > maxLength {
let range = originalString.rangeOfComposedCharacterSequencesForRange(Range<String.Index>(originalString.startIndex ..< originalString.startIndex.advancedBy(maxLength)))
let tmpValue = originalString.substringWithRange(range).stringByAppendingString(" …")
// use tmpValue
}
try this one it'l helps you.
label2 = [[UILabel alloc] initWithFrame:CGRectMake(0, 350, self.bounds.size.width, 30)];
// In this case value of self.bounds.size.width is "427"
label2.text=#"your text................................";
if([label2.text length]>500)
label2.text=[label2.text substringToIndex:500];
label2.backgroundColor = [UIColor clearColor];
label2.numberOfLines = 2;
label2.textAlignment = UITextAlignmentCenter;
label2.font = [UIFont systemFontOfSize:13];
[self addSubview:label2]
It can be simply done by
NSString *LabelNewText = [YourLabelName.text substringToIndex:500];
Here 500 or less than 500 characters will be displayed and all the characters exceeding that will be truncated.
NSString *string = LabelNewText.text;
if ([string length] >500)
{
string = [string substringToIndex:500];
}
Swift 3.0 version
let maxLength = 300 //char length
if originalString.characters.count > maxLength {
let range = originalString.rangeOfComposedCharacterSequences(for: originalString.startIndex..<originalString.index(originalString.startIndex, offsetBy: maxLength))
let tmpValue = originalString.substring(with: range).appending("...")
}

Appending a string with string in ios

I am in a problem with some text sharing to evernote,sharing evernote is success,but here is my current situation with code. I have a UITableView which has some text and title for that corresponding text. When the share button is clicked it will share the text onebyone to evernote website, but the title remains static. There I get the first title name along with diffrent text. My code for this is in my tableview in rowAtIndexPath
NSMutableString *strr=[[NSMutableString alloc]initWithString:[appDelegate.indexArray objectAtIndex:indexPath.section]];
cell.textLabel.text =strr ;
cell.textLabel.text = [appDelegate.indexArray objectAtIndex:row];
cell.textLabel.font = [UIFont fontWithName:#"Georgia" size:14.0];
cell.textLabel.textColor = [UIColor brownColor];
[appDelegate.notesArray objectAtIndex:row]];
//cell.detailTextLabel.text =notes;
cell.detailTextLabel.font = [UIFont fontWithName:#"Georgia" size:14.0];
cell.detailTextLabel.textColor = [UIColor darkGrayColor];
cell.detailTextLabel.text = [appDelegate.notesArray objectAtIndex:row];
appDelegate.indexArray is the title content for each cell and appDelegate.notesArray has the textnote for the corresponding titles.
In shareButton click:
NSMutableString *str = [[NSMutableString alloc] initWithString:#"NOTES:"];
for (int i = 0; i<[appDelegate.notesArray count]; i++) {
NSString * aString = [[NSString alloc] initWithString:[appDelegate.notesArray objectAtIndex:i]] ;
NSString * ENML= [NSString stringWithFormat:#"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE en-note SYSTEM \"http://xml.evernote.com/pub/enml2.dtd\">\n<en-note>%#",aString];
ENML = [NSString stringWithFormat:#"%#%#", ENML, #"</en-note>"];
NSLog(#"%#", ENML);
// Adding the content & resources to the note
[note setContent:ENML];
This will give the one by one upload of notetext.but for title I include this code
NSMutableString *strtitle = [[NSMutableString alloc] initWithString:#"myBibleApp"];
for (int i = 0; i<[appDelegate.indexArray count];i++ ) {
NSString * aStringtitle = [[NSString alloc] initWithString:[appDelegate.indexArray objectAtIndex:i]] ;
/* NSString *ENMLtitle = [NSString stringWithFormat:#"%#%#", aStringtitle];
NSLog(#"%#", ENMLtitle);*/
note.title = aStringtitle;
But here is my problem it uplode the title and text in double. That means, I have one text with title. When I click the sharebutton it uploads two times.1=2,2=4,3=6 like that.
Nut only addding the title I get this problem. If I put the title static,note.title =#"statictitle". It will not repeat the upload. How can I append the string in correct way?
Please help me.
Thanks in advance.
Two things I noted:
The use of NSMutableString is not needed. Just write for the first case
cell.textLabel.text = [appDelegate.indexArray objectAtIndex:indexPath.section];
For the 2 other cases you don't use the string at all (or it's not shown in your code).
In the for-loops, you're always overwriting aString and aStringtitle, and that even with a new alloc. Appending goes like this:
NSString *aString = #"";
for ...
aString = [aString stringByAppendingString:[appDelegate.indexArray objectAtIndex:i]];
or
aString = [aString stringByAppendingFormat:#" %#", [appDelegate.indexArray objectAtIndex:i]];
Check the NSString Class Reference for details.

Access last line while using UILineBreakModeWordWrap UILabel in iPhone

I am displaying a long string using UILabel with UILineBreakModeWordWrap. It is showing the string perfectly by wrapping text in UILabel. I want to access last line of UILabel. Does anyone know how to do this on an iPhone?
So I tried some stuff and searched a little around. What you wuld actually need is to count the word wraps and somehow detect the last string. But I didnt really figuere out how to do that.
So my sollution is something like this:
Your String //I googled some longer String
NSString *string = #"Standing across the room, I saw you smile\nSaid I want to talk to you-oo-oo for a little while\nBut before I make my move my emotions start running wild\nMy tongue gets tied and that's no lie\nLooking in your eyes\nLooking in you big brown eyes ooh yeah\nAnd I've got this to say to you\nHey!\nGirl I want to make you sweat\nSweat till you can't sweat no more\nAnd if you cry out\nI'm gonna push it some, more, more\nGirl I want to make you sweat\nSweat till you can't sweat no more\nAnd if you cry out\nI'm gonna push it\nPush it, push it some more";
Your Label:
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(20, 20, 280, 440)];
label.font = [UIFont fontWithName:#"Helvetica" size:14];
label.lineBreakMode = UILineBreakModeWordWrap;
label.numberOfLines = 0;
label.backgroundColor = [UIColor clearColor];
label.textColor = [UIColor blackColor];
label.text = string;
The call this Method:
NSString *result = [self getLastLineFromString:string];
NSLog(#"Result: %#", result);
getLastLineFromString: looks like this:
- (NSString *)getLastLineFromString: (NSString *)string{
NSArray *a = [string componentsSeparatedByString:#" "];
NSString *result = [a objectAtIndex:[a count]-1];
NSString *temp = #"";
int count = 1;
BOOL myBool = YES;
while (myBool) {
count++;
temp = result;
result = [a objectAtIndex:[a count] -count];
result = [NSString stringWithFormat:#"%# %#", result, temp];
NSLog(#"length: %i",[self lengthOfString:result]);
NSLog(#"result: %#",result);
//131 was a value i detected mayels, i guess u have do trick a little around to find a mathcing one for yourself
if ([self lengthOfString:result] >= 131) {
myBool = NO;
}
}
return result;
}
And The MethodlengthOfString: looks like this:
- (int)lengthOfString:(NSString *)string{
CGSize size1 = [string sizeWithFont:[UIFont fontWithName:#"Helvetica" size:14]];
return size1.width;
}
Output:
2012-01-06 16:17:08.341 get length[5472:207] result: it
Push it, push it some more
I know this is not a perfect sollution, but it might help you.

Objects added as subview to scrollview are not showing up

I am trying to add elements to a scroll view using this code:
int missionCount;
[connection release];
NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
NSDictionary *missionsDict = [responseString JSONValue];
/*NSArray *luckyNumbers = [json objectWithString:responseString error:&error];*/
NSLog(#"user Info array is: %#", missionsDict);
// NSDictionary *array = [luckyNumbers1 objectForKey:#"data"];
NSDictionary *missionsData;
missionsData = [missionsDict objectForKey:#"data"];
NSLog(#"missionsData is: %#", missionsData);
NSEnumerator *inner = [missionsData objectEnumerator];
missionsScroll.contentSize = CGSizeMake(768, 1005);
id value;
int badgeY1;
int badgeY2;
int badgeY3;
badgeY1 = 146;
badgeY2 = 188;
badgeY3 = 188;
while((value = [inner nextObject])) {
NSLog(#"value is: %#", value);
NSLog(#"progress is: %#", [value objectForKey:#"progress"]);
NSLog(#"user Info array is: %#", missionsDict);
NSLog(#"name is: %#",[value objectForKey:#"reward_definitions"]);
NSLog(#"missionsData is: %#", missionsData);
NSDictionary *moreData;
moreData = [value objectForKey:#"reward_definitions"];
NSEnumerator *inner2 = [moreData objectEnumerator];
id value2;
int badgeX;
int badgeCount;
badgeX = 0;
badgeCount = 0;
while((value2 = [inner2 nextObject])) {
UIProgressView *progressView;
progressView = [[UIProgressView alloc] initWithFrame:CGRectMake(323, badgeY1, 372, 9)];
float progressValue;
progressValue = ([[[value objectForKey:#"progress"] objectForKey:#"earned"] floatValue] / [[[value objectForKey:#"progress"] objectForKey:#"possible"] floatValue]);
NSLog(#"progressValue is: %f", progressValue);
[progressView setProgress:progressValue];
[missionsScroll addSubview:progressView];
UILabel *missionName;
missionName = [[UILabel alloc] initWithFrame:CGRectMake(66, badgeY1, 227, 21)];
missionName.backgroundColor = [UIColor clearColor];
missionName.textColor = [UIColor whiteColor];
missionName.font = [UIFont fontWithName:#"Heiti TC" size:23.0];
missionName.text = [value objectForKey:#"name"];
[missionsScroll addSubview:missionName];
UILabel *requirementsLabel;
requirementsLabel = [[UILabel alloc] initWithFrame:CGRectMake(66, badgeY2+25, 227, 21)];
requirementsLabel.backgroundColor = [UIColor clearColor];
requirementsLabel.textColor = [UIColor whiteColor];
requirementsLabel.font = [UIFont fontWithName:#"Papyrus" size:19];
requirementsLabel.text = #"To complete you need:";
[missionsScroll addSubview:requirementsLabel];
NSLog(#"Image URL is: %#", [value2 objectForKey:#"image_url"]);
NSURL *url1 = [NSURL URLWithString: [NSString stringWithFormat:#"%#", [value2 objectForKey:#"image_url"]]];
NSData *urlData1 = [NSData dataWithContentsOfURL:url1];
UIImage *image1 = [UIImage imageWithData:urlData1];
UIImageView *badge = [[UIImageView alloc] initWithImage:image1];
[badge setFrame:CGRectMake(badgeX, badgeY2+70, 70, 70)];
[missionsScroll addSubview:badge];
[badge release];
badgeCount = badgeCount+1;
NSLog(#"badgeCount is: %i", badgeCount);
if (badgeCount == 4) {
NSLog(#"Badge Count = 4");
badgeY2 = badgeY2 +70;
badgeX = 0;
badgeCount = 0;
} else {
NSLog(#"Badge Count ≠ 4");
badgeX = badgeX +75;
}
}
NSLog(#"1st While loop done");
// NSLog(#"reward_definitions is: %#", [missionsData objectForKey:#"id"]);
// NSLog(#"Image URL is: %#", [[value objectForKey:#"reward_definitions"] objectForKey:#"image_url"]);
//if ( [array isKindOfClass:[NSDictionary class]] ) {
badgeY1 = badgeY1 +200;
badgeY2 = badgeY2 +200;
badgeY3 = badgeY3 +200;
missionCount = missionCount+1;
}
NSLog(#"While loops done");
for (int a; missionCount > 4; a = a+1) {
missionsScroll.contentSize = CGSizeMake(776, missionsScroll.contentSize.height+200);
}
Nothing is showing up in the scroll view.
It's not obvious what is happening, but first things to check are where the views are valid (not nil) and that this code is running on the main thread.
Put these in and post the results.
NSLog(#"missionsScroll: %#", (missionsScroll==nil)?#"NIL":#"OK");
NSLog(#"progressView: %#", (progressView==nil)?#"NIL":#"OK");
NSLog(#"missionName: %#", (missionName==nil)?#"NIL":#"OK");
NSLog(#"mainThread: %#", ([NSThread isMainThread])?#"OK":#"Background Thread");
Your code is quite convoluted and very difficult to read. Perhaps you could check if your complicated coordinates calculations work as expected, e.g.
NSLog(#"Frame of badge %#", NSStringFromCGRect(badge.frame));
How many times are your while loops iterating? The outer loop increases the y-position of your labels. But the labels will only be displayed at the end of the run loop / start of the next run loop. If you exit this method with the labels with a high y-value then you'll not see them. (It doesn't matter how many times you change the y-value while you're running this code. The display will only update when it's all done.)
** Correction ** You seem to be adding new views each time around your while loop. So in fact I'd expect you to have multiple copies of the subviews appearing when they finally get displayed.
(There's a lot of code to wade through here. If my answer is way off, you might get better answers, but trimming back some of the code and isolating the issue.)

UITableView crashes when scrolling

I load a UITableView with data, see code below, and all works well initially. However, when i scroll the table view it crashes. I cannot find where the dealloc problem is and wonder if someone nice and experienced could give me a hint?
I have updated this post with the full code including the loading of the array.
The 'retain'(s) was put there for testing.
When i take a way the cellValue1 i do not have the problem but then i do not have any data to display.
I get the following message:
[CFString isEqualToString:]: message sent to deallocated instance 0x5e5ae70
- (void)viewDidLoad {
[super viewDidLoad];
self.title = #"Topplista";
AccessPlayerData *readPlayerDataFunction = [AccessPlayerData new];
NSMutableArray *leaderboardArray = [[NSMutableArray alloc] initWithCapacity:0];
leaderboardArray = [readPlayerDataFunction readPlayersFileForLeaderBoard];
cellArray1 = [[NSMutableArray alloc]init];
cellArray2 = [[NSMutableArray alloc]init];
NSString *keyName = [[NSString alloc]init]; // Player name
double percentCorrectAnswers = 0; // % correct answers
double nrCorrectAnswers = 0; // # correct answers
double totalNrQuestions = 0; // # questions ever answered
nrOfPlayers = [leaderboardArray count] / 3;
keyName = [leaderboardArray objectAtIndex:3];
nrCorrectAnswers = [[leaderboardArray objectAtIndex:4]doubleValue];
totalNrQuestions = [[leaderboardArray objectAtIndex:5]doubleValue];
percentCorrectAnswers = (nrCorrectAnswers / totalNrQuestions) * 100;
int loop = 0;
int loop2 = 2;
int counter = 1;
for (int oo = 0; oo < nrOfPlayers; oo++) {
if ([[leaderboardArray objectAtIndex:loop2]intValue] > 0) {
keyName = [leaderboardArray objectAtIndex:loop];
loop++;
nrCorrectAnswers = [[leaderboardArray objectAtIndex:loop]doubleValue];
loop++;
totalNrQuestions = [[leaderboardArray objectAtIndex:loop]doubleValue];
loop++;
percentCorrectAnswers = (nrCorrectAnswers / totalNrQuestions) * 100;
[cellArray1 addObject:keyName]; // Player name
[cellArray1 addObject:[NSNumber numberWithDouble:totalNrQuestions]];
[cellArray1 addObject:[NSNumber numberWithDouble:nrCorrectAnswers]];
[cellArray1 addObject:[NSNumber numberWithDouble:percentCorrectAnswers]];
counter++;
}
else {
loop = loop + 3;
}
loop2 = loop2 + 3;
}
self.sortArray;
rowCount = [cellArray1 count];
[keyName retain];
[readPlayerDataFunction release];
[keyName release];
[leaderboardArray release];
}
- (void)sortArray {
//outputArray
NSMutableArray *dummyArray = [[NSMutableArray alloc]initWithCapacity:0];
NSMutableArray *editPlayerArray = [[NSMutableArray alloc] initWithArray:cellArray1];
NSArray *sortedArray = [[NSArray alloc]init];
int nrOfActivePlayers = [cellArray1 count] / 4;
int counteR = 2;
for (int qq = 0; qq < nrOfActivePlayers; qq++) {
[dummyArray addObject:[cellArray1 objectAtIndex:counteR]];
counteR = counteR + 4;
}
// Sort the array
sortedArray = [dummyArray sortedArrayUsingSelector:#selector(compare:)];
int rank = 0;
int roller = [editPlayerArray count] / 4;
int oldNrAnswers = 0;
NSMutableArray *finalArray = [[NSMutableArray alloc]initWithCapacity:0];
for (int qq = nrOfActivePlayers - 1; qq > -1; qq--) {
counteR = 2;
for (int rr = 0; rr < roller; rr++) {
if ([[editPlayerArray objectAtIndex:counteR]intValue] == [[sortedArray objectAtIndex:qq]intValue]) {
//=====FIX RANKING IF THERE IS MORE THAN ONE PLAYER WITH THE SAME RESULT=====//
if ([[editPlayerArray objectAtIndex:counteR]intValue] == oldNrAnswers) {
if (rank == 0) rank = 1;
}
else {
rank++;
}
[finalArray addObject:[NSNumber numberWithInt:rank]]; // Rank
[finalArray addObject:[editPlayerArray objectAtIndex:counteR - 2]]; // Player name
[finalArray addObject:[editPlayerArray objectAtIndex:counteR - 1]]; // Asked questions
[finalArray addObject:[editPlayerArray objectAtIndex:counteR]]; // Correct answers
oldNrAnswers = [[editPlayerArray objectAtIndex:counteR]intValue];
[finalArray addObject:[editPlayerArray objectAtIndex:counteR + 1]]; // % correct answers
[editPlayerArray removeObjectAtIndex:counteR - 2];
[editPlayerArray removeObjectAtIndex:counteR - 2];
[editPlayerArray removeObjectAtIndex:counteR - 2];
[editPlayerArray removeObjectAtIndex:counteR - 2];
roller = [editPlayerArray count] / 4;
break;
}
else {
counteR = counteR + 4;
}
}
}
[sortedArray retain];
[cellArray1 removeAllObjects];
nrOfPlayers = [finalArray count] / 5;
counteR = 0;
NSString *cellValue1 = [[NSString alloc]init];
NSString *cellValue2 = [[NSString alloc]init];
//======FORMAT THE ARRAY INTO TWO ARRAYS FOR DEPLOYMENT=======//
for (int qq = 0; qq < nrOfPlayers; qq++) {
cellValue1 = [NSString stringWithFormat:#"%i. %# (Antal rätt svar: %.0f)",
[[finalArray objectAtIndex:counteR]intValue],
[finalArray objectAtIndex:counteR + 1],
[[finalArray objectAtIndex:counteR + 3]doubleValue]];
cellValue2 = [NSString stringWithFormat:#"Antal frågor: %.0f : Procent rätt svar: %.1f%%",
[[finalArray objectAtIndex:counteR + 2]doubleValue],
[[finalArray objectAtIndex:counteR + 4]doubleValue]];
counteR = counteR + 5;
[cellArray1 addObject:cellValue1];
[cellArray2 addObject:cellValue2];
}
[dummyArray release];
[editPlayerArray release];
[sortedArray release];
[finalArray release];
[cellValue1 release];
[cellValue2 release];
}
- (UITableViewCell *) getCellContentView:(NSString *)cellIdentifier {
CGRect CellFrame = CGRectMake(0, 0, 300, 60);
CGRect Label1Frame = CGRectMake(10, 10, 290, 25);
CGRect Label2Frame = CGRectMake(30, 33, 270, 25);
UILabel *lblTemp;
UITableViewCell *cell = [[[UITableViewCell alloc] initWithFrame:CellFrame reuseIdentifier:cellIdentifier] autorelease];
//Initialize Label with tag 1.
lblTemp = [[UILabel alloc] initWithFrame:Label1Frame];
lblTemp.backgroundColor = [UIColor orangeColor];
[lblTemp setFont:[UIFont fontWithName:#"American Typewriter" size:16]];
lblTemp.tag = 1;
[cell.contentView addSubview:lblTemp];
[lblTemp release];
//Initialize Label with tag 2.
lblTemp = [[UILabel alloc] initWithFrame:Label2Frame];
lblTemp.backgroundColor = [UIColor orangeColor];
lblTemp.tag = 2;
[lblTemp setFont:[UIFont fontWithName:#"American Typewriter" size:13]];
lblTemp.textColor = [UIColor whiteColor];
[cell.contentView addSubview:lblTemp];
[lblTemp release];
return cell;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = #"Cell";
tableView.backgroundColor = [UIColor orangeColor];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell == nil)
cell = [self getCellContentView:CellIdentifier];
UILabel *lblTemp1 = (UILabel *)[cell viewWithTag:1];
UILabel *lblTemp2 = (UILabel *)[cell viewWithTag:2];
NSLog(#" ");
NSLog(#" ");
NSLog(#" ");
NSLog(#"============");
NSLog(#"cA1: %i", [cellArray1 count]);
NSLog(#"cA2: %i", [cellArray2 count]);
NSLog(#"rowCount %i", rowCount);
NSLog(#"ixP row: %i", indexPath.row);
NSString *cellValue1 = [cellArray1 objectAtIndex:indexPath.row];
// NSString *cellValue2 = [cellArray2 objectAtIndex:indexPath.row];
[cellValue1 retain]; // for testing
// [cellValue2 retain]; // for testing
NSLog(#"cV1: %#", cellValue1);
NSLog(#"cV2: %#", #"cellValue2");
lblTemp1.text = cellValue1;
lblTemp2.text = #"cellValue2";
return cell;
}
Here is the result:
2011-03-09 21:33:23.850 FamQuiz_R0_1[842:207] cV2: cellValue2
2011-03-09 21:33:23.850 FamQuiz_R0_1[842:207]
2011-03-09 21:33:23.851 FamQuiz_R0_1[842:207]
2011-03-09 21:33:23.851 FamQuiz_R0_1[842:207]
2011-03-09 21:33:23.852 FamQuiz_R0_1[842:207] ============
2011-03-09 21:33:23.852 FamQuiz_R0_1[842:207] cA1: 7
2011-03-09 21:33:23.853 FamQuiz_R0_1[842:207] cA2: 7
2011-03-09 21:33:23.853 FamQuiz_R0_1[842:207] rowCount 7
2011-03-09 21:33:23.853 FamQuiz_R0_1[842:207] ixP row: 5
2011-03-09 21:33:23.854 FamQuiz_R0_1[842:207] cV1: 5. Barnspelare (Antal rätt svar: 2)
2011-03-09 21:33:23.854 FamQuiz_R0_1[842:207] cV2: cellValue2
2011-03-09 21:33:27.370 FamQuiz_R0_1[842:207]
2011-03-09 21:33:27.371 FamQuiz_R0_1[842:207]
2011-03-09 21:33:27.371 FamQuiz_R0_1[842:207]
2011-03-09 21:33:27.372 FamQuiz_R0_1[842:207] ============
2011-03-09 21:33:27.373 FamQuiz_R0_1[842:207] cA1: 7
2011-03-09 21:33:27.373 FamQuiz_R0_1[842:207] cA2: 7
2011-03-09 21:33:27.374 FamQuiz_R0_1[842:207] rowCount 7
2011-03-09 21:33:27.374 FamQuiz_R0_1[842:207] ixP row: 6
2011-03-09 21:33:27.375 FamQuiz_R0_1[842:207] *** -[CFString retain]: message sent to deallocated instance 0x5b446a0
You shouldn't release cellValue1 releaseand cellValue2. Getting them by calling objectAtIndex: does not retain them.
Here's an idea - perhaps the error is somewhere in here.
UILabel *lblTemp1 = (UILabel *)[cell viewWithTag:1];
UILabel *lblTemp2 = (UILabel *)[cell viewWithTag:2];
NSString *cellValue1 = [cellArray1 objectAtIndex:indexPath.row];
NSString *cellValue2 = [cellArray2 objectAtIndex:indexPath.row];
lblTemp1.text = cellValue1;
lblTemp2.text = cellValue2;
Either [cellArray1 objectAtIndex:indexPath.row] or [cellArray2 objectAtIndex:indexPath.row] is null
OR
[cellArray1 objectAtIndex:indexPath.row] or [cellArray2 objectAtIndex:indexPath.row] is null.
In the first case, the program crashes when you try to assign a value to a null lblTemp1.txt.
In the second case, the program crashes because NSString* cellValue is null and it then tries to display the null string.
You should be able to use the debugger to step through and figure out the values of these things as you go, and figure where the error is happening.
Given that your program initially works then dies when you scroll, I am wondering if the cellArray1 and cellArray2 where you are drawing your values from actually have as much data as the number of lines you have asked the scrollView it to display. Maybe you have less data than the number of lines you have specified in the TableViewDatasource?
The data is being released right after the tableView has been created so when you scroll, the app crashes. Try to post all of the codes in .m file for the people to see the problem. I am sure it's not in the codes you posted.
How do you add the data in cellArray1 and cellArray2. Can you please post the code where you populate these arrays?
It could be the case that you are over-releasing the NSStrings you are adding to the cellArrays.