【问题标题】:Pass a variable between lots of UIVIewControllers在许多 UIVIewControllers 之间传递一个变量
【发布时间】:2011-04-28 10:26:28
【问题描述】:

在我的 iPhone 应用程序中,有一个设置助手可以帮助用户输入大量数据。它基本上是一个 UINavigationController,里面有很多 UIViewController。现在,在某个时刻,我想访问用户在他看到的第一个 UIViewController 中输入的变量。我可以使用 setter 方法在每个 UIViewController 之间传递变量,但我想有一种更简单的方法。

【问题讨论】:

    标签: iphone objective-c xcode uiviewcontroller uinavigationcontroller


    【解决方案1】:

    如果你愿意,你可以用 C 风格声明全局或类变量。如果您希望在 UIViewController 的多个子类中使用相同的变量,您可以在第一个控制器的 .h 文件中将其声明为外部变量,例如:

    #import <UIKit/UIKit.h>
    
    extern NSString *myGlobalString;
    
    @interface MyFirstViewController : UIViewController {
    ...
    

    然后您将在 .m 文件中重新声明它,而不使用 extern。

    #import "MyFirstViewController.h"
    
    NSString *myGlobalString;
    
    @implementation MyFirstViewController 
    

    您不应在其他 .m 或 .h 文件中重新声明它,但您可以在所有导入 MyFirstViewController.h 的文件中访问该变量。设置变量时,请注意正确释放和保留它。使用这种全局变量很容易造成内存泄漏。

    【讨论】:

    • 我不必存储指向原始 MyFirstViewController 的指针来访问它吗?
    • 不,你不必存储任何指向对象的指针来访问这种变量,但你只会得到一个这样的实例,它在你的所有对象之间共享。
    【解决方案2】:

    解决此问题的一种简单但可重用且可扩展的方法是使用单例。

    例如,声明一个名为 SetupConfig 的新类。

    您的 SetupConfig.h 应如下所示:

    @interface SetupConfig : NSObject {
        NSString *_myString;
    }
    
    @property (retain) NSString *myString;
    
    + (id)sharedSetupConfig;
    
    @end
    

    以及对应的SetupConfig.m:

    #import "SetupConfig.h"
    
    SetupConfig *g_sharedSetupConfig = nil;
    
    @implementation SetupConfig
    
    @synthesize myString = _myString;
    
    + (id)sharedSetupConfig {
        if (!g_sharedSetupConfig) {
            g_sharedSetupConfig = [[SetupConfig alloc] init];
        }
    }
    
    @end
    

    现在,在视图控制器实现中,您希望从以下位置访问 myString:

    @import "MyViewController.h"
    @import "SetupConfig.h"
    
    @implementation MyViewController
    
    - (void)methodDoingSomethingWithSingletonString
    {
        NSString *myString = [[SetupConfig sharedSetupConfig] myString];
    } 
    
    @end
    

    与使用全局 C 变量相比,单例方法具有许多优点。首先,您不必一遍又一遍地重新声明全局变量。更重要的是,您的“全局”变量被封装在一个类中。合成属性 getter/setter 是将实际变量从代码的其余部分抽象出来的好方法。最后,这个实现可以很容易地集成到单元测试中。

    【讨论】:

      【解决方案3】:

      是的,有很多简单的方法来处理这个.....

      你可以取一个全局变量

      在你的 Delegate.h 文件中声明你的变量:

      @interface Smoke_ApplicationAppDelegate : NSObject <UIApplicationDelegate> {
      
          UIWindow *window;
          UINavigationController *navigationController;
          NSString *messageString;  //This would be your String Variable
      
      }
      
      @property(nonatomic,retain)NSString *messageString;
      

      其次在Delegate.m文件中

      @implementation Smoke_ApplicationAppDelegate
      
      @synthesize window;
      @synthesize navigationController;
      @synthesize messageString;  // Synthesize it over here..
      

      这已经完成了。现在你可以在所有/任何你想要的类中使用这个字符串变量了。

      使用这个全局变量。

      只需导入您的委托文件 制作它的对象....

      #import "DelegateFile.h"
      
      @implementation About
      
       DelegateFile *appDel;
      

      现在在你的班级.m

      - (void)viewDidLoad {
          [super viewDidLoad];
      
          appDel=[[UIApplication sharedApplication]delegate];
      
      }
      

      现在你可以通过这个对象在你班级的任何地方访问它:

      appDel.messageString

      请仔细按照我的步骤 在让我的手指如此疼痛之后, 我相信这肯定会对你有所帮助.....

      祝你生活愉快,

      【讨论】:

        【解决方案4】:

        您可以使用可从您的所有类中获得的单例实例,它将处理您需要的所有信息。

        Singleton in objective-C, Wikipedia

        【讨论】:

          【解决方案5】:

          我不会很快绕过作为 Objective-C 的一个很好的特性的数据封装。

          如果您正在收集您认为是“设置”的内容,请考虑使用 NSUserDefaults。

          如果您的视图以结构化的方式进行到下一个方式,请考虑制作一个“数据”类,无论您正在制作什么,然后将其从父视图传递到子视图,直到您到达那里。 (请记住,“传递”并不是一项昂贵的操作,内容保持不变,您传递的是一个小指针)

          如果您真的想要单例路由,请考虑将其作为应用程序委托的属性(已经存在的单例)

          请记住,只有“传入”数据的路径才能提供额外的优势,以后,也许您会想要多次收集该起始信息,并启动不同的可能最后视图,而只需传入一个不同的。如果你走全球路线,那么你将不得不在你之前访问过的任何地方开始重写。

          【讨论】:

            【解决方案6】:

            您可以将其用作单例,也可以将其保留在应用程序委托中并像这样调用 [appdelegate 获取字符串];

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-06-28
              • 2022-01-06
              • 2023-03-17
              • 2017-10-16
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多