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
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.
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.
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,
Cảm ơn, âm thanh tốt. – fabian789
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.
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 đó.
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];
- 1. Vượt qua một tùy chọn biến boolean
- 2. Làm thế nào để vượt qua một biến giữa các trang WinJS?
- 3. Biến vượt qua Node.js để định tuyến
- 4. Vượt qua một biến từ bộ điều khiển để xem
- 5. vượt qua crontab một biến và đọc nó từ PHP?
- 6. Vuốt giữa hai chế độ xem của UIViewControllers
- 7. làm thế nào để vượt qua các biến giữa các mẫu ngọc
- 8. Vượt qua các biến giữa trình kết xuất đồ họa và lớp khác với queueEvent()
- 9. Đi qua biến javascript giữa các trang
- 10. Custom Animation giữa UIViewControllers sử dụng transitionFromViewController: toViewController: thời gian
- 11. Làm thế nào để vượt qua lớn cấu trúc qua lại giữa giữa C + + và Lua
- 12. Làm thế nào để vượt qua một biến TỪ TỪ TỪ một kịch bản lệnh shell?
- 13. Làm thế nào để chia sẻ một đối tượng giữa UIViewControllers trên iPhone?
- 14. Vượt qua tên biến để vẽ tiêu đề chức năng
- 15. Biến vượt qua Javascript trong href onclick yêu cầu
- 16. Vượt qua phạm vi góc biến đổi thành Javascript
- 17. Vượt qua biến JSP làm tham số cho hàm javascript
- 18. Chuỗi thoát trong biến số ít hơn và vượt qua
- 19. jQuery: Vượt qua biến: eq() không hoạt động
- 20. Vượt qua FileSystemObject hiện có hoặc tạo nhiều phiên bản
- 21. Vượt qua đối số nhiều từ vào hàm bash
- 22. Làm thế nào để vượt qua một biến trong một lệnh curl trong kịch bản shell
- 23. Vượt qua một biến đến một URL tài sản Assetic trong Symfony2
- 24. Vượt qua một mảng PHP đến một hàm JavaScript
- 25. Sử dụng IMultiValueConverter để vượt qua nhiều CommandParameters để ViewModel
- 26. Vượt qua nhiều giá trị trong doInBackground AsyncTask Android
- 27. Làm thế nào để vượt qua một hoặc không có biến arg trong scala?
- 28. Chia sẻ một biến giữa nhiều chủ đề khác nhau
- 29. Vượt qua $ (this) đến một hàm
- 30. Vượt qua một mảng làm loại mẫu
Tôi không phải lưu con trỏ vào MyFirstViewController ban đầu để truy cập vào nó? – fabian789
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
Ok, cảm ơn! Tôi sẽ thử nó ngay khi tôi về nhà. – fabian789