objective-c在视图之间传递字符串

时间:2011-06-18 02:06:30

标签: objective-c string uiviewcontroller

我正在试图找出在视图之间传递字符串的最佳方法。

让我们说,例如,用户可以选择他们想要的口味冰棒。在打开视图中,他们按下一个按钮,打开一个表视图控制器,显示一个包含5种口味的表。假设用户选择“Grape”并且视图控制器立即关闭并返回到开始视图。如何将“Grape”的字符串数据输入到开放视图控制器?

我已经阅读了一些关于NSUserDefaults的内容,并且已经玩了一下,但对我来说似乎有点不稳定,我不确定这是不是最好的选择。建议?

5 个答案:

答案 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. 孩子发布通知,告诉任何关心的人,他们的数据已经发生变化。
  4. 大多数时候,我更喜欢选项#1。父视图控制器已经知道有关子视图控制器的一些信息,因为它毕竟是实例化子视图的父视图。父母保持对孩子的引用也很简单,当父母的视图变得可见时,它可以轻松获取所需的数据。

    如果您不希望父级必须跟踪子级,则选项#2是好的 - 它可以实例化子级,以模态方式呈现它或将其推送到导航堆栈,然后忘记它。如果你想要一些关于孩子数据接收者的额外灵活性,那也很好。例如,您可以将数据模型设置为子视图控制器而不是父视图控制器,并且可以将选定的风格(或其他)直接传递给模型。

    当可能有多个对象对子数据的更改感兴趣时,或者您不确定哪个对象可能感兴趣时,选项#3会发光。

    默认系统可以使用,特别是对于小型数据,但IMO最好将其视为存储机制而不是通信渠道。

答案 2 :(得分:0)

在您的示例中,您可以使用UIPickerView向用户显示选项并获取所选值。请查看UIPickerView的文档。

答案 3 :(得分:0)

我认为考虑这个问题的真正方法是用模型,视图,控制器来概念化你的问题,这就是你应该如何处理所有基于Cocoa的问题,正如Apple的文档经常重申的那样。

你的两个观点,他们是观点,他们应该只关心与用户的互动(显示信息,接受输入)。

应该有控制器(复数?),此控制器知道有2个视图,并允许视图与数据交互..这是模型

模型实际上有一个名为NSString *flavor;的变量。它掌握着这些信息。任何查看,通过与控制器的接口,都会获得相同的变量风格以供显示或修改。

回顾一下:您可以通过将数据放在一个位置模型来解决您的问题。存在控制器以将此数据连接到多个视图,这些视图不知道实际数据背后的位置。

答案 4 :(得分:0)

为此,您可以使用NSNotifications