我正在试图找出在视图之间传递字符串的最佳方法。
让我们说,例如,用户可以选择他们想要的口味冰棒。在打开视图中,他们按下一个按钮,打开一个表视图控制器,显示一个包含5种口味的表。假设用户选择“Grape”并且视图控制器立即关闭并返回到开始视图。如何将“Grape”的字符串数据输入到开放视图控制器?
我已经阅读了一些关于NSUserDefaults的内容,并且已经玩了一下,但对我来说似乎有点不稳定,我不确定这是不是最好的选择。建议?
答案 0 :(得分:3)
有几种方法可以执行此操作,您可以发布包含对象的通知,该对象包含您的开始视图所订阅的所选信息。您将在您的案例中选择该选项时发布此通知。
另一种选择是使用委托模式,您的开放视图可以是次要视图的委托,当选择该选项时,会调用委托方法来传回该信息。
您想要远离的是为您的辅助视图提供对开放视图的引用,这会使您的视图层次结构严格,并且在没有相同的打开视图的情况下,您的辅助视图将无法再在其他任何地方重复使用。
进一步研究代表示例,即我将采用的路线。
定义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 :(得分:1)
我至少可以想到三种合理的方法:
大多数时候,我更喜欢选项#1。父视图控制器已经知道有关子视图控制器的一些信息,因为它毕竟是实例化子视图的父视图。父母保持对孩子的引用也很简单,当父母的视图变得可见时,它可以轻松获取所需的数据。
如果您不希望父级必须跟踪子级,则选项#2是好的 - 它可以实例化子级,以模态方式呈现它或将其推送到导航堆栈,然后忘记它。如果你想要一些关于孩子数据接收者的额外灵活性,那也很好。例如,您可以将数据模型设置为子视图控制器而不是父视图控制器,并且可以将选定的风格(或其他)直接传递给模型。
当可能有多个对象对子数据的更改感兴趣时,或者您不确定哪个对象可能感兴趣时,选项#3会发光。
默认系统可以使用,特别是对于小型数据,但IMO最好将其视为存储机制而不是通信渠道。
答案 2 :(得分:0)
在您的示例中,您可以使用UIPickerView向用户显示选项并获取所选值。请查看UIPickerView的文档。
答案 3 :(得分:0)
我认为考虑这个问题的真正方法是用模型,视图,控制器来概念化你的问题,这就是你应该如何处理所有基于Cocoa的问题,正如Apple的文档经常重申的那样。
你的两个观点,他们是观点,他们应该只关心与用户的互动(显示信息,接受输入)。
应该有控制器(复数?),此控制器知道有2个视图,并允许视图与数据交互..这是模型
模型实际上有一个名为NSString *flavor;
的变量。它掌握着这些信息。任何查看,通过与控制器的接口,都会获得相同的变量风格以供显示或修改。
回顾一下:您可以通过将数据放在一个位置模型来解决您的问题。存在控制器以将此数据连接到多个视图,这些视图不知道实际数据背后的位置。
答案 4 :(得分:0)
为此,您可以使用NSNotifications
。