2012-04-11 12 views
10

Cách đính kèm và xóa UIGestureRecognizer chính xác trên chế độ xem là gì?Cách đúng để gắn/xóa UIGestureBộ nhận dạng

Tôi thường tạo và đính kèm UIGestureReconizers theo số -viewDidLoad. Tôi có sử dụng removeGestureRecognizer trong số -viewDidUnload không? Hoặc chúng có bị xóa tự động không?

Ví dụ: đó là cách tốt hơn để tạo thuộc tính UIGestureRecognizer và khởi tạo nó trong phương thức init của viewController và sau đó đính kèm/loại bỏ thuộc tính gestureRecognizer này trong -viewDidAppear/-viewDidDisappear?

(Lưu ý tôi đang sử dụng ARC)

Cảm ơn.

+0

Tôi đã lướt qua điều đó nhưng không tìm thấy câu trả lời cho câu hỏi của mình. – mrd3650

+0

@TheLion: "Rất tiếc, không thể tìm thấy trang đó". – Colas

+0

Xin lỗi, táo đã thay đổi nó ở đây [https://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/GestureRecognizer_basics/GestureRecognizer_basics.html) đó là URL mới cho cùng một tài nguyên. Cảm ơn bạn đã chỉ ra @Colas –

Trả lời

10

Về cơ bản, bạn có thể tạo, thêm và xóa trình nhận dạng cử chỉ khi có ý nghĩa. Và "khi nó có ý nghĩa" thay đổi tùy thuộc vào một vài điều, nhưng thường chỉ là về việc bạn sẽ giữ chúng như là ngà voi. Với ARC khóa đang quản lý các tham chiếu mạnh mẽ; Với ARC ivars mạnh theo mặc định.

Vì vậy, giả sử bạn thêm trình nhận dạng nhấn. Trong trường hợp này, bạn không cần truy cập lại trình nhận dạng. Tôi sẽ tạo nó như sau:

-(void)viewDidLoad{ 
    [super viewDidLoad]; 
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; 
    [self.view addGestureRecognizer:tap]; 
} 

Với trường hợp này, bạn không cần phải làm gì khác để quản lý trình nhận dạng này. Hệ thống xem đang giữ tham chiếu mạnh mẽ với nó. Tất cả những gì bạn làm là ngồi lại và đợi nó gọi handleTap:. Khi chế độ xem dỡ bộ nhận dạng nhấn này sẽ được deallocated.

Kịch bản này cũng sẽ không tốt nếu bạn thêm trình nhận dạng này vào viewWillAppear: vì không khó tưởng tượng một loạt sự kiện dẫn đến nhiều người nhận dạng được tạo.

Vì vậy, một cách hợp lý nếu bạn muốn thêm trình nhận dạng trong các phương thức hiển thị, bạn sẽ phải giữ một số loại tham chiếu đến chúng trong thanh công cụ. Nhưng một lần nữa đó không phải lúc nào cũng là một ý tưởng tồi. Nói chung, lý do bạn muốn tham chiếu đến trình nhận dạng của mình là trợ giúp trong logic của các phương thức <UIGestureRecognizerDelegate>, nếu chúng được sử dụng.

Cá nhân tôi sẽ không bao giờ thêm trình nhận dạng theo phương thức initWith.. cho tệp đính kèm sau này. Ưu điểm duy nhất là bất kỳ trình nhận dạng nào bạn tạo ở đó sẽ được lưu giữ xung quanh toàn bộ vòng đời của trình điều khiển chế độ xem. Nhưng kể từ khi một recognizer là khá rõ ràng một phần của hệ thống xem loại muddies-up MVC rằng Cocoa là lớn trên. Ngoài ra trong chế độ xem tình trạng bộ nhớ thấp của bộ điều khiển trên ngăn điều hướng bị xóa, nhưng trong trường hợp này trình nhận dạng có thể vẫn sử dụng bộ nhớ (không phải là có các đối tượng lớn) không có lý do thực sự.

Bạn chắc chắn có thể thêm trình nhận dạng theo phương thức view(Will/Did)Appear: và xóa nó trong view(Will/Did)Disappear:. Không phải sở thích của tôi.Tôi không nghĩ rằng chỉ vì chế độ xem modal được trình bày và xóa hoặc điều hướng push/pop đã xảy ra mà tôi nên xóa và thêm lại trình nhận dạng của mình.

Tôi khuyên bạn nên luôn sử dụng viewDidLoad để khởi tạo và đính kèm trình nhận dạng của bạn. Chỉ cần nhớ không đưa ra bất kỳ tham chiếu nào mạnh mẽ cho chúng trong viewDidUnload để giúp trong tình huống bộ nhớ thấp. Và một lần nữa với ARC không cần phải làm bất cứ điều gì với ivars trong dealloc.

+0

Cảm ơn NJones về câu trả lời chi tiết! Lý do cho việc gắn/tách bộ nhận dạng trong View (sẽ/đã làm) Load và Unload hoàn toàn là vì lý do bộ nhớ (vì vậy khi màn hình không hiển thị trên màn hình, bộ nhớ sẽ được giải phóng và gán lại khi nó ở trên màn hình), nhưng từ những gì bạn nói , nó không tạo ra nhiều sự khác biệt. – mrd3650

0

viewDidUnload chỉ được gọi trong điều kiện bộ nhớ thấp và không được đảm bảo để được gọi. Do đó, mọi trình nhận dạng cử chỉ bị xóa trong viewDidUnload cũng phải được xóa trong dealloc. Phương pháp EIther bạn đề cập là tốt.

0

ok thì viewWillAppear:AnimatedviewWillDisappear:animated sẽ là lựa chọn tốt nhất để làm bất kỳ điều gì với cử chỉ theo kiến ​​thức của tôi.