我的第一个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的新手。
答案 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以更新值。