我有一个简单的应用程序"钻进"图案。我以地图模式或列表模式呈现项目列表。点击一个潜入更详细的"编辑"查看控制器。我的编辑控制器有
@property (assign, nonatomic) BOOL showMap;
在源实现setter / getter方法中:
#pragma mark - Properties
- (BOOL) showMap {
return self.viewModeSegments.selectedSegmentIndex == 1;
}
- (void) setShowMap: (BOOL) showMap {
self.view; // had to add this, it's a hack
self.viewModeSegments.selectedSegmentIndex = showMap ? 1 : 0;
}
我在启动控制器中使用以下命令设置此属性:
#pragma mark - Navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString: @"ValveEditSegue"]) {
ValveEditController* controller = segue.destinationViewController;
controller.valve = self.selections.anyObject;
controller.showMap = ShowMap;
}
}
我发现,showMap
制定者是在填充view
之前发生的,因此viewModeSegments
仍然是nil
。我尝试了setter中显示的hack,强制访问self.view
以确保它已加载。但这似乎是一个坏主意。我不知道的是,我应该使用的模式。
我可以通过支持使showMap
成为普通属性,然后在viewDidLoad
时将该状态镜像到窗口小部件中,但是为一次性蹦床设置属性/状态似乎很愚蠢喜欢效果。
答案 0 :(得分:2)
这是另一种选择......
潜在的问题是您正在使用视图(或子视图)作为真正不应该用于的知识容器。视图用于显示知识,而不是拥有该知识。
更广泛地说,滥用视图及其提供的属性(例如查看tag
,单元格选择状态等)通常很有吸引力,因为在其他地方“另外”存储该信息似乎很简单且浪费好吧 - 但这样做并不正确。
控制器有责任维护有关所显示内容的状态信息,因此您应该将该信息存储在控制器上的属性中并将其保存在那里(使用它来更新视图,而不是查询关于其状态的观点。)
答案 1 :(得分:1)
我认为你完全理解这个问题。您可以通过强制来自vc' prepareForSegue
的视图加载来减少hacky-ness ......
(void)controller.view;
但我认为你应该采取的答案是你自己的,使用常规属性。我不认为这很愚蠢,因为双模vc的默认模式是合法的属性。 (想想UIViewController -hidesBottomBarWhenPushed
)