UItableView one cell repeats 13 times in each section - ios

I'm developing an iOS app using objective-c. I'm having custom cell in UITableview. the section and rows in section count is unknown every time ,
the problem I'm facing is each row in one section repeats 13 times then same with next section my code for tableview is
static NSString *cellIdentifier = #"Cell";
ProductCell *cell = [self.tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
cell = [[ProductCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
NSDate *dateRepresentingThisDay = [self.sorteddays objectAtIndex:indexPath.section];
eventsOnThisDay = [self.sections objectForKey:dateRepresentingThisDay];
double interval =[[eventsOnThisDay objectAtIndex:indexOfDateWithTime] doubleValue];
NSDate *celldate=[[NSDate alloc]initWithTimeIntervalSince1970:interval];
NSDateFormatter *dateFormatter=[[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:#"dd-MMM-yyyy h:mm a"];
cell.TitleLabel.text=[NSString stringWithFormat:#"%#", [eventsOnThisDay objectAtIndex:indexOfTitle]];
cell.DateTimeLabel.text=[NSString stringWithFormat:#"%#", [dateFormatter stringFromDate:celldate]];
cell.NameLabel.text=[NSString stringWithFormat:#"%#", [eventsOnThisDay objectAtIndex:indexOfName]];
cell.backgroundColor=[UIColor clearColor];
return cell;
self.section is NSDictionary with date key for particular product array/arrays on that day and i am getting this kind of result

I notice that the data for display for every row is based on dateRepresentingThisDay,but the value of it, is based on section. Check your code:
NSDate *dateRepresentingThisDay = [self.sorteddays objectAtIndex:indexPath.section];
So, in the same section, for all cell's the data is the same!

Related

Set FireDate of UILocalNotification based on the (Dynamic) value of Label

My problem is I have a Custom Cell which contains a label.
The value of label would be fetched via webServices which would be in TIME .Initially if we go by static data i.e. for e.g.: 10:54 PM, then on click of that cell it should set me a reminder of that value set on label.And off course should notify me on the said time.
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
CC *cell=(CC*)[tableView cellForRowAtIndexPath:indexPath];
NSDate *currentDate=[NSDate date];
NSString *dateStr= cell.timeLabel.text;
UILocalNotification *localNotification =[[UILocalNotification alloc]init];
NSTimeZone *gmt = [NSTimeZone timeZoneWithAbbreviation:#"GMT"];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setLocale:[NSLocale currentLocale]];
[dateFormatter setDateStyle:NSDateFormatterNoStyle];
[dateFormatter setTimeStyle:NSDateFormatterShortStyle];
[dateFormatter setDateFormat:#"hh:mm a"];
[dateFormatter setTimeZone:gmt];
[dateFormatter setDateFormat:#"yyyy-MM-dd"];
NSString *preFix=[dateFormatter stringFromDate:currentDate];
NSString *datetoFire=[NSString stringWithFormat:#"%# %#",preFix,dateStr];
[dateFormatter setDateFormat:#"yyyy-MM-dd hh:mm a"];
NSLog(#"date is %#",[dateFormatter dateFromString:datetoFire]);
if (localNotification==nil) {
return;
}
localNotification.fireDate=[dateFormatter dateFromString:datetoFire];
localNotification.timeZone=[NSTimeZone defaultTimeZone];
localNotification.alertBody=#"Good Morning dude..!";
localNotification.repeatInterval=0; //The default value is 0, which means don't repeat.
localNotification.soundName=UILocalNotificationDefaultSoundName;
[[UIApplication sharedApplication]scheduleLocalNotification:localNotification];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
CC *cell = (CC *) [tableView dequeueReusableCellWithIdentifier:#"CC"];
if (cell == nil) {
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:#"CC" owner:self options:nil];
cell = (CC *) [nib objectAtIndex:0];
}
return cell;
}
I tried doing this, but this isn't working.
Thank You.
Take a dynamic array that will contain values populated from webservice and put populated time to cell dynamically in your cell.In cellForRow method.
I have taken static array as given below
time = [[NSMutableArray alloc] initWithObjects:#"5:35 PM",#"4:56 AM",#"6:00 PM",#"7:32 AM",nil];
you have to put values in this array dynamically as u will get populated data from webservice.
and reload table.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
CC *cell = (CC *) [tableView dequeueReusableCellWithIdentifier:#"CC"];
if (cell == nil) {
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:#"CC" owner:self options:nil];
cell = (CC *) [nib objectAtIndex:0];
}
cell.textLabel.text=[time objectAtIndex:indexPath.row];
return cell;
}
And in did select method assign fire date from array not from cell text label as
NSString *dateStr=[time objectAtIndex:indexPath.row];

adding multiple contents in a cell

i am new in iphone devlpmnt.i just want to add current date in the cell. i need "notiftext" appear left of the cell and current date on the right.thanks in advance
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
AppDelegate *AppD = (AppDelegate *)[[UIApplication sharedApplication]delegate];
static NSString *CellIdentifier = #"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell == nil) {
cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier]autorelease];
}
MLNotifMessage *list = [AppD.storage objectAtIndex:indexPath.row];
cell.textLabel.text = list.notifText;
NSString *dteStr = [[NSString alloc]init];
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setTimeZone:[NSTimeZone timeZoneWithName:#"Europe/London"]];
[dateFormat setDateFormat:#"dd/MM/yyyy HH:mm:ss"];
dteStr = [dateFormat stringFromDate:list.date];
[dateFormat release];
cell.detailTextLabel.text = dteStr;
return cell;
}
Use any other style of the cell or use custom cell to fully customize the cell. I think for your question tabel view stye UITableViewCellStyleValue1 is enough.
cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier]autorelease];
cell.textLabel.text = list.notifText;
cell.detailTextLabel.text = [NSDate date];
use Custom TableViewCell. You can make custom tableViewCell by subclassing it

NSMutableArray and NSMutableDictionary in a TableView

I have a problem with using an NSMutableArray and NSMutableDictionary.
I've created a quiz that when it stops, it should display the current score and date in a tableview. It should then display those values in a tableview. But nothing is displayed in the tableview when I load its viewController. The mutableArray is created in the viewDidLoad: method. Is my code correct, or am I missing something here?
- (IBAction)saveResult:(id)sender {
dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:NSLocalizedString(#"DATE", nil)];// #"HH:mm zz"];
dateNow = [NSDate date];
NSString *formattedDateString = [dateFormatter stringFromDate:dateNow];
// Add the quiz result to the array, reload the data in the tableview
highscoreAndDate = [NSMutableDictionary dictionaryWithObjectsAndKeys:
[NSString stringWithFormat:#"%i points", score], #"kResult",
formattedDateString, #"kDate", nil];
[highscore addObject:highscoreAndDate];
[tableView reloadData];
}
My tableView methods:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [highscore count];
}
- (UITableViewCell *)tableView:(UITableView *)_tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = #"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat: #"HH:mm zz"];
cell.detailTextLabel.text = [[highscore objectAtIndex:indexPath.row] objectForKey:#"kResult"];
cell.detailTextLabel.text = [[highscore objectAtIndex:indexPath.row] objectForKey:#"kDate"];
return cell;
}
#Anoop Vaidya.
You got me going on the right track. I put the NSLog statement when the objects are added and it shows that the row count of my array is going up. So my code is correct.
I figured out that it was due to my connections in my XIB file (very embarrassing!). Should have spotted that my self. I had hooked up my tableview outlets to the wrong viewController and so the tableview was never populated.
Very sorry for have taken up your time and thanks to everybody who responded so quickly. Glad I got it fixed. :)

iOS - Very weird issue with tableView realodData

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = #"Cell";
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
[cell setBackgroundColor:[UIColor lightGrayColor]];
cell.textLabel.textColor = [UIColor lightTextColor];
cell.textLabel.backgroundColor = nil;
cell.detailTextLabel.textColor = [UIColor darkGrayColor];
cell.detailTextLabel.backgroundColor = nil;
// Get list of local notifications
NSArray *notificationArray = [[UIApplication sharedApplication] scheduledLocalNotifications];
UILocalNotification *notif = [notificationArray objectAtIndex:indexPath.row];
// Display notification info
[cell.textLabel setText:notif.alertBody];
NSDateFormatter *format = [[NSDateFormatter alloc] init];
[format setDateFormat:#"MMM dd 'at' HH:mm"];
NSString *dateString = [format stringFromDate:notif.fireDate];
NSString *textData = [[NSString alloc]initWithFormat:#"%#",dateString];
[cell.detailTextLabel setText:textData];
//[notif.fireDate description]
[self.tableView reloadData];
return cell;
}
Everything goes absoloutely normal if i DONT write "[self.tableView reloadData];", but if I do, seems like the cell is there but its not being displayed (the cell separator disappear according to the number of cells the tableview has)
I need to reloadData so the user won't need to get out of the view and load the view again to display updated information.
Any suggestion?
You dont need to add [self.tableView reloadData]; inside cellForRowAtIndexPath, this is absolutely wrong, since calling reloadData will again call cellForRowAtIndexPath which as you experienced will create very weird issues
In general you normally call [self.tableView reloadData]; whenever you want to change all or some of the contents of the UITableView
Create a function to check if new data is available (maybe implement a refresh button/pull to refresh). If new data is available call [self.tableView reloadData];.

Custom UITableViewCells's UITextField mixing up after scrolling

I created a custom UITableViewCell with a UITextField, UILabels and UIButtons. When I enter a value to a UITextField and scroll down, it disappears and shows in another random cell. The same problem happens with my UIButton, when I press it, the state is changing but after I scroll down, it disappears.
Here is my cellForRowAtIndexPath:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = #"produktCell";
//NSString *CellIdentifier = [NSString stringWithFormat:#"produktCell %d",indexPath.row];
ProduktTableViewCell *cell =(ProduktTableViewCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
NSLog(#"wird neu erstellt");
cell = [[ProduktTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];
cell.produktnameLabel.text = [managedObject valueForKey:#"produktname"];
if ([[managedObject valueForKey:#"vondatum"] length] > 1){
cell.vonDatumLabel.text = [managedObject valueForKey:#"vondatum"];
cell.bisDatumLabel.text = [managedObject valueForKey:#"bisdatum"];
}else {
cell.vonDatumLabel.text = dateString;
cell.bisDatumLabel.text = dateString1;
}
cell.datumButton.tag = indexPath.row;
cell.warenkorbButton.tag = indexPath.row;
cell.menge.tag = indexPath.row + 437812;
cell.mengeLabel.text = [managedObject valueForKey:#"mengelabel"];
cell.produktnameLabel.tag = indexPath.row +22333;
cell.mengeLabel.tag =indexPath.row;
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
NSLocale *german = [[NSLocale alloc] initWithLocaleIdentifier:#"de_DE"];
[formatter setLocale:german];
[formatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[formatter setMinimumFractionDigits:2];
[formatter setMaximumFractionDigits:2];
NSNumber *firstNumber = [managedObject valueForKey:#"preis"];
cell.preisLabel.text = [formatter stringFromNumber:firstNumber];
return cell;
}
EDIT: i fixed my problem with the textfield. i just delete the method:
/*- (void) scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
[[self.tableView superview] endEditing:YES];
}*/
but there is still a problem with my button.
My best guess, is that your cells that are being re-used, are receiving the same behavior of the cell that you just interacted with. You can try something quick to see what I mean. Comment this:
Edit:
ProduktTableViewCell *cell =(ProduktTableViewCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
NSLog(#"wird neu erstellt");
cell = [[ProduktTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
Put this instead:
ProduktTableViewCell *cell = [[ProduktTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
This way your new cells won't get the same "state" as the previous cell. What you need to do next, is to know which cell are you working on. Besides that you still need to reset the state of new cells. To finish, uncomment what I told you to comment (since you want your cells to be re-usable)

Resources