2010-07-28 38 views
5

Tôi đang cố gắng cung cấp phương thức IBAction cho chức năng phổ biến được yêu cầu ở các phần khác nhau của ứng dụng.Làm cách nào để thêm UIApplicationDelegate vào cuối chuỗi UIResponder?

tức là nhập được thực hiện modally, và nếu nó thành công kết quả trong một thông báo cho phép tất cả các bộ điều khiển xem nạp để phản ứng với sự kiện này (chuyển đổi từ vô danh để chứng thực)

@interface MyAppDelegate : NSObject <UIApplicationDelegate> 
{ 
    ... 
} 
- (IBAction)loginTapped:(id)sender; 
@end 

tôi đặt hành động của nút đó với Responder đầu tiên trong IB, tuy nhiên chuỗi trả lời không cung cấp cho MyAppDelegate một cơ hội để phản hồi.

Vấn đề của tôi là, tôi không muốn sao chép phương thức ở các phần khác nhau của chuỗi phản hồi, tôi muốn thêm nó vào một lớp chung đã là lớp con.

Chuỗi UIResponder chuyển tất cả các cách tới số UIApplication nhưng dường như kết thúc. My UIApplicationDelegate không tham gia.

Tôi muốn chèn hoặc thêm đại biểu ứng dụng của mình vào chuỗi trả lời!

(hoặc tìm một cách khác để treo lên các UIButton touch-up-bên trong để thực hiện một ứng dụng toàn .. Tôi muốn tránh subclassing UITabBarController hoặc UIWindow nếu có thể)

Trả lời

2

Bạn có thể phân lớp UIApplication để có -nextResponder trả lại ứng cử viên nếu đó là lớp con UIResponder. Sau đó, bạn sẽ cần thay đổi cuộc gọi của mình thành UIApplicationMain để sử dụng lớp con tùy chỉnh của mình.

Tôi chưa thử điều này, nhưng tôi không thể nghĩ ra bất kỳ vấn đề nào ngay lập tức mà điều này có thể gây ra.

+1

Tôi muốn tránh subclassing bất cứ điều gì nếu có thể. Tài liệu của Apple hướng dẫn bạn cách xa phân lớp 'UIApplication': *" hiếm khi có nhu cầu hợp lệ để mở rộng lớp này; ... hãy chắc chắn về những gì bạn đang cố gắng thực hiện với lớp con. "* – ohhorob

0

Bắt đầu với iOS 5, AppDelegate tự động là liên kết cuối cùng trong chuỗi trả lời. Các mẫu dự án Xcode sẽ tạo một AppDelegate là một lớp con của UIResponder thay vì NSObject. Tuy nhiên, để tránh làm lộn xộn lên appdelegate, ghi đè của appdelegate nextResponder và giảm tải công việc vào một tùy chỉnh UIResponder đối tượng:

- (UIResponder *)nextResponder 
{ 
    static dispatch_once_t onceToken; 
    static LastUIResponder *lastResponder = nil; 
    dispatch_once(&onceToken, ^{ 
     lastResponder = [[LastUIResponder alloc] init]; 
    }); 
    return lastResponder; 
} 
Các vấn đề liên quan