Objective-C:需要帮助跟踪以前按下的按钮

Posted

技术标签:

【中文标题】Objective-C:需要帮助跟踪以前按下的按钮【英文标题】:Objective-C: Need help tracking previously pressed button 【发布时间】:2012-06-03 15:33:41 【问题描述】:

我希望您能帮助我回答一个基于 Objective-C 的问题,该问题目前正在阻止我继续我的程序。

我有一个游戏,其中有一个标题为 1、2、3 等的按钮网格。每个按钮都会将您带到 GameScreen UIView 并传递各种信息 - 即姓名、年龄等。如果用户正确回答了问题,他被带回了网格 - 我现在希望他按下的按钮显示一个勾号,而不是像以前那样只是一个带有一些文本的空白按钮。

我的问题是跟踪按下的按钮。当我返回主屏幕时,我不知道如何说“将我刚刚按下的按钮更改为刻度图像”。到目前为止,所有东西都显示为 (null)。

当我第一次按下按钮时,我使用 'if([sender.currentTitle isEqualToString:@"1"]) 来标记我想要通过的信息 - 这很好,但在那之后我已经通过另一种观点我失去了按下哪个按钮。

我可以通过每个按钮唯一的变量,并提出一个 if then else 语句来测试变量的值(即 if [questionansweredcorrectly isEqualToString :@"Question1"]),但正如我这里可能有一百个或更多的按钮,这太麻烦了。

我希望我已经很好地解释了这种情况,并且有人能够指出我需要在这里使用的方法。

提前致谢!

编辑:

为了响应我如何加载到其他视图中,我使用以下编码风格:

GameScreen *screen = [[GameScreen alloc] initWithNibName:nil  bundle:nil]; 
screen.modalTransitionStyle = UIModalTransitionStyleCoverVertical; 
[self presentModalViewController:screen animated:YES];

这就是我进入新视图的方式 - 从另一个屏幕执行相同操作以返回带有按钮的主屏幕。我在这篇文章中不使用故事板。这是否有助于澄清我如何浏览这些视图?我不使用故事板。

【问题讨论】:

怎么改,又回到之前的视图? 在应用程序中使用导航。 好吧,你这样做,你应该改变回到以前的观点,正如我提到的' 【参考方案1】:

据我了解,您完全忽略了您的第一个观点。或者你重新加载第一个视图,你应该再次显示它。

不是 100% 了解如何加载视图,但我认为这可能会有所帮助:

要显示上一个视图(包含所有按钮),只需在您加载到第一个视图之上的视图中使用以下代码:

[self dismissModalViewControllerAnimated:YES];

希望对你有帮助!

【讨论】:

我可以看到这实际上会有什么帮助,尽管在这种情况下,我需要返回两个视图才能得到我需要的视图。我以前从未听说过这种方式,只是通过我在编辑中的解释方式。如果这有帮助,我会试一试并报告......! 感谢 SirKaydian - 我遇到的问题是我有三个屏幕 - GridScreen(按钮所在的位置)-> GameScreen(问题)-> CorrectScreen(确认正确答案)-然后来自 CorrectScreen返回到 GridScreen。使用dismissModalViewControllerAnimated 我回到GameScreen,这是有道理的,但现在我不能再从GameScreen 到GridScreen - 你知道我该怎么做吗?我有一种感觉,一旦我能做到这一点,那么你的建议就会被证明是正确的! 好的,我使用了 [self[presentingViewController]presentingViewController]dismiss... 我回到了我想要的屏幕,我认为现在可以通过跟踪右键来工作 - 我会确认马上! 一个接一个地执行到GridScreen的segue然后到CorrectScreen的segue。当您关闭 CorrectScreen 时,GridScreen 将等待。 我现在有了解决方案。我用 [self[presentingViewController]presentingViewController]dismissModalViewControllerAnimated = YES]; (我不确定代码的正确性如何)但它仍然有效,我也能够跟踪正确的发件人并在需要的地方应用勾选。感谢您在这里的帮助-我认为托马斯与故事板有关,对吗?我不在这里使用它们。但是,现在解决方案就在那里,感谢大家的帮助!【参考方案2】:

这让我觉得是设计模式的问题。我不认为我完全理解这是如何实现的,但这是我如何攻击它。

您的 QuestionGridViewController 塞满了按钮,每个按钮都显示一个 GameScreenViewController 实例,并根据

    点击的按钮 用户。

让我们在这里关注 MVC。您需要一个模型类来保存每个问题(并且可能有问题对象来封装该数据)。

您还需要一个代表用户及其详细信息。

在 QuestionGrid 的 viewDidLoad 中,从问题模型加载问题以填充视图。已经完成的应该设置刻度线。

对于所有这些按钮按下,使用自定义初始化程序初始化 GameScreen,该初始化程序将用户对象和问题对象作为参数。

提交 GameScreen 的答案后,更新问题对象。再次加载 QuestionGrid 时,它会加载更新的问题。两个视图控制器都不必将任何数据传递给另一个。

这是遵守 MVC 的一大优势——您已经从逻辑中抽象出数据,并且这样做可以让您在处理此类问题时保持理智。

我不知道这是否正是您想要解决的问题,但正如 SirKaydian 所指出的,您的工作方式并不是特别明显。不过,我希望我已经展示了优秀的应用程序设计是如何避免这些微不足道的问题的。

【讨论】:

以上是关于Objective-C:需要帮助跟踪以前按下的按钮的主要内容,如果未能解决你的问题,请参考以下文章

IOS/Objective-C:检测自定义表格视图单元格中的按钮按下?

跟踪哪个是特定类型的最后按下按钮的方法

如何让验证取决于按下的按钮?

SpriteKit中的按下按钮

ios/objective-c: 检测 tabbarbutton 按下事件

当按下自定义按钮时,UILabel 不会更新(Objective-C)