Pass UILabel text from UITableViewCell to a different function - ios

I've tried searching around for an answer, but have not succeeded in doing so.
I want to pass the text in one of the UILabel's the cell holds. I am not entirely sure on how to do this. I am trying to pass the content of one of the UILabels into the swipeTableViewCell didTriggerRightUtilityWithIndex function, as I am using SWTableViewCell.
The table is populated with items from a mysql table.
This is my current UITableViewCell function:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *simpleTableIdentifier = #"SimpleTableItem";
if([taskArray valueForKey:#"TaskData"] != [NSNull null])
{
GroupDataTableViewCell *cell = (GroupDataTableViewCell*)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
// Add utility buttons
NSMutableArray *rightUtilityButtons = [NSMutableArray new];
[rightUtilityButtons sw_addUtilityButtonWithColor:
[UIColor colorWithRed:1.0f green:0.231f blue:0.188 alpha:1.0f]
title:#"Les mer"];
cell.rightUtilityButtons = rightUtilityButtons;
cell.delegate = self;
if (cell == nil) {
//cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:#"SimpleTableItem" owner:self options:nil];
cell = [nib objectAtIndex:0];
}
NSDictionary *item = [taskArray objectAtIndex:indexPath.row];
if([item objectForKey:#"TaskID"] != [NSNull null])
cell.numberTextField.text = [item objectForKey:#"TaskID"];
if([item objectForKey:#"Title"] != [NSNull null])
cell.titleTextField.text = [item objectForKey:#"Title"];
if([item objectForKey:#"Description"] != [NSNull null])
cell.descriptionTextField.text = [item objectForKey:#"Description"];
if([[selfArray valueForKey:#"CheckStat"] isEqualToString:#"(null)"])
{
cell.accessoryType = UITableViewCellAccessoryNone;
}
else if([[selfArray valueForKey:#"CheckStat"] length] == 0)
{
if ([[item objectForKey:#"CheckStat"] containsString:#"1"])
cell.accessoryType = UITableViewCellAccessoryCheckmark;
else
cell.accessoryType = UITableViewCellAccessoryNone;
}
else
{
for(int i = 0; i < [[[selfArray valueForKey:#"CheckStat"] componentsSeparatedByString:#","] count]; i++)
{
NSString *checkedNumStr = [[[selfArray valueForKey:#"CheckStat"] componentsSeparatedByString:#","] objectAtIndex:i];
//if (i >= [taskArray count] || [checkedNumStr intValue] >= [taskArray count])
//break;
if ([checkedNumStr intValue] == indexPath.row + 1)
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
}
return cell;
}
else
return nil;
}
I want to send the cell.descriptionField.text from there to this code, when the rightUtilityButton is activated:
- (void)swipeableTableViewCell:(SWTableViewCell *)cell didTriggerRightUtilityButtonWithIndex:(NSInteger)index {
switch (index) {
case 0:
{
// More button is pressed
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:#"Bookmark" message:#"Description" delegate:nil cancelButtonTitle:#"OK" otherButtonTitles: nil];
[alertView show];
[cell hideUtilityButtonsAnimated:YES];
break;
}
case 1:
default:
break;
}
}
So, I want the cell.descriptionTextField.text from the first snippet into the second snippet. I am not entirely sure on how to do this, as I am not good with tablecells. I want the cell.descriptionTextField.text from the first snippet to show up in the alertView as the description.

Save your [item objectForKey:#"Description"] into an NSMutableArray previously created, if you order your cells with the same order as the nsmutablearray, you could access this value into your wanted function like this:
- (void)swipeableTableViewCell:(SWTableViewCell *)cell didTriggerRightUtilityButtonWithIndex:(NSInteger)index {
switch (index) {
case 0:
{
// More button is pressed
NSString *desc = [myarray objectAtIndex:index];
// Use your string wherever you want
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:#"Bookmark" message:#"Description" delegate:nil cancelButtonTitle:#"OK" otherButtonTitles: nil];
[alertView show];
[cell hideUtilityButtonsAnimated:YES];
break;
}
case 1:
default:
break;
}
}

Why don't you just store those text in NSString* property within your class and then use wherever you need?

Do not store information in cell object rather than that use datasource to store information.
using index you can get the respective information that was stored in label
In your case you are storing description in label which can be later retrieved as follows
-(void)swipeableTableViewCell:(SWTableViewCell *)cell didTriggerRightUtilityButtonWithIndex:(NSInteger)index
{
NSDictionary *item = [taskArray objectAtIndex:index;
//Do something with the item
}

Related

Get values from a plist file in iOS

I am creating a Plist file as shown below
I want to list all the Items where level is 1 and I can only use accessoryType = UITableViewCellAccessoryCheckmark if level is 1. How can I do it.
I am loading my plist file here:
- (void)viewDidLoad
{
[super viewDidLoad];
countId = 0;
NSDictionary *dict=[[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:#"Topic" ofType:#"plist"]];
self.items=[dict valueForKey:#"Items"];
self.itemsInTable=[[NSMutableArray alloc] init];
[self.itemsInTable addObjectsFromArray:self.items];
[self.menuTableView registerNib:[UINib nibWithNibName:NSStringFromClass([IndicatorTableViewCell class]) bundle:nil] forCellReuseIdentifier:NSStringFromClass([IndicatorTableViewCell class])];
UIBarButtonItem *myButton = [[UIBarButtonItem alloc]
initWithTitle:#"Done"
style:UIBarButtonItemStylePlain
target:self
action:#selector(doneSelection:)];
[self.navigationItem setRightBarButtonItem:myButton];
}
My code for cellForRowAtIndexpath:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *Title= [[self.itemsInTable objectAtIndex:indexPath.row] valueForKey:#"Name"];
return [self createCellWithTitle:Title image:[self.itemsInTable objectAtIndex:indexPath.row] indexPath:indexPath];
}
My code for didSelectRowAtIndexPath is :
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSDictionary *dic=[self.itemsInTable objectAtIndex:indexPath.row];
if([dic valueForKey:#"SubItems"])
{
NSArray *arr=[dic valueForKey:#"SubItems"];
BOOL isTableExpanded=NO;
for(NSDictionary *subitems in arr )
{
NSInteger index=[self.itemsInTable indexOfObjectIdenticalTo:subitems];
isTableExpanded=(index>0 && index!=NSIntegerMax);
if(isTableExpanded) break;
}
if(isTableExpanded)
{
[self CollapseRows:arr];
}
else
{
NSUInteger count=indexPath.row+1;
NSMutableArray *arrCells=[NSMutableArray array];
for(NSDictionary *dInner in arr )
{
[arrCells addObject:[NSIndexPath indexPathForRow:count inSection:0]];
[self.itemsInTable insertObject:dInner atIndex:count++];
}
[self.menuTableView insertRowsAtIndexPaths:arrCells withRowAnimation:UITableViewRowAnimationLeft];
}
}
if([[[dic valueForKey:#"SubItems"]objectAtIndex:0]objectForKey:#"level"])
{
// NSArray *arr=[dic valueForKey:#"SubItems"];
// if ([[arr objectAtIndex:0 ] intValue] == #"1")
{
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
if (cell.accessoryType == UITableViewCellAccessoryNone)
{
if(countId <5)
{
cell.accessoryType = UITableViewCellAccessoryCheckmark;
countId = countId + 1;
}
else
{
UIAlertView *dialog;
dialog =[[UIAlertView alloc] initWithTitle:#"Alert Message"
message:#"Select maximum 5 countries"
delegate:self
cancelButtonTitle:#"Cancel"
otherButtonTitles:#"OK",nil];
[dialog show];
// NSLog(#"Greater then 5");
}
}
else
{
if(countId>0)
{
cell.accessoryType = UITableViewCellAccessoryNone;
countId--;
}
else
{
//show alert
UIAlertView *dialog;
dialog =[[UIAlertView alloc] initWithTitle:#"Alert Message"
message:#"Select atleast 1 country"
delegate:self
cancelButtonTitle:#"Cancel"
otherButtonTitles:#"OK",nil];
[dialog show];
// NSLog(#"must choose 1");
}
}
// countId = [self.tableView indexPathsForSelectedRows].count;
[self.tableView deselectRowAtIndexPath:indexPath animated:YES];
}
}
}
Please do reply. I am stuck here
To check level = 1 to add accessoryType = UITableViewCellAccessoryCheckmark try
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSDictionary *itemDictionary = [self.itemsInTable objectAtIndex:indexPath.row];
NSArray *subItems = [itemDictionary valueForKey:#"SubItems"];
NSDictionary *firstItem = subItems[0];
if ([[firstItem objectForKey:#"level"] integerValue] == 1) {
//Set appropriate accessory view here
} else {
//Check the cell accessory type and update this too
//This is to avoid wrong accessory view on cell reuse
}
}
You can use the following code to get the root object, then go from there:
NSDictionary *rootDict = [[NSBundle mainBundle] objectForInfoDictionaryKey:#"Root"];

iOS UITableView shows content of an old custom cell after reload but selecting it pushes to correct data

I have a very weird behavior with a UITableViewController in my project.
Normally it works perfectly but in one specific case it doesn't.
I have a dynamic table view with one custom type of cell. After filling all the data into the data source the table shows all the content correctly. There is a Pull-to-Refresh that updates the data source and table correctly. There are some filter buttons that update the only section with an animation correctly.
But if I click on one the detail view pushes into and if I go back click on one of these filter buttons again all the table view cells update except the ones I clicked. But if I click on this one again the detail view appears with the data of the cell that used to be there.
So the data updates just fine but the visible doesn't.
I would appreciate any suggestions. Thank you
P.S: Yes I do call the deselectRowAtIndexPath: method in the didSelectRowAtIndexPath:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
static NSString *CellIdentifier = #"BANF";
BANFCell *cell = (BANFCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier
forIndexPath:indexPath];
if (cell == nil) {
cell = [[BANFCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier];
}
// collect required data
Requisition *req;
// for right section
if ([self.tableView numberOfSections] == 1) {
req = [recent objectAtIndex:indexPath.row];
} else {
if (indexPath.section == 1) {
req = [recent objectAtIndex:indexPath.row];
} else {
req = [notSent objectAtIndex:indexPath.row];
}
}
NSMutableArray *shortTexts = [[NSMutableArray alloc] init];
// get description text and sort short texts ascending
// also the amount and currency
NSString *reqDescript;
NSString *amount;
NSString *currency;
for (Trait *trait in req.traits) {
if ([trait.name isEqualToString:#"DESCRIPTION"] && trait.value.length > 0) {
reqDescript = trait.value;
}
if ([trait.name isEqualToString:#"TOTAL_AMOUNT"] && trait.value.length > 0) {
amount = trait.value;
}
if ([trait.name isEqualToString:#"CURRENCY"] && trait.value.length > 0) {
currency = trait.value;
}
}
NSString *amountAndCurreny;
if (amount) {
NSNumberFormatter *currencyFormatter = [[NSNumberFormatter alloc] init];
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[currencyFormatter setCurrencyCode:currency];
amountAndCurreny = [currencyFormatter stringFromNumber:[NSNumber numberWithDouble:amount.doubleValue]];
} else
amountAndCurreny = #"";
cell.amountLabel.text = amountAndCurreny;
NSArray *descriptors = [NSArray arrayWithObjects:[[NSSortDescriptor alloc] initWithKey:#"itm_number"
ascending:YES], nil];
NSArray *orderedArray = [req.positions sortedArrayUsingDescriptors:descriptors];
for (Position *position in orderedArray) {
for (Trait *trait in position.traits) {
if ([trait.name isEqualToString:#"SHORT_TEXT"] && trait.value.length > 0) {
[shortTexts addObject:trait.value];
}
}
}
UIImage *bgImage = [UIImage imageNamed:#"tableBG"];
cell.backgroundView = [[UIImageView alloc] initWithImage:bgImage];
// filling them in
if (req.iD.integerValue < 0) {
[cell.histLabel setText:NSLocalizedString(#"New", nil)];
} else {
[cell.histLabel setText:req.iD.stringValue];
}
[cell.datelabel setText:[labelDateFormatter stringFromDate:req.createDate]];
switch (req.status) {
case ReqStatusNew: [cell.imageView setImage:nil];
break;
case ReqStatusSaved: [cell.imageView setImage:[UIImage imageNamed:#"istGespeichertKiste.png"]];
break;
case ReqStatusApproved: [cell.imageView setImage:[UIImage imageNamed:#"genehmigtKiste.png"]];
break;
case ReqStatusInWFF: [cell.imageView setImage:[UIImage imageNamed:#"workflowKiste.png"]];
break;
case ReqStatusNotApproved: [cell.imageView setImage:[UIImage imageNamed:#"abgelehntKiste.png"]];
break;
case ReqStatusOrdered: [cell.imageView setImage:[UIImage imageNamed:#"istBestelltKiste.png"]];
break;
case ReqStatusDelivered: [cell.imageView setImage:[UIImage imageNamed:#"geliefertKiste.png"]];
break;
}
cell.shortTextLabel.marqueeType = MLContinuous;
cell.shortTextLabel.rate = 50;
cell.shortTextLabel.textAlignment = NSTextAlignmentLeft;
if (reqDescript == nil) {
cell.shortTextLabel.text = [shortTexts componentsJoinedByString:#", "];
} else if (shortTexts.count > 0) {
cell.shortTextLabel.text = [NSString stringWithFormat:#"%#: %#", reqDescript, [shortTexts componentsJoinedByString:#", "]];
} else {
cell.shortTextLabel.text = reqDescript;
}
[cell.shortTextLabel setFrame:CGRectMake(56, 35, 168, 18)];
return cell;
}
In viewWillAppear: I just set the buttons in the navigationcontroller and call
[tableview reloadData]
In viewDidLoad: just adding the delegate of the refresh control
The refresh control just calls [tableview reloadData] after updating the recent and notSent arrays from Core Data
A filter button just calls:
- (IBAction)filterPressed:(UIButton *)sender {
sender.selected = !sender.selected;
NSArray *filters = [dvFilterList componentsSeparatedByString:#","];
if ([[NSUserDefaults standardUserDefaults] boolForKey:[filters objectAtIndex:sender.tag]]){
[[NSUserDefaults standardUserDefaults] setBool:NO
forKey:[filters objectAtIndex:sender.tag]];
} else {
[[NSUserDefaults standardUserDefaults] setBool:YES
forKey:[filters objectAtIndex:sender.tag]];
}
[self updateTableViewData];
// only the section with the recent banfs
NSInteger section = [self numberOfSectionsInTableView:self.tableView] - 1;
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:section]
withRowAnimation:UITableViewRowAnimationFade];
}
(updateTableViewData is the method that just updates the recent and notSent arrays from Core Data)
You can try this ,
[tableView reloadData];
You can write this in cellForRowAtIndexPath
BANFCell *cell = (BANFCell *)[tableView dequeueReusableCellWithIdentifier:nil
forIndexPath:indexPath];
I finally found the solution by myself.
In my didSelectRowAtIndexPath: method I call performSegueWithIdentifier: and by giving the selected row as sender variable Xcode is somehow saving just the look of the cell in background that can only be deleted by removing the whole view controller from the stack.
Now I just give self as the sender because I don't need the variable.
So I code this:
[self performSegueWithIdentifier:#"goToReq" sender:self];
Instead of this:
[self performSegueWithIdentifier:#"goToReq" sender:[self tableView:tableView
cellForRowAtIndexPath:indexPath]];
I know this is not the answer for the original question, but might help someone else seeing similar problems.
I've encountered similar behavior with buggy code like this:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if (condition)
{
CustomCell1* cell = [tableView dequeueReusableCellWithIdentifier:#"custom1" forIndexPath:indexPath];
// configure cell
// !! note how "return cell;" is missing !!
}
CustomCell2* cell = [tableView dequeueReusableCellWithIdentifier:#"custom2" forIndexPath:indexPath];
// configure cell
return cell;
}
Was fixed by actually returning the special-case cell from the conditional branch.

UITableView select a row per section

I would like to make a selection like this
How can I change my
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
delegate method to work in accordance with my requirement.
Why so complicated? Just deselect all cells of the same section before the user selects a new one.
First allow multiple selection for your UITableView. Then implement this delegate method:
Swift 3 version:
func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath?
{
for vcip in tableView.indexPathsForSelectedRows ?? [] {
if vcip.section == indexPath.section && vcip.item != indexPath.item {
tableView.deselectRow(at: vcip, animated: false)
}
}
return indexPath
}
Keep a property in your view controller called selectedRow, which represents the indexPath of tableview that represents the checked item in a table section.
In your view controller's -tableView:cellForRowAtIndexPath: delegate method, set the accessoryType of the cell to UITableViewCellAccessoryCheckmark if the cell's indexPath equals the selectedRow indexpath value. Otherwise, set it to UITableViewCellAccessoryNone.
In your view controller's -tableView:didSelectRowAtIndexPath: delegate method, set the selectedRow value to the indexPath.row that is selected, e.g.: self.selectedRow = indexPath.row
This won't be a good solution.
Use a NSMutableArray for storing the selected sections.
NSMutableArray *selectedSections; //instance variable
selectedSections= [[NSMutableArray alloc] init]; //in viewDidLoad
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSNumber *section = [NSNumber numberWithInt:indexPath.section];
if([selectedSections containsObject:section]
return nil;
else
{
[selectedSections addObject:section];
return indexPath;
}
}
When you deselect a row write the below code there:
[selectedSections removeObject:[NSNumber numberWithInt:indexPath.section]];
LimeRed has a great answer elsewhere in this thread, but it is not complete. The key issue is that the OP needs to have the accessory checkmark removed. Simply calling deselectRow will not remove the checkmark. Per the documentation, deselectRow does not call the delegate method tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) where the removal of the checkmark code might be located. Therefore you need handle this removal as part of the code that LimeRed wrote.
Here is a more complete implementation that removes the accessory checkmark again based on LimeRed's solution:
func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath?
{
for path in tableView.indexPathsForSelectedRows ?? []
{
if path.section == indexPath.section && path.item != indexPath.item
{
let cell = tableView.cellForRow(at: path)
cell?.accessoryType = UITableViewCellAccessoryType.none
tableView.deselectRow(at: path, animated: false)
}
}
return indexPath
}
try like this,
In .h
#property (nonatomic, retain) NSIndexPath *checkedIndexPath;
In .m
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if(indexPath.section==0)
{
// to check and Uncheck the row
if(self.checkedIndexPath)
{
UITableViewCell* uncheckCell = [tableView1
cellForRowAtIndexPath:self.checkedIndexPath];
uncheckCell.accessoryType = UITableViewCellAccessoryNone;
}
if([self.checkedIndexPath isEqual:indexPath])
{
self.checkedIndexPath = nil;
}
else
{
UITableViewCell* cell = [tableView1 cellForRowAtIndexPath:indexPath];
cell.accessoryType = UITableViewCellAccessoryCheckmark;
self.checkedIndexPath = indexPath;
}
}
}
This one's gonna be ViewController.h
#interface ViewController : UITableViewController
{
NSMutableArray *list;
NSMutableArray *sectionList;
NSIndexPath *oldIndexPath0;
int row0;
NSIndexPath *oldIndexPath1;
int row1;
NSIndexPath *oldIndexPath2;
int row2;
NSIndexPath *oldIndexPath3;
int row3;
NSString *othersString;
NSString *timeString;
NSString *pRoomString;
NSString *parkingString;
NSString *smokingString;
NSString *select0;
NSString *select1;
NSString *select2;
NSString *select3;
}
#end
This one's ViewController.m
#import "ViewController.h"
#interface ViewController ()
#end
#implementation ViewController
- (void)viewWillAppear:(BOOL)animated
{
// initial row by 100;
row0 = 100;
row1 = 100;
row2 = 100;
row3 = 100;
// initial strings by #”"
othersString = [NSString stringWithFormat:#""];
timeString = [NSString stringWithFormat:#""];
pRoomString = [NSString stringWithFormat:#""];
parkingString = [NSString stringWithFormat:#""];
smokingString = [NSString stringWithFormat:#""];
select0 = #"";
select1 = #"";
select2 = #"";
select3 = #"";
// Get row index
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *fileName = [NSHomeDirectory() stringByAppendingPathComponent:#"tmp/rowString.txt"];
NSData *rowData = [fileManager contentsAtPath:fileName];
// From NSData to NSString
NSString *rowString = [[NSString alloc] initWithData:rowData encoding:NSUTF8StringEncoding];
if (rowString) {
// spit row string
NSArray *rowArray = [rowString componentsSeparatedByString:#":"];
for (int i=0; i<[rowArray count]; i++) {
NSString *indexVal = [rowArray objectAtIndex:i];
if ([indexVal length] != 0) {
// set row value
if (i == 0) {
NSString *row0Str = [rowArray objectAtIndex:0];
row0 = [row0Str intValue];
}
if (i == 1) {
NSString *row1Str = [rowArray objectAtIndex:1];
row1 = [row1Str intValue];
}
if (i == 2) {
NSString *row2Str = [rowArray objectAtIndex:2];
row2 = [row2Str intValue];
}
if (i == 3) {
NSString *row3Str = [rowArray objectAtIndex:3];
row3 = [row3Str intValue];
}
}
}
}
// Update the view with current data before it is displayed.
[super viewWillAppear:animated];
//Initialize the array.
list = [[NSMutableArray alloc] initWithCapacity:0];
sectionList = [[NSMutableArray alloc] initWithCapacity:0];
// section header
NSArray *sectionHeaderArray = [NSArray arrayWithObjects:#"01",#"02",#"03",#"04", nil];
NSDictionary *sectionHeaderDic = [NSDictionary dictionaryWithObject:sectionHeaderArray forKey:#"section"];
[sectionList addObject:sectionHeaderDic];
// time list
NSArray *timeArray = [NSArray arrayWithObjects:#"time 01",#"time 01",#"time 01", nil];
NSDictionary *timeDic = [NSDictionary dictionaryWithObject:timeArray forKey:#"time"];
// private room
NSArray *pRoomArray = [NSArray arrayWithObjects:#"room 01",#"room 02", nil];
NSDictionary *pRoomDic = [NSDictionary dictionaryWithObject:pRoomArray forKey:#"pRoom"];
// parking
NSArray *parkingArray = [NSArray arrayWithObjects:#"park 01",#"park 02",#"park 03", nil];
NSDictionary *parkingDic = [NSDictionary dictionaryWithObject:parkingArray forKey:#"parking"];
// smoking
NSArray *smokingArray = [NSArray arrayWithObjects:#"smoke 01",#"smoke 02",#"smoke 03", nil];
NSDictionary *smokingDic = [NSDictionary dictionaryWithObject:smokingArray forKey:#"smoking"];
// add all dictionary to list
[list addObject:timeDic];
[list addObject:pRoomDic];
[list addObject:parkingDic];
[list addObject:smokingDic];
// Scroll the table view to the top before it appears
[self.tableView reloadData];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
//Number of section
return [list count];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
//Get the dictionary object
NSDictionary *dictionary = [list objectAtIndex:section];
NSArray *array;
switch (section) {
case 0:
// time array
array = [dictionary objectForKey:#"time"];
break;
case 1:
// pRoom array
array = [dictionary objectForKey:#"pRoom"];
break;
case 2:
// parking array
array = [dictionary objectForKey:#"parking"];
break;
case 3:
// smoking array
array = [dictionary objectForKey:#"smoking"];
break;
default:
break;
}
//Number of rows
return [array count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = #"Budget";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
UITableViewCellStyleSubtitle;
}
//Get the dictionary object
NSDictionary *dictionary = [list objectAtIndex:indexPath.section];
NSArray *array;
switch (indexPath.section) {
case 0:
// time array
array = [dictionary objectForKey:#"time"];
if (indexPath.row == row0 ) {
cell.accessoryType=UITableViewCellAccessoryCheckmark;
}else{
cell.accessoryType = UITableViewCellAccessoryNone;
}
break;
case 1:
// pRoom array
array = [dictionary objectForKey:#"pRoom"];
if (indexPath.row == row1) {
cell.accessoryType=UITableViewCellAccessoryCheckmark;
}else{
cell.accessoryType = UITableViewCellAccessoryNone;
}
break;
case 2:
// parking array
array = [dictionary objectForKey:#"parking"];
if (indexPath.row == row2) {
cell.accessoryType=UITableViewCellAccessoryCheckmark;
}else{
cell.accessoryType = UITableViewCellAccessoryNone;
}
break;
case 3:
// smoking array
array = [dictionary objectForKey:#"smoking"];
if (indexPath.row == row3) {
cell.accessoryType=UITableViewCellAccessoryCheckmark;
}else{
cell.accessoryType = UITableViewCellAccessoryNone;
}
break;
default:
break;
}
cell.textLabel.text = [array objectAtIndex:indexPath.row];
NSLog(#"index cell");
return cell;
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
NSString *title = nil;
//Get the dictionary object
NSDictionary *dictionary = [sectionList objectAtIndex:0];
NSArray *array = [dictionary objectForKey:#"section"];
title = [array objectAtIndex:section];
return title;
}
#pragma mark -
#pragma mark Table view selection
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:YES];
switch(indexPath.section)
{
case 0:
{
UITableViewCell *cell1 = [tableView cellForRowAtIndexPath:indexPath];
if ([[tableView cellForRowAtIndexPath:indexPath ] accessoryType] == UITableViewCellAccessoryCheckmark) {
cell1.accessoryType = UITableViewCellAccessoryNone;
row0 = 100;
timeString = #"";
}else {
NSIndexPath *SIndexPath0 = [NSIndexPath indexPathForRow:row0 inSection:0];
if ([[tableView cellForRowAtIndexPath:SIndexPath0 ] accessoryType] == UITableViewCellAccessoryCheckmark) {
[[tableView cellForRowAtIndexPath:SIndexPath0] setAccessoryType:UITableViewCellAccessoryNone];
}
if (oldIndexPath0 == nil) {
oldIndexPath0 = indexPath;
}
UITableViewCell *cell2 = nil;
if (oldIndexPath0 != indexPath) {
cell2 = [tableView cellForRowAtIndexPath:oldIndexPath0];
}
cell1.accessoryType = UITableViewCellAccessoryCheckmark;
if (cell2) {
cell2.accessoryType = UITableViewCellAccessoryNone;
}
//Get the dictionary object
NSDictionary *dictionary = [list objectAtIndex:indexPath.section];
NSArray *array = [dictionary objectForKey:#"time"];
timeString = [array objectAtIndex:indexPath.row];
row0 = indexPath.row;
oldIndexPath0 = nil;
}
select0 = #"marked";
break;
}
case 1:
{
UITableViewCell *cell1 = [tableView cellForRowAtIndexPath:indexPath];
if ([[tableView cellForRowAtIndexPath:indexPath ] accessoryType] == UITableViewCellAccessoryCheckmark) {
cell1.accessoryType = UITableViewCellAccessoryNone;
row1 = 100;
pRoomString = #"";
}else {
NSIndexPath *SIndexPath1 = [NSIndexPath indexPathForRow:row1 inSection:1];
if ([[tableView cellForRowAtIndexPath:SIndexPath1 ] accessoryType] == UITableViewCellAccessoryCheckmark) {
[[tableView cellForRowAtIndexPath:SIndexPath1] setAccessoryType:UITableViewCellAccessoryNone];
}
if (oldIndexPath1 == nil) {
oldIndexPath1 = indexPath;
}
UITableViewCell *cell2 = nil;
if (oldIndexPath1 != indexPath) {
cell2 = [tableView cellForRowAtIndexPath:oldIndexPath1];
}
cell1.accessoryType = UITableViewCellAccessoryCheckmark;
if (cell2) {
cell2.accessoryType = UITableViewCellAccessoryNone;
}
//Get the dictionary object
NSDictionary *dictionary = [list objectAtIndex:indexPath.section];
NSArray *array = [dictionary objectForKey:#"pRoom"];
pRoomString = [array objectAtIndex:indexPath.row];
row1 = indexPath.row;
oldIndexPath1 = nil;
}
select1 = #"marked";
break;
}
case 2:
{
UITableViewCell *cell1 = [tableView cellForRowAtIndexPath:indexPath];
if ([[tableView cellForRowAtIndexPath:indexPath ] accessoryType] == UITableViewCellAccessoryCheckmark) {
cell1.accessoryType = UITableViewCellAccessoryNone;
row2 = 100;
parkingString = #"";
}else {
NSIndexPath *SIndexPath2 = [NSIndexPath indexPathForRow:row2 inSection:2];
if ([[tableView cellForRowAtIndexPath:SIndexPath2 ] accessoryType] == UITableViewCellAccessoryCheckmark) {
[[tableView cellForRowAtIndexPath:SIndexPath2] setAccessoryType:UITableViewCellAccessoryNone];
}
if (oldIndexPath2 == nil) {
oldIndexPath2 = indexPath;
}
UITableViewCell *cell2 = nil;
if (oldIndexPath2 != indexPath) {
cell2 = [tableView cellForRowAtIndexPath:oldIndexPath2];
}
cell1.accessoryType = UITableViewCellAccessoryCheckmark;
if (cell2) {
cell2.accessoryType = UITableViewCellAccessoryNone;
}
//Get the dictionary object
NSDictionary *dictionary = [list objectAtIndex:indexPath.section];
NSArray *array = [dictionary objectForKey:#"parking"];
parkingString = [array objectAtIndex:indexPath.row];
row2 = indexPath.row;
oldIndexPath2 = nil;
}
select2 = #"marked";
break;
}
case 3:
{
UITableViewCell *cell1 = [tableView cellForRowAtIndexPath:indexPath];
if ([[tableView cellForRowAtIndexPath:indexPath ] accessoryType] == UITableViewCellAccessoryCheckmark) {
cell1.accessoryType = UITableViewCellAccessoryNone;
row3 = 100;
smokingString = #"";
}else {
NSIndexPath *SIndexPath3 = [NSIndexPath indexPathForRow:row3 inSection:3];
if ([[tableView cellForRowAtIndexPath:SIndexPath3 ] accessoryType] == UITableViewCellAccessoryCheckmark) {
[[tableView cellForRowAtIndexPath:SIndexPath3] setAccessoryType:UITableViewCellAccessoryNone];
}
if (oldIndexPath3 == nil) {
oldIndexPath3 = indexPath;
}
UITableViewCell *cell2 = nil;
if (oldIndexPath3 != indexPath) {
cell2 = [tableView cellForRowAtIndexPath:oldIndexPath3];
}
cell1.accessoryType = UITableViewCellAccessoryCheckmark;
if (cell2) {
cell2.accessoryType = UITableViewCellAccessoryNone;
}
//Get the dictionary object
NSDictionary *dictionary = [list objectAtIndex:indexPath.section];
NSArray *array = [dictionary objectForKey:#"smoking"];
smokingString = [array objectAtIndex:indexPath.row];
row3 = indexPath.row;
oldIndexPath3 = nil;
}
select3 = #"marked";
break;
}
default:
break;
}
}
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
// Cancle button and add an event handler
self.navigationItem.leftBarButtonItem =
[[UIBarButtonItem alloc] initWithTitle:#"Cancle"
style:UIBarButtonSystemItemCancel
target:self
action:#selector(handleCancle:)];
// Cancle button and add an event handler
self.navigationItem.rightBarButtonItem =
[[UIBarButtonItem alloc] initWithTitle:#"Use"
style:UIBarButtonItemStyleBordered
target:self
action:#selector(handleUse:)];
}
- (void) handleCancle:(id)sender
{
// pop the controller
[self.navigationController popViewControllerAnimated:YES];
}
- (void) handleUse:(id)sender{
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *fileName;
// Get row index value
fileName = [NSHomeDirectory() stringByAppendingPathComponent:#"tmp/othersString.txt"];
NSData *rowValData = [fileManager contentsAtPath:fileName];
// From NSData to NSString
NSString *rowValString = [[NSString alloc] initWithData:rowValData encoding:NSUTF8StringEncoding];
NSString *oldTimeString = #"";
NSString *oldpRoomString = #"";
NSString *oldParkingString = #"";
NSString *oldSmokingString = #"";
if (rowValString) {
// spit row string
NSArray *rowValArray = [rowValString componentsSeparatedByString:#":"];
for (int i=0; i<[rowValArray count]; i++) {
if ([rowValArray objectAtIndex:i] != #"") {
// set row value
if (i == 0 ) {
oldTimeString = [rowValArray objectAtIndex:0];
}
if (i == 1 ) {
oldpRoomString = [rowValArray objectAtIndex:1];
}
if (i == 2 ) {
oldParkingString = [rowValArray objectAtIndex:2];
}
if (i == 3) {
oldSmokingString = [rowValArray objectAtIndex:3];
}
}
}
}
if (select0 == #"") {
timeString = oldTimeString;
}
if (select1 == #"") {
pRoomString = oldpRoomString;
}
if (select2 == #"") {
parkingString = oldParkingString;
}
if (select3 == #"") {
smokingString = oldSmokingString;
}
// make othersString string
othersString = [NSString stringWithFormat:#"%#:%#:%#:%#", timeString, pRoomString, parkingString, smokingString];
// write othersString to othersString.txt file
fileName= [NSHomeDirectory() stringByAppendingPathComponent:#"tmp/othersString.txt"];
NSData *othersData = [othersString dataUsingEncoding:NSUTF8StringEncoding];
[fileManager createFileAtPath:fileName contents:othersData attributes:nil];
// make row data in string
NSString *rowString = [NSString stringWithFormat:#"%i:%i:%i:%i", row0,row1,row2,row3];
// write othersString to othersString.txt file
fileName = [NSHomeDirectory() stringByAppendingPathComponent:#"tmp/rowString.txt"];
NSData *rowData = [rowString dataUsingEncoding:NSUTF8StringEncoding];
[fileManager createFileAtPath:fileName contents:rowData attributes:nil];
// pop the controller
[self.navigationController popViewControllerAnimated:YES];
}
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc. that aren't in use.
}
- (void)viewDidUnload {
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (void)dealloc {
[super dealloc];
[list release];
}
#end
Got this stuff from this post, as this was in Japanese I changed it. Thanks to the author.
After a lot of modifications I have arrived with this
- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [aTableView cellForRowAtIndexPath:indexPath];
if(indexPath.section == 0)
{
if([section1Rows count] == 0)
{
[section1Rows addObject:[NSNumber numberWithInt:indexPath.row]];
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
else
{
[section1Rows removeObjectAtIndex:0];
for (UITableViewCell *cell in [tabview visibleCells]) {
cell.accessoryType = UITableViewCellAccessoryNone;
}
[section1Rows addObject:[NSNumber numberWithInt:indexPath.row]];
NSLog(#"%#",section1Rows);
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
}
if(indexPath.section == 1)
{
if([section2Rows count] == 0)
{
[section2Rows addObject:[NSNumber numberWithInt:indexPath.row]];
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
else
{
[section2Rows removeObjectAtIndex:0];
for (UITableViewCell *cell in [tabview visibleCells]) {
cell.accessoryType = UITableViewCellAccessoryNone;
}
[section2Rows addObject:[NSNumber numberWithInt:indexPath.row]];
NSLog(#"%#",section2Rows);
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
}
if(indexPath.section == 2)
{
if([section3Rows count] == 0)
{
[section3Rows addObject:[NSNumber numberWithInt:indexPath.row]];
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
else
{
[section3Rows removeObjectAtIndex:0];
for (UITableViewCell *cell in [tabview visibleCells]) {
cell.accessoryType = UITableViewCellAccessoryNone;
}
[section3Rows addObject:[NSNumber numberWithInt:indexPath.row]];
NSLog(#"%#",section3Rows);
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
}
}
I'll explain the problem in steps,
I have selected a row in 3 sections, If I select a row again in any of the sections... then everything goes haywire. How can I deselect the previously selected row and highlight the then selected row?
Thanks.

iOS: How to save only one checkmark (for UITableView) in NSUserDefaults?

i have a question regarding NSUserDefaults. I am trying to save the checkmark that i place on a cell and then retrieve it when the app crashes or when user closes app and so on. I tried to use this post post as a guide, but no luck, but here's what i have so far. The code from the post works, however, i only need one checkmark to be saved rather than many. How would i achieve this?
#implementation ClientsViewController
#synthesize clientsInt; // This is just a variable that helps me do the drill down part of the rootviewcontroller
#synthesize checkedIndexPath;
- (NSString *)getKeyForIndex:(int)index
{
return [NSString stringWithFormat:#"KEY%d",index];
}
- (BOOL) getCheckedForIndex:(int)index
{
if([[[NSUserDefaults standardUserDefaults] valueForKey:[self getKeyForIndex:index]] boolValue]==YES)
{
return YES;
}
else
{
return NO;
}
}
- (void) checkedCellAtIndex:(int)index
{
BOOL boolChecked = [self getCheckedForIndex:index];
[[NSUserDefaults standardUserDefaults] setValue:[NSNumber numberWithBool:!boolChecked] forKey:[self getKeyForIndex:index]];
[[NSUserDefaults standardUserDefaults] synchronize];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = #"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
if([self getCheckedForIndex:indexPath.row]==YES)
{
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
else
{
cell.accessoryType = UITableViewCellAccessoryNone;
}
}
// Configure the cell...
if (clientsInt == 0) {
cell.textLabel.text = [array1 objectAtIndex:indexPath.row];
}
else if (clientsInt == 1) {
cell.textLabel.text = [array2 objectAtIndex:indexPath.row];
}
else if (clientsInt == 2) {
cell.textLabel.text = [array3 objectAtIndex:indexPath.row];
}
else if (clientsInt == 3) {
cell.textLabel.text = [array4 objectAtIndex:indexPath.row];
}
if([self.checkedIndexPath isEqual:indexPath])
{
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
else
{
cell.accessoryType = UITableViewCellAccessoryNone;
}
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// Uncheck the previous checked row
if(self.checkedIndexPath)
{
UITableViewCell* uncheckCell = [tableView cellForRowAtIndexPath:self.checkedIndexPath];
uncheckCell.accessoryType = UITableViewCellAccessoryNone;
}
UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];
cell.accessoryType = UITableViewCellAccessoryCheckmark;
self.checkedIndexPath = indexPath;
[self checkedCellAtIndex:indexPath.row];
if([self getCheckedForIndex:indexPath.row]==YES)
{
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
else
{
cell.accessoryType = UITableViewCellAccessoryNone;
}
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
Maybe try something like this every time the user checks a row:
[[NSUserDefaults standardUserDefaults] setValue:[NSNumber numberWithInt:index] forKey:#"kCheckedBoxKey"];
Since each time, you would save the index under the same key (#"kCheckedBoxKey"), only one index will ever be stored, and it will always be the latest one that the user checked. All you would need to do the next time you load is ask userDefaults if it can find a value for the key #"kCheckedBoxKey", and if so, you would respond by programatically checking the index that was stored.
(you'd of course also want to clean it up by using #define CHECKED_KEY #"kCheckedBoxKey" at the top of the file, and use CHECKED_KEY instead of the literal string to protect against misspellings. At any rate, the point is to make sure you always save & restore using that same key.)
I recently had to save the state of each cell in my table view when the user selected or deselected them to add or remove checkmarks. Here is the snippet of code I used to save to a .plist file (let me know if you need the whole implementation I came up with:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *contentForThisRow = [[self list] objectAtIndex:[indexPath row]];
NSString *CellIdentifier = [NSString stringWithFormat:#"Cell%d%d", indexPath.section, indexPath.row];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
NSString *documentDirectory = [(AppDelegate *)[[UIApplication sharedApplication] delegate] applicationDocumentsDirectory];
NSString *PlistPath = [documentDirectory stringByAppendingPathComponent:#"Settings.plist"];
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:PlistPath];
NSString *row = [NSString stringWithFormat:#"%d",indexPath.row];
if([[dict objectForKey:row]isEqualToString:#"0"])
{
cell.accessoryType = UITableViewCellAccessoryNone;
}
else
{
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
[[cell textLabel] setText:contentForThisRow];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *documentDirectory = [(AppDelegate *)[[UIApplication sharedApplication] delegate] applicationDocumentsDirectory];
NSString *PlistPath = [documentDirectory stringByAppendingPathComponent:#"Settings.plist"];
NSMutableDictionary *plist = [NSMutableDictionary dictionaryWithContentsOfFile:PlistPath];
UITableViewCell *cell = [self._tableView cellForRowAtIndexPath:indexPath];
NSString *row = [NSString stringWithFormat:#"%d",indexPath.row];
if(cell.accessoryType == UITableViewCellAccessoryNone)
{
cell.accessoryType = UITableViewCellAccessoryCheckmark;
NSString *on = #"1";
[plist setObject:on forKey:row];
[plist writeToFile:PlistPath atomically:YES];
}
else if(cell.accessoryType == UITableViewCellAccessoryCheckmark)
{
cell.accessoryType = UITableViewCellAccessoryNone;
NSString *off = #"0";
[plist setObject:off forKey:row];
[plist writeToFile:PlistPath atomically:YES];
}
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
You only need to save the index of the selected row

Custom TableViewCell not updating

I want to set the checkmark in front of the cell. When I click on the checkmark icon the correct function is called and the datasource is changed.
I call [table reloadData] and after that even cellForRowAtIndexPath is also called but it is always dequeing the old table cell and not reloading it with the new data source..
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellIdentifier = #"CheckboxCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
NSLog(#"cellForRowAtIndexPath row: %d", indexPath.row);
// use CustomCell layout
CheckboxCell *checkboxCell;
if(cell == nil) {
NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:#"CheckboxCell" owner:self options:nil];
for (id currentObject in topLevelObjects){
if ([currentObject isKindOfClass:[UITableViewCell class]]){
checkboxCell = (CheckboxCell *)currentObject;
break;
}
}
} else {
checkboxCell = (CheckboxCell *)cell; // return cell;
}
Observation *observation = [observations objectAtIndex:indexPath.row];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = #"dd.MM.yyyy";
[dateFormatter setTimeZone:[NSTimeZone systemTimeZone]];
NSString *nowString = [dateFormatter stringFromDate:observation.date];
[dateFormatter release];
NSString *amountString = [[NSString alloc] initWithFormat:#"%d", observation.amount];
checkboxCell.name.text = [observation.organism getNameDe];
checkboxCell.date.text = nowString;
checkboxCell.amount.text = amountString;
checkboxCell.latName.text = [observation.organism getLatName];
// Define the action on the button and the current row index as tag
[checkboxCell.checkbox addTarget:self action:#selector(checkboxEvent:) forControlEvents:UIControlEventTouchUpInside];
[checkboxCell.checkbox setTag:observation.observationId];
// Define the action on the button and the current row index as tag
[checkboxCell.remove addTarget:self action:#selector(removeEvent:) forControlEvents:UIControlEventTouchUpInside];
[checkboxCell.remove setTag:observation.observationId];
// Set checkbox icon
if(observation.submitToServer) {
NSLog(#"CHECKED");
checkboxCell.checkbox.imageView.image = [UIImage imageNamed:#"check_icon.png"];
} else {
NSLog(#"UNCHECKED");
checkboxCell.checkbox.imageView.image = [UIImage imageNamed:#"checkbox.gif"];
}
[amountString release];
[observation release];
return checkboxCell;
// Set checkbox icon
if(observation.submitToServer) {
NSLog(#"CHECKED");
checkboxCell.checkbox.imageView.image = [UIImage imageNamed:#"check_icon.png"];
} else {
NSLog(#"UNCHECKED");
checkboxCell.checkbox.imageView.image = [UIImage imageNamed:#"checkbox.gif"];
}
[amountString release];
[observation release];
return checkboxCell;
}
I think I'm doing something in the cellForRowAtIndexPath wrong.. Can anybody help me?
Edit:
The first problem could be fixed (Thanks to Maggie). Now the checkmark is changing the first time correctly. But somehow if I change it on another cell its crashing on the following line:
- (void) checkboxEvent:(UIButton *)sender
{
UIButton *button = (UIButton *)sender;
NSNumber *number = [NSNumber numberWithInt:button.tag];
for(Observation *ob in observations) {
if(ob.observationId == [number intValue]) { // <---- IT'S CRASHING HERE
ob.submitToServer = !ob.submitToServer;
NSLog(#"New value: %#", (ob.submitToServer) ? #"YES" : #"NO");
}
}
[table reloadData];
}
But the observation object isn't nil. Any ideas?
Replace
else {
return cell;
}
part with
else {
checkboxCell = (CheckboxCell *)cell;
}
and fill your checkboxCell with apropriate data.

Resources