我在dynamic更新另一个控制器中的UILabel时遇到了麻烦。 它需要对应于在objective-c中选中的checkbox

在购物商店的应用程序工作。 过去的一周半,我一直在围绕着如何正确地做到这一点。 问题在于UILabel需要dynamic更新与选中checkbox对应的文本。 当点击应用button时,还需要知道是否应用select,或者如果客户决定改变主意而不点击应用,则返回先前的select。 这是我遇到的问题。

我把3个控制器称为图像1,图像2和图像3。

我的模特是一个独立的class级,当我们希望细化一系列服装项目结果时,我会传递来回的副本以保持用户的select。

例如,用户点击图像1中的细化button

他们被拿到形象2,他们决定他们想要改善结果

然后他们被拍到他们做select的图像3页

哪里出现问题:

简而言之,在图片3中,客户做出select并且完成点击,然后他们被接回到图像2,其中他们的select被显示在由select的细化选项(例如性别)下方的UILabel中的逗号分隔的string中。 如果他们的select正确,他们可以点击应用,完成并显示如图1所示。细化button中还会显示一个勾号,以使客户意识到精炼是有效的。

现在让我们说一个select已经在下面的图像,客户回到图像3来修改select。 假设他没有选中“微型网站”。 应该发生的是,当他回到图像2时,应该更新提炼选项下面的列表。

这工作正常,但我实际上更新当点击应用button时更新的属性。 所以如果客户决定他们不想再细化,而不是点击应用,而后退button,而不是他们的形象1,那么我需要在属性中更新原始selectstring。

事情是这样的,只要在图像3中进行select,就会更新这个属性。所以当客户返回到图像2时,因为我们没有选中“microsites”,只有“men”会显示在refine by选项下面的string中。

我已经尝试创build一个临时属性来保存以前的select,但事情只是真的让这一切来回麻烦。

更多信息:

我使用prepareForSegue方法和委托/协议在控制器之间来回传递模型类。

当图像3中的完成button被点击时,图像2就知道了。 这是我通过模型的地方。 图像1知道何时点击图像2中的应用button,并且这是我将模型传递过来的地方。 为了传递模型从图像1到2,然后2到3我使用prepareForSegue方法。

图片1:

在这里输入图像说明

图2:

在这里输入图像说明

图3:

在这里输入图像说明

你会怎么做? 我觉得我把所有的模型都转换成了自己的类,从而开创了一个好的开始。 这使事情变得简单了,但UILabel的另一个问题阻碍了我。

更新:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([[[sender titleLabel] text] isEqualToString:@"Gender"]) { VAGRefineGenderViewController *vc = [segue destinationViewController]; [vc setDelegate:self]; [vc setRefineModel:[self refineModel]]; } } 

工作代码:

 @implementation VAGRefineModel { VAGRefineModel *_object; } -(id)copyWithZone:(NSZone *)zone { VAGRefineModel *modelCopy = [[VAGRefineModel alloc] init]; modelCopy->_object = [_object copyWithZone: zone]; return modelCopy; } 

然后在图像2 /控制器2中,我只是将传递给控制器​​3的模型设置为现有模型的副本。

这似乎相当简单。

  • 你应该创build一个模型的副本,并将其传递给下一个viewController,那么你不必担心对它的编辑。
  • 如果用户按下,则该副本被丢弃。
  • 如果按下完成,则会收到副本并replace当前模型,然后重新加载视图。

它可能看起来像这样简单(没有error handling,使其易于遵循)

  - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender; { Model *model = [self.model copy]; VC2 *viewController = segue.destinationViewController; viewController.model = model; viewController.delegate = self; } - (void)didTapDoneButtonWithModel:(Model *)model; { self.model = model; [self reloadData]; } 

我没有详细阅读你的文章,但已经阅读足够的要点了。

我会打电话给你的屏幕级别1(主),级别2(顶级详细)和级别3(细节),而不是图像1/2/3,因为我在谈论图片,我正在谈论主人/详细视图控制器。

这听起来像你有3个级别的视图控制器,允许用户编辑更细的级别的search细节。

我build议设置你的模型,这样你就可以将由等级2和等级3处理的细节封装到对象中。 当你准备下降到级别3时,为性别和微型网站创build一个设置副本,并将其传递给级别视图控制器。 用户将与3级进行交互,3级拥有自己的设置副本。

第3级应该设置第2级,因为它是委托,与委托消息

 -userChangedSettings: (Level3SettingsObject *) changedSettings 

或类似的东西。

如果点击完成,3级VC将在其委托上调用该方法,将更改传递给Level3Settings对象直到级别2,然后popup自己/closures自身。 (以适当者为准)。

如果用户点击取消,只需closurespopup/解除而不调用委托方法告诉委托有关更改设置。 级别2对象中的设置不会改变。

第二级与第一级之间的沟通也是一样的。

如果有意义的话,可以这样做,以使得级别1的设置包含级别2的数据对象,并且级别2的设置包含级别3的数据对象。 这样,等级3的变化回到等级2,并且如果用户从等级2中取消,则等级2和等级3中所做的所有更改都被丢弃,并且只有当他们在等级2中点击保存时,才能从等级2通过了1级。