2011-07-21 100 views
0
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 .Please help me in solving this problem.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 alloc]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 
+1

如果仅发布相关片段而不是整个项目,则人们更有可能阅读代码。 – PengOne

回答

0

表示1个的tableview细胞在以往控制器的detailtextlabel文本在你FirstViewController

1,保持命名detailTextValueFromSecondController一个成员变量(的NSString)。

2,创建一个名为

-(void)refreshTableToSetDetailText:(NSString *)detailTextValue 
在SecondViewController

然后

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

将下面的代码功能:

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]; 
       } 

    } 
+0

函数refreshTableToSetDetailText没有什么应该写入 – Rani

+0

stringtosetondetaillabel应根据所选行的索引路径和其中的值设置 – Rani

+0

hi @Adarsh我已完成代码,但是当我运行应用程序并单击第二个控制器上的单元格时我的应用程序崩溃,并给我错误,[TAddAlarmController refreshTableToSetDetailText:]:无法识别的选择发送到实例0x4b57f50' – Rani

0

使用didSelectRowAtIndexPath,找出用户选择了哪一行,并将该值存储在NSUserDefaults中,以获取用于在视图之间进行通信的特定整数键。

NSUserDefaults *chosenrow = [NSUserDefaults standardUserDefaults]; 
[chosenrow setInteger:99 forKey: StringYouWantToDisplay]; 

而在以前的控制器的cellForRowAtIndexPath,拿到钥匙的整数

NSInteger myInt = [chosenrow integerForKey:StringYouWantToDisplay]; 

并检查是否为99。如果是这种情况,那么你可以肯定的是,该特定值被选中,并为细胞分配detailedTextLabel

出头注意:

  1. 确保reloadData您的tableView在ViewWillAppear或您无法看到的detailedText

  2. NSString属性设置所选行的值的变化的第二类。确保在前一视图中引用该类,以便能够从该NSString中获取该值。

  3. NSUserDefaults用于在两个视图之间进行通信。如果选择了一行,请检查NSUserDefaults。如果没有选择一行,那么你不需要分配一个detailedTextLabel。另一方面,如果选择了一行,则需要分配它。

+0

NSUserDefaults * chosenrow = [NSUserDefaults standardUserDefaults];这个代码应该写在我的第二个控制器的select方法中 – Rani

+0

我有7个字符串值应该在tableview单元格上设置,而不是整数,所以如何在nsuserdefaults中设置字符串值 – Rani