从segue初始化目标视图控制器中的状态的正确方法?

时间:2014-07-07 18:45:52

标签: ios cocoa-touch uiviewcontroller segue uistoryboardsegue

我有一个简单的应用程序"钻进"图案。我以地图模式或列表模式呈现项目列表。点击一个潜入更详细的"编辑"查看控制器。我的编辑控制器有

@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时将该状态镜像到窗口小部件中,但是为一次性蹦床设置属性/状态似乎很愚蠢喜欢效果。

2 个答案:

答案 0 :(得分:2)

这是另一种选择......

潜在的问题是您正在使用视图(或子视图)作为真正不应该用于的知识容器。视图用于显示知识,而不是拥有该知识。

更广泛地说,滥用视图及其提供的属性(例如查看tag,单元格选择状态等)通常很有吸引力,因为在其他地方“另外”存储该信息似乎很简单且浪费好吧 - 但这样做并不正确。

控制器有责任维护有关所显示内容的状态信息,因此您应该将该信息存储在控制器上的属性中并将其保存在那里(使用它来更新视图,而不是查询关于其状态的观点。)

答案 1 :(得分:1)

我认为你完全理解这个问题。您可以通过强制来自vc' prepareForSegue的视图加载来减少hacky-ness ......

(void)controller.view;

但我认为你应该采取的答案是你自己的,使用常规属性。我不认为这很愚蠢,因为双模vc的默认模式是合法的属性。 (想想UIViewController -hidesBottomBarWhenPushed