如何解决object-c在视图之间传递字符串
| 我正在尝试找出在视图之间传递字符串的最佳方法。 例如,假设用户可以选择他们想要的口味冰棍。在打开视图中,他们按下一个按钮以打开一个表视图控制器,该控制器显示5种口味的表。假设用户选择\“ Grape \”,则视图控制器立即关闭并返回到打开的视图。如何将\“ Grape \”的字符串数据获取到打开视图控制器? 我已经阅读了一些有关NSUserDefaults的内容,并对其进行了一些尝试,但是对我来说似乎有点不可思议,而且我不确定这是否是最好的选择。有什么建议吗?解决方法
有几种方法可以执行此操作,您可以发布一个通知,其中包含一个对象,该对象包含您的打开视图所预订的选定信息。您将在您的案例中选择该选项时发布此通知。
另一个选择是使用委托模式,您的打开视图可以是您的辅助视图的委托,当选择该选项时,将调用委托方法将信息传递回去。
您想要远离的是为辅助视图提供对打开视图的引用,这将使您的视图层次结构变得僵化,并且在没有相同打开视图的情况下,您无法在其他任何地方重复使用辅助视图。
为了进一步研究委托示例,这是我要走的路线。
定义你的ColorPickerViewController
@interface ColorPickerViewController
@property (nonatomic,assign) id delegate;
// other supporting properties
@end
@protocol ColorPickerViewControllerDelegate <NSObject>
@optional
- (void) colorWasPicked:(UIColor *)pickedColor;
@end
@implementation ColorPickerViewController
@synthesize delegate;
- (void)colorSelected { // some method that is called when the user selects a color
if([self.delegate respondsToSelect(@selector(colorWasPicked:)]) {
[self.delegate colorWasPicked:selectedColor];
}
}
@end
然后,您的打开视图控制器将实例化ColorPickerViewController并将其自身分配为委托
@interface OpeningViewController : UIViewController <ColorPickerViewControllerDelegate> {
}
@implementation OpeningViewController
// implement the delegate method you wrote
- (void) colorWasPicked:(UIColor *)pickedColor {
self.userSelectedColor = pickedColor;
}
显然,这不是剪切和粘贴代码,但它应该引导您朝着正确的方向前进,可能会出现一些错误,但我认为在大多数情况下应该很清楚。
, 我至少可以想到三种合理的方法:
父视图控制器从子视图控制器检索所需的数据。
给子视图控制器一个委托,通常是父委托,并调用某种委托方法来传递它收集的所有信息。
孩子会发布一条通知,告知所有愿意聆听其数据已更改的人。
大多数时候,我更喜欢选择#1。父视图控制器已经对子视图控制器有所了解,因为毕竟,实例化该子视图的是父级。父母保留对孩子的引用也很简单,当父母的视图可见时,它可以轻松获取所需的数据。
如果您不希望父母跟踪孩子,那么选择#2是个好方法-它可以实例化孩子,以模态形式显示孩子或将其推入导航堆栈,然后将其遗忘。如果您希望孩子数据的接收者有更多的灵活性,这也很好。例如,您可以将数据模型设为子级的委托而不是父级视图控制器,并且可以将所选的样式(或其他内容)直接传递给模型。
当可能有多个对象对子数据的更改感兴趣时,或者当您不确定哪个对象可能感兴趣时,选项3会亮起。
默认系统很好用,特别是对于小数据,但IMO最好将其视为存储机制,而不是通信渠道。
, 在您的示例中,您可以使用UIPickerView向用户显示选项并获取所选值。看看UIPickerView的文档。
, 我认为,真正的解决方法是根据模型,视图,控制器来概念化问题,这就是应如何解决所有基于Cocoa的问题的方法,正如Apple文档经常重申的那样。
您的两个视图是Views,它们只应与用户交互(显示信息,接受输入)。
应该有一个控制器(复数?),该控制器知道有2个视图,并允许这些视图与数据进行交互。
该模型实际上有一个名为NSString *flavor;
的变量。它拥有该信息。通过与Controller的接口,任何视图都具有相同的变量样式以进行显示或修改。
回顾一下:您可以通过将数据放置在1个位置(模型)来解决问题。存在一个控制器,用于将该数据连接到您的多个视图,这些视图不知道实际数据的保存位置。
, 为此,您可以使用NSNotifications
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。