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

时间:2014-09-04 01:34:00

标签: ios objective-c properties uiviewcontroller modalviewcontroller

问题:在我的应用程序中,我在Storyboard中使用模态segue呈现UIViewController。 viewController有一个UITableView,用户可以选择一个单元格。然后我解雇了viewController并返回。我想要做的是当再次出现控制器时,突出显示所选单元格。所以我想将所选单元格的indexPath保存在属性中,并在viewWillAppear中设置该单元格突出显示。但是当viewController被呈现时,它的属性是nil。所以,我的问题是:

模态viewController如何记住它的属性?

3 个答案:

答案 0 :(得分:1)

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

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

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

在您的情况下,状态数据的生命周期比视图控制器更长。将数据分解为模型,然后将该模型应用于视图控制器(单例,从持久存储中读取,在segue中应用,......:有很多方法可以实现)。


由于您提供的信息很少,我可以想到如何实现这一目标。

拥有包含数组allItemscurrentItemscountries的模型。拥有currentCountry财产。覆盖-setCurrentCountry:以重建currentItems

- (void)setCurrentCountry:(MyCountryModel *)currentCountry
{
    _currentCountry = currentCountry;
    self.currentItems = [self filterAllItemsByCountry:currentCountry];
}

项目视图控制器将包含模型的实例。当推送国家视图控制器时,模型可以在segue中传递。国家/地区视图控制器将使用countries作为其数据源。

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

答案 1 :(得分:1)

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

你应该做的是每次都出现相同的模态视图控制器,以便它记住属性。

使用NSUSERDEFAULTS:

你有一个属性,称之为_indexPath

NSString *indexPathString = [NSString stringWithFormat: @"%@", _indexPath];
[[NSUserDefaults standardUserDefaults] setObject: indexPathString forKey: @"Index_Path"];

要检索indexPath,请执行以下操作:

(在-(void) viewWillAppear

NSString *indexPathString = [[NSUserDefaults standardUserDefaults] objectForKey: @"Index_Path"];
// convert indexPathString to indexPath and save as _indexPath

答案 2 :(得分:0)

您不能将索引路径保存到用户默认值吗?

    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
    }

只是一个想法...