2014-10-28 33 views
5

Tôi đã dành hàng giờ cố gắng tìm ra cách để tạo/sau đó có được tùy chỉnh inputView để hoạt động. Tôi có một lưới của TextInputs (nghĩ rằng bảng scrabble) rằng khi ép nên tải một tùy chỉnh inputView để chèn văn bản.Chế độ xem đầu vào tùy chỉnh trong Swift

Tôi đã tạo tệp .xib chứa UI elements cho tùy chỉnh inputView. Tôi đã có thể tạo CustomInputViewController và có inputView xuất hiện nhưng không bao giờ có thể nhận được TextInput thực tế để cập nhật giá trị giá trị/văn bản của nó.

Tài liệu của Apple dường như sáng sủa về cách làm việc này và nhiều hướng dẫn tôi đã sử dụng Obj-C (mà tôi không thể chuyển đổi do những thứ nhỏ dường như không thể được thực hiện nhanh chóng).

Kiến trúc bao quát là gì và các đoạn mã cần thiết cần được triển khai để tạo customInputView cho nhiều textInputs (chuỗi đại biểu, bộ điều khiển, .xibs, chế độ xem v.v ...)?

+0

Tạo tệp lớp tùy chỉnh và đặt làm lớp cho xib của bạn trong InterfaceBuilder. Sau đó, bạn có thể kéo ctrl từ các phần tử giao diện người dùng vào tệp lớp của bạn (trình soạn thảo trợ lý) để tạo IBOutlets. Sử dụng các cửa hàng này trong mã của bạn để cập nhật các phần tử giao diện người dùng. – zisoft

+0

Tôi đã có thể tạo IBOutlets/IBActions cho các nút trong customView. Điều này là cần thiết nhưng không đủ để nhận các nút trong customView để giao tiếp textInput/keyboardFunctionality với khung nhìn của TextInputs. – codycoats

+0

quan điểm của bạn có phải triển khai/tuân thủ đúng giao thức không? (UITextInput?). bạn cũng có thể phải nói với họ để trở thành người trả lời đầu tiên khi họ được khai thác. Tôi muốn thử subclassing UIControl vs UIView – nielsbot

Trả lời

7

Bạn không nên trải qua tất cả những rắc rối đó. Có một lớp mới trong iOS 8 được gọi là: UIAlertController nơi bạn có thể thêm TextFields để người dùng nhập dữ liệu. Bạn có thể tạo kiểu cho nó như là một Alert hoặc một ActionSheet.

Ví dụ:

let alertAnswer = UIAlertController(title: "Input your scrabble Answer", message: nil, preferredStyle: .Alert) // or .ActionSheet 

Bây giờ bạn có bộ điều khiển, thêm các trường với nó:

alertAnswer.addTextFieldWithConfigurationHandler { (get) -> Void in 
      getAnswer.placeholder = "Answer" 
      getAnswer.keyboardType = .Default 
      getAnswer.clearsOnBeginEditing = true 
      getAnswer.borderStyle = .RoundedRect 
     } // add as many fields as you want with custom tweaks 

Thêm các nút hành động:

let submitAnswer = UIAlertAction(title: "Submit", style: .Default, handler: nil) 
let cancel = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil) 
alertAnswer.addAction(submitAnswer) 
alertAnswer.addAction(cancel) 

hiện bộ điều khiển bất cứ khi nào bạn muốn với :

self.presentViewController(alertAnswer, animated: true, completion: nil) 

Như bạn thấy, bạn có nhiều trình xử lý khác nhau để chuyển mã tùy chỉnh ở bất kỳ bước nào.

Một ví dụ, đây là cách nó sẽ trông: An example of how it could look

9

Thiết lập một tập tin nib với cách bố trí inputView thích hợp và các mặt hàng. Trong trường hợp của tôi, tôi đặt từng nút thành một tác vụ trên Chủ sở hữu tệp là inputViewButtonPressed.

Thiết lập bảng phân cảnh (hoặc nib nếu bạn thích) cho bộ điều khiển chế độ xem.

Sau đó sử dụng đoạn mã sau, bạn sẽ nhận được những gì bạn đang tìm kiếm:

class ViewController: UIViewController, UITextFieldDelegate { 
    var myInputView : UIView! 
    var activeTextField : UITextField? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // load input view from nib 
     if let objects = NSBundle.mainBundle().loadNibNamed("InputView", owner: self, options: nil) { 
      myInputView = objects[0] as UIView 
     } 

     // Set up all the text fields with us as the delegate and 
     // using our input view 
     for view in self.view.subviews { 
      if let textField = view as? UITextField { 
       textField.inputView = myInputView 
       textField.delegate = self 
      } 
     } 
    } 

    func textFieldDidBeginEditing(textField: UITextField) { 
     activeTextField = textField 
    } 

    func textFieldDidEndEditing(textField: UITextField) { 
     activeTextField = nil 
    } 

    @IBAction func inputViewButtonPressed(button:UIButton) { 
     // Update the text field with the text from the button pressed 
     activeTextField?.text = button.titleLabel?.text 

     // Close the text field 
     activeTextField?.resignFirstResponder() 
    } 
} 

Ngoài ra, nếu bạn đang muốn có nhiều bàn phím giống như, bạn có thể sử dụng chức năng này như hành động của bạn (nó sử dụng các cú pháp let mới từ Swift 1.2), phá vỡ nó lên nếu bạn cần 1.1 tương thích:

@IBAction func insertButtonText(button:UIButton) { 
     if let textField = activeTextField, title = button.titleLabel?.text, range = textField.selectedTextRange { 
      // Update the text field with the text from the button pressed 
      textField.replaceRange(range, withText: title) 
     } 
    } 

này sử dụng giao thức UITextInput để cập nhật các trường văn bản cho phù hợp.Xử lý xóa phức tạp hơn một chút, nhưng vẫn không quá tệ:

@IBAction func deleteText(button:UIButton) { 
     if let textField = activeTextField, range = textField.selectedTextRange { 
      if range.empty { 
       // If the selection is empty, delete the character behind the cursor 
       let start = textField.positionFromPosition(range.start, inDirection: .Left, offset: 1) 
       let deleteRange = textField.textRangeFromPosition(start, toPosition: range.end) 
       textField.replaceRange(deleteRange, withText: "") 
      } 
      else { 
       // If the selection isn't empty, delete the chars in the selection 
       textField.replaceRange(range, withText: "") 
      } 
     } 
    } 
+0

Cảm ơn rất nhiều vì câu trả lời này, David. Nếu tôi muốn sử dụng lại bàn phím ở một vài nơi, bạn sẽ đề xuất cách nào tốt nhất để làm điều đó? –

+0

Bạn có thể phân lớp 'UIViewController' hoặc bạn có thể khởi tạo mã này trong lớp con' UITextField' hoặc một lớp điều khiển riêng biệt. –

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