8

Trong ứng dụng iPhone của tôi, có một trợ lý thiết lập giúp người dùng nhập nhiều dữ liệu. Về cơ bản nó là một UINavigationController với rất nhiều UIViewControllers trong đó. Bây giờ, tại một thời điểm nhất định, tôi muốn truy cập vào một biến mà người dùng đã nhập trong UIViewController đầu tiên mà anh ta thấy. Tôi có thể vượt qua biến giữa mỗi UIViewController với một phương pháp setter, nhưng tôi đoán có một cách dễ dàng hơn.Vượt qua một biến giữa nhiều UIVIewControllers

Trả lời

7

Bạn có thể khai báo biến toàn cầu hoặc lớp theo kiểu C nếu muốn. Nếu bạn muốn biến tương tự có sẵn trong một số các lớp học phụ lại UIViewController, bạn muốn khai báo nó như là một biến extern trong file .h của bộ điều khiển đầu tiên của bạn, ví dụ:

#import <UIKit/UIKit.h> 

extern NSString *myGlobalString; 

@interface MyFirstViewController : UIViewController { 
... 

bạn muốn sau đó redeclare nó trong tập tin .m của bạn mà không có extern.

#import "MyFirstViewController.h" 

NSString *myGlobalString; 

@implementation MyFirstViewController 

Bạn không nên redeclare nó trong .m khác hoặc các file .h, nhưng bạn có thể truy cập vào biến trong tất cả các file nhập khẩu MyFirstViewController.h. Khi thiết lập biến, cẩn thận để giải phóng và giữ nó đúng cách. Thật dễ dàng để tạo ra một rò rỉ bộ nhớ với loại biến toàn cầu này.

+0

Tôi không phải lưu con trỏ vào MyFirstViewController ban đầu để truy cập vào nó? – fabian789

+0

Không, bạn không phải lưu trữ bất kỳ con trỏ nào đến các đối tượng để truy cập loại biến này, nhưng bạn chỉ nhận được một thể hiện của điều này và nó được chia sẻ giữa tất cả các đối tượng của bạn. – user362178

+0

Ok, cảm ơn! Tôi sẽ thử nó ngay khi tôi về nhà. – fabian789

1

Bạn có thể sử dụng một cá thể đơn lẻ, có sẵn từ tất cả các lớp học của bạn, sẽ xử lý tất cả thông tin bạn cần.

Singleton in objective-C, Wikipedia

3

Ya, có nhiều là một cách dễ dàng để xử lý việc này .....

Bạn có thể mất một biến toàn cầu

Trong file Delegate.h bạn khai báo biến của bạn:

@interface Smoke_ApplicationAppDelegate : NSObject <UIApplicationDelegate> { 

    UIWindow *window; 
    UINavigationController *navigationController; 
    NSString *messageString; //This would be your String Variable 

} 

@property(nonatomic,retain)NSString *messageString; 

Thứ hai trong Delegate.m nộp

@implementation Smoke_ApplicationAppDelegate 

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

Đây là Xong. Bây giờ bạn có thể sử dụng Biến Chuỗi này trong Tất cả/bất kỳ lớp nào bạn muốn ..

Để sử dụng Biến toàn cầu này.

Chỉ cần nhập bạn Ủy tập tin làm cho obj của nó ....

#import "DelegateFile.h" 

@implementation About 

DelegateFile *appDel; 

Bây giờ trong class.m bạn

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    appDel=[[UIApplication sharedApplication]delegate]; 

} 

Bây giờ bạn có thể truy cập nó bất cứ nơi nào trong lớp học của bạn bằng cách này Đối tượng:

appDel.messageString

Chỉ cần làm theo bước tôi Cẩn thận Sau khi quá nhiều nỗi đau để ngón tay của tôi, Tôi chắc chắn điều này chắc chắn sẽ giúp bạn .....

Có một cuộc sống dễ dàng,

+0

Cảm ơn, âm thanh tốt. – fabian789

3

Một đơn giản nhưng thể tái sử dụng và cách mở rộng để giải quyết vấn đề này là sử dụng một singleton.

Khai báo một lớp mới có tên là SetupConfig chẳng hạn.

SetupConfig.h của bạn sau đó sẽ giống như sau:

@interface SetupConfig : NSObject { 
    NSString *_myString; 
} 

@property (retain) NSString *myString; 

+ (id)sharedSetupConfig; 

@end 

Và SetupConfig.m tương ứng:

#import "SetupConfig.h" 

SetupConfig *g_sharedSetupConfig = nil; 

@implementation SetupConfig 

@synthesize myString = _myString; 

+ (id)sharedSetupConfig { 
    if (!g_sharedSetupConfig) { 
     g_sharedSetupConfig = [[SetupConfig alloc] init]; 
    } 
} 

@end 

Bây giờ, trong việc thực hiện quan điểm điều khiển bạn muốn truy cập myString từ:

@import "MyViewController.h" 
@import "SetupConfig.h" 

@implementation MyViewController 

- (void)methodDoingSomethingWithSingletonString 
{ 
    NSString *myString = [[SetupConfig sharedSetupConfig] myString]; 
} 

@end 

Cách tiếp cận singleton có nhiều ưu điểm hơn so với usi ng biến C toàn cục. Trước hết bạn không cần phải khai báo lại các biến toàn cầu của bạn. Hơn nữa, các biến "toàn cục" của bạn được đóng gói trong một lớp. Tổng hợp các getters/setters thuộc tính là một cách hay để trừu tượng biến thực tế từ phần còn lại của mã của bạn. Cuối cùng, việc thực hiện này có thể được tích hợp vào các bài kiểm tra đơn vị một cách dễ dàng.

0

Tôi sẽ không quá nhanh để phá vỡ sự đóng gói dữ liệu đó là một tính năng tốt của Objective-C.

Nếu bạn đang thu thập thứ gì đó, bạn sẽ coi là "Cài đặt" hãy xem xét sử dụng NSUserDefaults.

Nếu chế độ xem của bạn tiếp tục theo cách tiếp theo, hãy xem xét tạo lớp "dữ liệu", bất kể bạn đang làm gì, sau đó chuyển nó từ chế độ xem gốc sang chế độ xem phụ cho đến khi bạn đến đó. (Hãy nhớ rằng "đi qua" không phải là một hoạt động đắt tiền, những thứ vẫn được đặt, bạn đang đi qua một con trỏ nhỏ)

Nếu bạn thực sự muốn tuyến đơn, hãy coi nó là tài sản của ứng dụng đại biểu (đã tồn tại Singleton)

Hãy nhớ rằng chỉ có lộ trình "chuyển vào" dữ liệu mang lại lợi thế bổ sung sau này, có thể bạn sẽ muốn thu thập thông tin khởi động đó nhiều lần và khởi chạy các lượt xem cuối cùng khác nhau. vượt qua trong một khác nhau. Nếu bạn đi theo lộ trình toàn cầu, bạn sẽ phải bắt đầu viết lại ở mọi nơi bạn đã truy cập trước đó.

0

Bạn có thể sử dụng nó như một singleton hoặc bạn có thể giữ nó trong ứng dụng ủy nhiệm và gọi như [appdelegate getstring];

Các vấn đề liên quan