2011-02-07 34 views
9

Nếu tôi muốn xử lý các thay đổi đối với UITextField, chẳng hạn như người dùng nhập vào nó; có vẻ như điều này có thể được thực hiện bằng cách gán một delegate cho trường văn bản đó, và sau đó yêu cầu delegate implement shouldChangeCharactersInRange, hoặc bằng cách thêm một mục tiêu vào textField và xử lý sự kiện UIControlEventEditingChanged.UITextFieldDelegate và sự kiện kiểm soát UITextField

Bên cạnh thực tế là với phương thức ủy nhiệm, bạn có thể trả về NO và ngăn chặn người dùng thực hiện chỉnh sửa, có sự khác biệt nào giữa 2 điều này không?

Cùng một câu hỏi để xử lý phần bắt đầu chỉnh sửa hoặc kết thúc chỉnh sửa. Nó có thể được thực hiện bằng phương pháp đại biểu thích hợp hoặc với các sự kiện thích hợp. Các đại biểu textField thực sự là gì nếu các sự kiện kiểm soát có thể thực hiện công việc cần thiết?

Trả lời

6

Bạn nói đúng; về cơ bản bạn có thể làm điều tương tự thông qua cả hai, nhưng UIControl là cấp thấp hơn và cho phép bạn tách từng UIEvent cụ thể thành các mục tiêu khác nhau thông qua [UIControl addTarget:action:forControlEvents:] trong trường hợp chỉ có một đại biểu duy nhất.

Tôi cũng nói rằng UITextField delegate protocol đơn giản là có một giải pháp thay thế cấp độ cao hơn, thuận tiện hơn cho UIControl/UIEvent như một cách để quản lý hành vi của UITextField.

Mẫu đại biểu phổ biến nhất là UITableView DataSource và Delegate và tôi sẽ nói rằng sử dụng giao thức đại biểu UITextField khá giống nhau và do đó trông thẳng tiến hơn với nhiều ý định xác định hơn so với truyền trực tiếp thư từ UIControl.

9

shouldChangeCharactersInRange được gọi trước khi xảy ra thay đổi và cho bạn cơ hội 'hủy' thay đổi. UIControlEventEditingChanged được gọi sau khi thay đổi xảy ra.

Bạn có thể xác định giá trị kết quả của textField trong shouldChangeCharactersInRange, nhưng bạn phải tự áp dụng chuỗi thay thế cho văn bản hiện tại, sử dụng dải ô được cung cấp. (qua số NSString stringByReplacingCharactersInRange). Nếu bạn muốn biết văn bản kết quả, việc sử dụng UIControlEventEditingChanged sẽ dễ dàng và hiệu quả hơn.

shouldChangeCharactersInRange thường được sử dụng để thực hiện xác thực kiểm tra đầu vào - tức là bạn có thể lọc ký tự/văn bản đã dán khi được nhập. Ví dụ: nếu một trường dành cho số điện thoại, bạn có thể trả lại FALSE nếu người dùng nhập ký tự không phải là số hoặc cố gắng dán văn bản không phải là số.

Bạn có thể tìm thấy một trường hợp mà bạn có thể sử dụng lại mã cho nhiều điều khiển nếu bạn có thể gắn bó với UIControlEvent-methods.

1

cách tiếp cận Đoàn là cách để đồng nhất UITextFieldUITextView hành vi.

UITextView không có sự kiện kiểm soát. Ngược lại, UITextFieldDelegateUITextviewDelegate cung cấp các phương thức song song.

0

Tôi đã phát hiện ra rằng shouldChangeCharactersInRange chuyển cùng một số NSRange để chèn và xóa văn bản. Bạn chắp thêm một khoảng trắng và sau đó xóa nó và các tham số từ shouldChangeCharactersInRange không thể phân biệt được với việc sao chép văn bản.

Vì vậy, shouldChangeCharactersInRange thực sự không thể dự đoán văn bản kết quả.

6

Một khác biệt quan trọng tôi đã tìm thấy giữa hai phương pháp đặt ra trong câu hỏi ban đầu là các đại biểu "shouldChangeCharactersInRange" được gọi TRƯỚC giá trị trong UITextField thay đổi. Mục tiêu cho UIControlEventEditingChanged được gọi là SAU giá trị trong các thay đổi UITextField. Trong trường hợp bạn đang sử dụng các sự kiện này để đảm bảo (ví dụ) tất cả các trường trong hộp thoại được điền đầy đủ trước khi bật nút "Xong", cách tiếp cận mục tiêu có thể hoạt động tốt hơn cho bạn. Ví dụ: Nó đã làm cho tôi.

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