簡體   English   中英

如何通過數組在前一個controller的detailtextlabel中顯示一個tableview單元格的文本

[英]How to display the text of one tableview cell in the detailtextlabel of previous controller through array

我創建了一個名為 TAddAlarmController 的 controller class ,它有一個由 6 行組成的表格視圖。 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其中包含 7 個 static 值。

我希望當我單擊第二個 controller 的任何行時,特定行的單元格內的值應設置為前一個控制器的 detailtextlabel,即 TAddAlarmController。

這是我的代碼:

這是 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

這是我的.m 文件

    #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

這是 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

這是我的.m 文件

    #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

在你的 FirstViewController

1、保留一個名為detailTextValueFromSecondController的成員變量(NSString)。

2、創建一個function命名

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

     }

使用didSelectRowAtIndexPath ,找出用戶選擇了哪一行,並將該值存儲在NSUserDefaults中,以用於在視圖之間進行通信的特定 integer 鍵。

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

並在前面的controller的cellForRowAtIndexPath中,得到integer的key

NSInteger myInt = [chosenrow integerForKey:StringYouWantToDisplay];

並檢查它是否為 99。如果是這種情況,那么您可以確定選擇了該特定值,並為單元格分配detailedTextLabel的TextLabel。

需要注意的事項:

  1. 確保在reloadData中為您的 tableView 重新加載數據,否則您無法看到detailedText ViewWillAppear的更改

  2. 在第二個 class 的NSString屬性中設置所選行的值。 確保在上一個視圖中引用 class ,以便您能夠從該NSString中獲取值。

  3. NSUserDefaults用於在兩個視圖之間進行通信。 如果選擇了一行,請檢查 NSUserDefaults。 如果未選擇行,則無需分配詳細的TextLabel。 另一方面,如果選擇了一行,則需要分配它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM