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. :)
Related
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!
I want to filter an array with predicate and show it in tableView, every row of the array should be displayed in one section, but nothing is shown when I run my app.
When I try it with the unfiltered array it works. I don't know what to do because the two arrays have the same structure, the only difference is that the unfiltered array contains 17 objects and the filtered one 11.
Here's my code:
In viewDidLoad:
//itemsArray gets filled like this:
NSMutableArray *itemsArray = [[NSMutableArray alloc] init];
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:abfahrt,#"Abfahrt",ankunft,#"Ankunft",nil];
[items addObject:dict];
//Date converted to string
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:#"HH:mm"];
NSString *stringDate = [dateFormatter stringFromDate:gDate];
//filtered with stringDate
NSPredicate *predicate = [NSPredicate predicateWithFormat:#"Abfahrt < %#", stringDate];
filteredArray = [itemsArray filteredArrayUsingPredicate:predicate];
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return filteredArray.count;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
return 1;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = #"ErgebnisCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
UILabel *abfahrtLabel = (UILabel *)[cell viewWithTag:1];
UILabel *ankunftLabel = (UILabel *)[cell viewWithTag:2];
abfahrtLabel.text = [[filteredArray objectAtIndex:indexPath.section] objectForKey:#"Abfahrt"];
ankunftLabel.text = [[filteredArray objectAtIndex:indexPath.section] objectForKey:#"Ankunft"];
return cell;
}
Sounds like your filteredArray is empty, meaning your predicate is excluding everything from your list.
Put a breakpoint on the filteredArray line to see what's in there.
Alternately, put a breakpoint inside of numberOfSectionsInTableView, and see what filteredArray.count is. If it's zero, then tweak your predicate until some of your entries can make it through.
You may also find the methods listed under the "identifying and comparing strings" section of the NSStringClassReference to be helpful in forming the predicate you want. Especially any of the "compare" methods.
https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html
I have a PFQueryTableViewController subclass (DebateQueryViewController) that I want to use a custom cell with. The DebateQueryViewController is in a storyboard, and I have the .xib for my custom cell. I have also created .h and .m files for the cell, but I have not changed the code in them, except for adding the outlets for the labels, etc in the xib file.
In the viewDidLoad method of DebateQueryViewController.m file I have this:
[self.tableView registerNib:[UINib nibWithNibName:#"RipDebateTableCell"
bundle:[NSBundle mainBundle]]
forCellReuseIdentifier:#"debateCell"];
I also have these two methods:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 73;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object {
static NSString *CellIdentifier = #"debateCell";
RipDebateTableCell *cell = (RipDebateTableCell * )[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
// Configure the cell
NSDateFormatter *df = [[NSDateFormatter alloc] init];
//[df setLocale:enUSPOSIXLocale];
[df setTimeZone:[NSTimeZone systemTimeZone]];
[df setDateFormat:#"MMM dd, yyyy "];
NSString *my = [df stringFromDate:[object objectForKey:#"Date"]];
NSLog(#"%#", my);
tableView.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0);
cell.titleOf.text = [object objectForKey:#"Topic"];
cell.dateOf.text = [NSString stringWithFormat:#"Date: %#", my];
cell.typeOf.text = #"Debate";
cell.cellTop.image = [UIImage imageNamed:#"table-top"];
//cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
//cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
}
Everything was working perfectly until I tried implementing custom cells, but now the app crashes on the launch image every single time.
I had the table cells showing the data correctly, but then made a custom cell and class so that I would have more control over the layout...but I can't get my custom cell to show the data..it just shows the labels with their placeholder text...what am I missing?
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.results.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = #"CellResults";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
// Configure the cell...
ResultsCell *resultscell = (ResultsCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
NSManagedObject *result = [self.results objectAtIndex:indexPath.row];
NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:#"MMMM dd, yyyy"];
[dateFormatter setTimeZone:[NSTimeZone localTimeZone]];
NSString *eventDate = [dateFormatter stringFromDate:[self trialDate]];
// formatting
resultscell.labelEventDesc.numberOfLines = 0;
// populate the cells
[resultscell.labelEventDesc setText:[NSString stringWithFormat:#"%#",[result valueForKey:#"eventdesc"]]];
[resultscell.labelWeeksOut setText:[NSString stringWithFormat:#"%#",[result valueForKey:#"weeksout"]]];
[resultscell.labelEventDate setText:[NSString stringWithFormat:#"%#",eventDate]];
return cell;
}
You're creating 2 different cell instances (cell and resultscell), configuring one and returning the other. So your custom class instance is never used for anything really.
Remove:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
and change return cell; to return resultscell;.
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