iOS:模态viewController如何记住其属性?

iOS:模态viewController如何记住其属性?,ios,objective-c,properties,uiviewcontroller,modalviewcontroller,Ios,Objective C,Properties,Uiviewcontroller,Modalviewcontroller,问题:在我的应用程序中,我使用情节提要中的模式序列呈现UIViewController。 该viewController具有UITableView,用户可以选择单元格。然后我关闭viewController并返回。我想做的是,当控制器再次显示时,所选单元格将高亮显示。所以我想将选定单元格的indexPath保存在一个属性中,并在ViewWillDisplay中设置突出显示的单元格。但当显示viewController时,其属性为零。因此,我的问题是: 模态viewController如何记住其属

问题:在我的应用程序中,我使用情节提要中的模式序列呈现UIViewController。 该viewController具有UITableView,用户可以选择单元格。然后我关闭viewController并返回。我想做的是,当控制器再次显示时,所选单元格将高亮显示。所以我想将选定单元格的indexPath保存在一个属性中,并在ViewWillDisplay中设置突出显示的单元格。但当显示viewController时,其属性为零。因此,我的问题是:


模态viewController如何记住其属性?

您不能将indexpath保存为用户默认值吗

    let index = NSIndexPath(index: 35)
    NSUserDefaults.standardUserDefaults().setValue(index, forKey: "savedIndex")


    //Then in your viewwillappear
    if let savedIndex = NSUserDefaults.standardUserDefaults().valueForKey("savedIndex") as? NSIndexPath {
        //set the highlighted cell
    }

只是想一想…

基本问题是您正在混合模型和视图控制器的职责

记住应用程序状态是模特的责任。视图控制器负责将数据绑定到视图并验证用户输入

问题是每个人都作弊。当视图控制器中存在临时状态更改时,通常不需要将其分解到模型中,因为视图控制器和状态数据具有相同的生命周期

在您的情况下,状态数据比视图控制器具有更长的生命周期。将数据分解成一个模型,然后将该模型应用于视图控制器(单例、从持久性存储读取、在序列中应用……:有很多方法可以做到这一点)


你提供的信息很少,我能想到如何做到这一点

拥有一个包含数组
所有项
当前项
国家/地区
的模型。拥有
currentCountry
属性。重写
-setCurrentCountry:
以重建
currentItems

- (void)setCurrentCountry:(MyCountryModel *)currentCountry
{
    _currentCountry = currentCountry;
    self.currentItems = [self filterAllItemsByCountry:currentCountry];
}
items视图控制器将包含模型的一个实例。当按下“国家/地区”视图控制器时,可以在序列中传递模型。国家/地区视图控制器将使用
国家/地区
作为其数据源

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    cell = …

    MyCountryModel *country = self.model.countries[indexPath.row];

    cell.selected = country == self.model.currentCountry;

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    MyCountryModel *country = self.model.countries[indexPath.row];

    self.model.currentCountry = country;
}

每次显示模态视图控制器时,它都是一个新实例。如果希望一个新实例记住正在保存的属性(如indexPath),可以将其保存为NSUserDefaults,这样就可以重新访问所有内容,或者只显示相同的模态视图控制器

您应该做的是每次都显示相同的模态视图控制器,以便它记住属性

要使用NSUserDefault,请执行以下操作:

你有一个属性,称它为

NSString *indexPathString = [NSString stringWithFormat: @"%@", _indexPath];
[[NSUserDefaults standardUserDefaults] setObject: indexPathString forKey: @"Index_Path"];
要检索索引XPath,只需执行以下操作:

(在
-(void)视图中将出现


第二次演示时,它是视图控制器的另一个实例。呈现控制器可以保存模态控制器,并且每次都重新呈现相同的实例。或者,另一个对象可以记住选择了哪些项目。这个对象可以是您的数据模型,或者更简单地说是呈现控制器中的属性。关于如何存储它的决定取决于这些控制器需要在应用程序中重用的位置和方式。@Aaron Brager thanx man!照你说的做,做得很好!如果你愿意接受,请回答。我对应用程序中发生的事情不太了解。用户选择表示过滤上一个ViewController的UITableView的国家/地区的单元格开关。这需要在模型中吗?我对iOS真的很陌生,我还不了解MVC!谢谢我对我的回答又加了一点。@JefferyThomas我想用swiftFyi来回答,这个答案是用Swift来回答的,而这个问题要求的是客观的-C。是的,我的错。。。很好,你复制了我的答案,并将其翻译成Obj-C作为海报。谢谢你的回答,但我认为NSUserDefaults不是存储这些东西的合适位置。正如我所说,我是新来的,所以也许我错了。又来了!我编辑了我的答案。如果不想使用NSUserDefaults,每次都可以显示相同的模态视图控制器。
NSString *indexPathString = [[NSUserDefaults standardUserDefaults] objectForKey: @"Index_Path"];
// convert indexPathString to indexPath and save as _indexPath