2011-07-06 15 views
5

Tôi đang thiết kế một thư viện tĩnh iOS sẽ được các nhà phát triển khác sử dụng. Thư viện này cần cung cấp giao diện người dùng phương thức riêng. Tôi đang tìm cách đơn giản nhất để thiết kế giao diện giữa ứng dụng và thư viện này để thực hiện việc này. Tôi chỉ cần hỗ trợ iOS 4.0 trở lên.Cách đơn giản nhất để thiết kế một thư viện tĩnh iOS cung cấp giao diện người dùng phương thức riêng của nó là gì?

kiến ​​trúc Rough

thư viện tĩnh của tôi có một API rất đơn giản với một lớp. AppDelegate của ứng dụng sẽ khởi tạo một lớp này và đặt chính nó làm đại biểu để nó có thể nhận thông báo. Khi ứng dụng muốn thư viện hiển thị giao diện người dùng của nó, nó gọi một phương thức duy nhất, và sau đó khi thư viện được thực hiện với công việc của nó, nó sẽ gửi thông báo qua một trong các phương thức của giao thức đại biểu.

Tôi có thể thấy hai cách để thực hiện việc này.

Lựa chọn 1

Khi ứng dụng muốn thư viện để hiển thị giao diện của nó, The appdelegate đi trong self.window, và thư viện bộ điều khiển xem gốc riêng của mình, tham gia có hiệu quả quyền sở hữu đầy đủ các giao diện người dùng. Khi giao diện người dùng kết thúc, nó sẽ thông báo cho AppDelegate, sau đó đặt bộ điều khiển chế độ xem gốc của chính nó trên cửa sổ, lấy lại quyền sở hữu của giao diện người dùng.

Lựa chọn 2

Thư viện cho thấy một bộ điều khiển xem, mà ứng dụng có thể đẩy lên bất cứ điều gì nhìn chồng nó thích. Ứng dụng này cũng chịu trách nhiệm xóa bộ điều khiển chế độ xem khi thư viện thông báo rằng giao diện người dùng đã hoàn tất.

vấn đề

Với tùy chọn 1, có thể có vấn đề thay đổi xem gốc điều khiển trong khi ở giữa chạy một ứng dụng. Với tùy chọn 2, có thể có sự cố khi cung cấp bộ điều khiển chế độ xem có thể hoạt động trong ngữ cảnh tùy ý (dưới dạng trình điều khiển chế độ xem toàn cửa sổ, dưới dạng chế độ xem phụ của UINavigationController, v.v.).

Một vấn đề khác với cả hai tùy chọn là các thông báo UIApplicationDelegate khác mà AppDelegate có thể nhận được, chẳng hạn như applicationWillResignActive: và applicationDidBecomeActive :. Thư viện có thể cần xử lý các thông báo như vậy để duy trì đúng giao diện người dùng của nó. Phải AppDelegate chuyển từng cái này vào thư viện khi giao diện người dùng của nó hoạt động không?

Có tùy chọn nào tốt hơn mà tôi chưa từng nghĩ đến không?

Trả lời

3

Đây là cách tôi làm điều đó: Trong thư viện tĩnh của bạn tạo UIViewController bạn và tất cả các quan điểm nội dung mà bạn cần lập trình (kể từ khi bạn có thể không dễ dàng thực hiện Khung trên iOS bạn có thể nguồn lực không dễ dàng bó):

UIViewController *controller = [[[UIViewController alloc] initWithNibName: nil bundle: nil] autorelease]; 
UIView *containerView = [[[UIView alloc] initWithFrame: [UIScreen mainScreen].applicationFrame] autorelease]; 
containerView.backgroundColor = [UIColor darkGrayColor]; 

UIWebView *webView = [[[UIWebView alloc] initWithFrame: containerView.bounds] autorelease]; 
webView.delegate = self; 

// ... some other code to setup custom things 

[containerView addSubview: webView]; 

// ... some other code to setup custom things, spinner etc. 

sau đó hiển thị nó với

[[UIApplication sharedApplication].keyWindow.rootViewController presentModalViewController: myViewController animated: YES]; 

này được cắt và dán từ một thư viện tĩnh làm việc đó là được nhúng vào hai ứng dụng iOS khác nhau và dường như làm việc tốt trong cả hai. Có thể có trường hợp cạnh mà điều này không bao gồm, nhưng tôi đã không nhấn chúng chưa :)

+0

Chúng ta có cần phải viết mã này trong lớp NSObject –

+0

Khá nhiều mọi lớp bạn đưa vào đều được lấy từ NSObject và nó phải là mã ObjectiveC, vì vậy tôi không chắc tôi hiểu câu hỏi của bạn. Lưu ý rằng đây là> 2 tuổi nên không chắc chắn nếu điều này vẫn còn hợp lệ. – Dad

+0

Tnx để trả lời mã của bạn đang hoạt động tốt. Đó là một sai lầm trong mã của tôi. mã tuyệt vời nó tiết kiệm thời gian của tôi rất nhiều .. –

1

Sử dụng các khối thay vì một đại biểu. Quan điểm của bạn nên gọi một số dismissBlock được lưu trữ trong một thuộc tính khi nó được thực hiện và người gọi có thể thực hiện những gì cần làm từ khối đó. Có dữ liệu bạn cần phải trả lại? Làm cho nó trở thành một đối số của khối hoặc đặt nó vào một thuộc tính của một đối tượng có thể truy cập từ bộ điều khiển xem của bạn, nếu thích hợp.

Nếu bạn có trạng thái cần lưu trữ để phản hồi sự kiện, hãy ghi tài liệu và cung cấp cách lưu thông tin đó vào một số dữ liệu và khôi phục giao diện người dùng từ một khối dữ liệu. Người gọi có thể xử lý như họ muốn.

Chính xác giao diện người dùng được hiển thị như thế nào tùy thuộc vào ứng dụng khách, nhưng bằng cách cung cấp giao diện người dùng phải được hiển thị một cách bình thường, bạn giới hạn môi trường đủ để không phải lo lắng quá nhiều về môi trường máy chủ .

5

có bạn xem là thiết kế API của bạn để chấp nhận một UIViewController:

- (void)presentFromViewController:(UIViewController *)presentingViewController 
         animated:(BOOL)animated 
{ 
    [presentingViewController presentModalViewController:myViewController 
               animated:animated]; 
} 

Bằng cách đó, thư viện của bạn có quyền kiểm soát hoàn toàn cách thức giao diện người dùng phương thức được trình bày, và cũng có thể gọi -dismissViewControllerAnimated: bản thân chứ không phải là dựa vào các đại biểu làm như vậy.

Đừng bận tâm để vượt qua xung quanh -applicationWillResignActive: vv Chỉ cần đăng ký các thông báo cơ bản UIApplicationWillResignActiveNotification v.v. trong lớp thư viện của bạn.

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