How to display the text of one tableview cell in the detailtextlabel of previous controller through array
I have created a controller class named TAddAlarmController which has a tableview which consists of 6 rows. When I click on the second row it navigates to a page which is a new controller name TAlarmNewController which is a tableviewcontroller and in which I have created a nsmutablearray and populated that array with 7 static values so when the second controller is displayed the tableview is displayed with 7 static values in it.
I want that when I click on any row of second controller the value that is present inside the cell of the paticular row should be set to detailtextlabel of the previouscontroller i.e TAddAlarmController.
This is my code:
This is AddAlarmcontroller.h
#import <UIKit/UIKit.h>
@class StopSnoozeAppDelegate;
@class Alarm;
@class TAlarmNewController;
@interface TAddAlarmController : UITableViewController {
StopSnoozeAppDelegate *app;
IBOutlet UITableView *tblView;
NSDateFormatter *dateFormatter;
NSUndoManager *undoManager;
Alarm *am;
TAlarmNewController *anew;
}
@property(nonatomic,retain)NSDateFormatter *dateFormatter;
@property (nonatomic,retain)Alarm *am;
@property (nonatomic,retain)NSUndoManager *undoManager;
@end
This is my .m file
#import "TAddAlarmController.h"
#import "Alarm.h"
#import "TAlarmNewController.h"
@implementation TAddAlarmController
@synthesize dateFormatter;
@synthesize am;
@synthesize undoManager;
#pragma mark -
#pragma mark View lifecycle
- (void)viewDidUnload {
// Release any properties that are loaded in viewDidLoad or can be recreated lazily.
self.dateFormatter = nil;
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.tableView reloadData];
}
#pragma mark -
#pragma mark Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// Return the number of sections.
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
return 6;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 44;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
/*
Dequeue or create and then configure a table cell for each attribute of the book.
*/
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
//cell.editingAccessoryType = UITableViewCellAccessoryDisclosureIndicator;
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
switch (indexPath.row) {
case 0:
cell.textLabel.text = @"Time";
break;
case 1:
cell.textLabel.text = @"Repeat";
break;
case 2:
cell.textLabel.text = @"Sound";
break;
case 3:
cell.textLabel.text = @"Snooze Interval";
break;
case 4:
cell.textLabel.text = @"Alarm Message";
break;
case 5:
cell.textLabel.text = @"Snooze Penalty";
break;
}
return cell;
}
#pragma mark -
#pragma mark Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
TAlarmNewController *controller = [[TAlarmNewController alloc]initWithNibName:@"TAlarmNewController" bundle:nil];
switch (indexPath.row) {
case 0:
controller.editedObject = @"Time";
break;
case 1:
[self.navigationController pushViewController:controller animated:YES];
[controller release];
default:
break;
}
}
- (NSDateFormatter *)dateFormatter {
if (dateFormatter == nil) {
dateFormatter = [[NSDateFormatter alloc] init];
//[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
[dateFormatter setTimeStyle:NSDateFormatterNoStyle];
}
return dateFormatter;
}
- (void)dealloc {
[super dealloc];
}
@end
This is TAlarmNewController.h
@class TAddAlarmController;
@interface TAlarmNewController : UITableViewController {
IBOutlet UITableView *tblView;
UIDatePicker *datePicker;
id editedObject;
TAddAlarmController *Addalarm;
NSMutableArray *days;//this is the array where i am storing 7 values statically
}
@property (nonatomic,retain) IBOutlet UITableView *tblView;
@property(nonatomic,retain) IBOutlet UIDatePicker *datePicker;
@property (nonatomic, retain) id editedObject;
@property(nonatomic,retain)NSMutableArray *days;
@property (nonatomic, retain, readonly) TAddAlarmController *Addalarm;
-(IBAction)cancel;
-(IBAction)save;
@end
This is my .m file
#import "TAlarmNewController.h"
#import "TAddAlarmController.h"
@implementation TAlarmNewController
@synthesize editedObject,datePicker, tblView,days,Addalarm;
#pragma mark -
#pragma mark View lifecycle
- (void)viewDidLoad {
UIBarButtonItem * saveButton = [[UIBarButtonItem 开发者_如何学Pythonalloc]initWithBarButtonSystemItem:UIBarButtonSystemItemSave target:self action:@selector(save)];
self.navigationItem.rightBarButtonItem = saveButton;
[saveButton release];
UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancel)];
self.navigationItem.leftBarButtonItem = cancelButton;
[cancelButton release];
days =[[NSMutableArray alloc]initWithObjects:@"Every Monday",@"Every Tuesday",@"Every Wednesday",@"Every Thursday",@"Every Friday",@"Every Saturday",@"Every Sunday0",nil];
[super viewDidLoad];
}
- (TAddAlarmController *)Addalarm {
if (Addalarm == nil) {
Addalarm = [[TAddAlarmController alloc] initWithStyle:UITableViewStyleGrouped];
}
return Addalarm;
}
-(IBAction)save{
[self.navigationController popViewControllerAnimated:YES];
//
}
-(IBAction)cancel{
[self.navigationController popViewControllerAnimated:YES];
}
#pragma mark -
#pragma mark Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// Return the number of sections.
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
return [days count];
}
// Customize the appearance of table view cells.
- (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] autorelease];
}
cell.textLabel.text = [days objectAtIndex:indexPath.row];
// Configure the cell...
return cell;
}
#pragma mark -
#pragma mark Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
}
- (void)dealloc {
[datePicker release];
[super dealloc];
}
@end
In your FirstViewController
1, keep a member variable(NSString) named detailTextValueFromSecondController.
2, create a function named
-(void)refreshTableToSetDetailText:(NSString *)detailTextValue
Then in your SecondViewController
Inside
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
place the following code:
for (int i =0; i < [[self.navigationController viewControllers] count]; i++)
{
UIViewController *aController = [[self.navigationController viewControllers] objectAtIndex:i];
if ([aController isKindOfClass:[FirstViewController class]])
{
FirstViewController *aFirstViewController = (FirstViewController *)aController;
[aFirstViewController refreshTableToSetDetailText:yourstringtosetondetaillabel];
[self.navigationController popToViewController:aController animated:YES];
}
}
Using the didSelectRowAtIndexPath
, find out which row was chosen by the user, and store that value in NSUserDefaults
for a specific integer key for communicating between views.
NSUserDefaults *chosenrow = [NSUserDefaults standardUserDefaults];
[chosenrow setInteger:99 forKey: StringYouWantToDisplay];
And in the cellForRowAtIndexPath
of the previous controller, get the key for the integer
NSInteger myInt = [chosenrow integerForKey:StringYouWantToDisplay];
And check if it is 99. If this is the case then you can be certain that that particular value was chosen, and allocate the detailedTextLabel
for the cells.
Somethings to note:
Make sure to
reloadData
for your tableView in yourViewWillAppear
or you cannot see the changes for thedetailedText
Set the value of the chosen row in a
NSString
property of the second class. Make sure to reference that class in the the previous view so that you are able to grab the value from thatNSString
.NSUserDefaults
is for communicating between two views. Check for NSUserDefaults if a row was chosen. If a row was not chosen, then you need not allocate a detailedTextLabel. On the otherhand, if a row was selected, you will need to allocate it..
精彩评论