问题:在我的应用程序中,我在Storyboard中使用模态segue呈现UIViewController。 viewController有一个UITableView,用户可以选择一个单元格。然后我解雇了viewController并返回。我想要做的是当再次出现控制器时,突出显示所选单元格。所以我想将所选单元格的indexPath保存在属性中,并在viewWillAppear中设置该单元格突出显示。但是当viewController被呈现时,它的属性是nil。所以,我的问题是:
模态viewController如何记住它的属性?
答案 0 :(得分:1)
基本问题是你正在混合模型和视图控制器的职责。
记住应用状态是一种模式的责任。视图控制器负责将数据绑定到视图并验证用户输入。
问题是每个人都在作弊。当您在视图控制器中进行临时状态更改时,通常不需要将其分解为模型,因为视图控制器和状态数据具有相同的生命周期。
在您的情况下,状态数据的生命周期比视图控制器更长。将数据分解为模型,然后将该模型应用于视图控制器(单例,从持久存储中读取,在segue中应用,......:有很多方法可以实现)。
由于您提供的信息很少,我可以想到如何实现这一目标。
拥有包含数组allItems
,currentItems
,countries
的模型。拥有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
}
只是一个想法...