代码之家  ›  专栏  ›  技术社区  ›  fabian789

在许多uiviewcontroller之间传递变量

  •  8
  • fabian789  · 技术社区  · 14 年前

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

    6 回复  |  直到 12 年前
        1
  •  7
  •   user362178    14 年前

    如果需要,可以用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 . 设置变量时,注意释放并正确保留变量。使用这种全局变量很容易创建内存泄漏。

        2
  •  3
  •   starbugs    14 年前

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

    例如,声明一个名为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
  •  3
  •   Ajay Sharma    13 年前

    是的,有一个简单的方法来处理这个……

    你可以取一个全局变量

    在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;
    

    现在在你们班上。

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

    现在,您可以通过这个对象在类中的任何地方访问它:

    appDel.messageString

    小心地跟着我的脚步走 我的手指疼得厉害, 我相信这肯定会帮助你…..

    过上轻松的生活,

        4
  •  1
  •   Francois    14 年前

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

    Singleton in objective-C, Wikipedia

        5
  •  0
  •   Alex Gosselin    14 年前

    我不会太快回避数据封装,这是Objective-C的一个很好的特性。

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

    如果您的视图以结构化的方式进行,那么考虑创建一个“数据”类,不管您正在创建什么,然后将它从父视图传递到子视图,直到到达那里。(记住,“传递”不是一个昂贵的操作,这些东西保持在原位,你传递的是一个小指针)

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

    请记住,只有“传入”数据的路径提供了附加的优势,稍后,您可能需要多次收集该开始信息,并启动不同的可能的最后一个视图,而只传入不同的视图则很简单。如果你走的是全球路线,那么你就必须开始在你以前访问过的任何地方重新写作。

        6
  •  0
  •   raghul    13 年前

    你可以将它作为一个单独的按钮使用,也可以将它保存在应用程序委托中,然后像这样调用 [AppDelegate GetString];