【问题标题】:Proper way to initialize state in target view controller from segue?从segue初始化目标视图控制器状态的正确方法?
【发布时间】:2014-07-07 18:45:52
【问题描述】:

我有一个带有简单“钻入”模式的应用。我以地图模式或列表模式呈现项目列表。单击一个潜入更详细的“编辑”视图控制器。我的编辑控制器有

@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 setter 发生在view 被填充之前,所以viewModeSegments 仍然是nil。我尝试了 setter 中显示的 hack,它强制访问 self.view 以确保它已加载。但这似乎是个坏主意。我不知道的是,我应该改用什么模式。

我可以将showMap 设置为带有支持的普通属性,然后在viewDidLoad 时间将该状态镜像到小部件中,但是仅针对那一次蹦床般的效果拥有一个属性/状态似乎很愚蠢。

【问题讨论】:

    标签: ios cocoa-touch uiviewcontroller segue uistoryboardsegue


    【解决方案1】:

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

    根本问题是您将视图(或子视图)用作知识容器,而实际上不应该使用它。视图用于展示知识,而不是拥有该知识。

    更广泛地说,滥用视图及其提供的属性通常很有吸引力,例如视图tags、单元格选择状态等,因为将这些信息“额外”存储在其他地方似乎既简单又浪费 -但这并不意味着这样做是正确的。

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

    【讨论】:

      【解决方案2】:

      我想你完全理解这个问题。您可以通过强制从 vc 的 prepareForSegue... 中加载视图来稍微减少 hacky-ness。

      (void)controller.view;
      

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

      【讨论】:

        猜你喜欢
        • 2017-01-20
        • 1970-01-01
        • 1970-01-01
        • 2016-01-01
        • 1970-01-01
        • 2015-12-05
        • 1970-01-01
        • 1970-01-01
        • 2020-10-30
        相关资源
        最近更新 更多