如何使用NSUserDefault将选定的TableViewCell文本发送到以前的ViewController

时间:2016-01-03 09:21:36

标签: ios objective-c uitableview nsuserdefaults

我的第一个UITableView中有一个静态UIViewController,其中包含两个原型单元格。在第一个单元格中有一个标有“选择你的国家”的标签。当用户点按该单元格时,它会转到包含国家/地区的另一个UITableViewController。当用户选择国家/地区时,在第一个视图标签文本中应使用所选国家/地区名称进行更新。为此,我必须将第二个UIViewController中的选定数据传递给第一个视图控制器。我希望使用NSUserDefaults来做到这一点。这是我的第二个带有tableview的视图控制器。

@implementation FlightfromTableViewController
{
    NSArray *detailFlights;
}

- (void)viewDidLoad {

    [super viewDidLoad];

    detailFlights = @[@"colombo1",@"colombo2",@"colombo3",@"colombo14",@"colombo15",@"colombo16",@"colombo17"];

}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {    
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [detailFlights count];
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"identi" forIndexPath:indexPath];
    cell.textLabel.text = [detailFlights objectAtIndex:indexPath.row];
    return cell;
}

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    Pass *p = [Pass new];
    p.selectedString = [tableView cellForRowAtIndexPath:indexPath].textLabel.text;

      NSString *selecteOne = p.selectedString;
      [[NSUserDefaults standardUserDefaults] setObject:selecteOne forKey:@"selectedplace"];
     [[NSUserDefaults standardUserDefaults] synchronize];


}

如果您使用可理解的代码提供答案,我感谢您,因为我是iOS的新手。

5 个答案:

答案 0 :(得分:2)

NSUserDefaults不应用于应用程序状态。这是应用程序关闭时应该保留的用户首选项。

正确的方法是直接在viewcontrollers之间传递数据:https://stackoverflow.com/a/9736559/78496

答案 1 :(得分:2)

根据@ chedabob的建议,NSUserDefaults不应用于维护应用程序状态。

相反,您可以使用Protocols在First View Controller中反向传播选择。

在您的情况下,只需使用

[[NSUserdefaults standardUserDefaults] objectForKey:@"selectedplace"];
viewWillAppear的{​​{1}}中

更新字符串。

答案 2 :(得分:1)

首先 - 您不需要在didSelect方法中使用太多代码来获取所选字符串。只需使用你的阵列:

NSString *selectedText = [detailFlights objectAtIndex: indexPath.row]; // or detailFlights[indexPath.row]

当您回到主人(第一个)ViewController时,您需要更新TableView,因为数据已更改。因此,添加viewWillAppear(如果您还没有)方法并刷新您的表格:

- (void)viewWillAppear:(BOOL)animated {
  [super viewWillAppear: animated];
  [self.tableView reloadData]; // put here name of your tableView's property
}

然后,在您的cellForRow方法中:

...
if (indexPath.row == 0) { // in first row you store country
  NSString *text = @"Select country"; // default text
  NSString *selectedCountry = [[NSUserdefaults standardUserDefaults] objectForKey:@"selectedplace"];
  if (selectedCountry) { // if it exist
    text = selectedCountry;
  }
  cell.textLabel.text = text;
}

答案 3 :(得分:0)

您可以在First View Controller中使用此代码从NSUserDefault获取价值。

NSString *selectedPlace = [[NSUserdefaults standardUserDefaults] objectForKey:@"selectedplace"];

答案 4 :(得分:0)

您应该使用委托模式向第一个视图控制器通知所选国家/地区。为此,您必须在第二个视图控制器中编写协议。

@protocol SecondViewControllerDelegate

- (void)secondViewController:(UIViewController *)vc selectedCountry:(NSString *)country;

@end

然后在 (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {     [tableView deselectRowAtIndexPath:indexPath animated:YES]; delegate.secondViewController(self)selectedCountry:@" selectedCountry&#34 ;; }

在第一个视图控制器中,您实现此menthod以更新值。