一応下記の様な感じで動作しました。
でも、しっくりきていません。何か問題点やもっとスマートなやり方を知っていたら教えてください。
下記のコードではTextField入力チェック省略してます。IPアドレスやポート番号を空欄などを入力するとアプリが落ちます。
class ViewController: UIViewController {
@IBOutlet weak var txtHost: UITextField!
@IBOutlet weak var txtPort: UITextField!
@IBOutlet weak var txtView: UITextView!
var connection: NWConnection!
override func viewDidLoad() {
super.viewDidLoad()
txtView.text = ""
let toolbar = UIToolbar()
toolbar.items = [
UIBarButtonItem(title: "閉じる", style: .done, target: self, action: #selector(ViewController.closeKey))]
toolbar.sizeToFit()
txtHost.inputAccessoryView = toolbar
txtPort.inputAccessoryView = toolbar
openTCP()
}
@IBAction func EditBegin(_ sender: Any) {
if connection.state != .cancelled {
connection.cancel()
}
}
@objc func closeKey() {
openTCP()
txtHost.endEditing(true)
txtPort.endEditing(true)
}
func openTCP() {
let host: NWEndpoint.Host! = NWEndpoint.Host(txtHost.text!)
let port: NWEndpoint.Port! = NWEndpoint.Port(rawValue: UInt16(txtPort.text!)!)
connection = NWConnection(host: host, port: port, using: .tcp)
connection.stateUpdateHandler = { state in
DispatchQueue.main.async {
switch state {
case .setup:
self.txtView.text.append(contentsOf: "Setup\n")
case .preparing:
self.txtView.text.append(contentsOf: "Preparing\n")
case .waiting( _):
self.txtView.text.append(contentsOf: "Waiting\n")
case .ready:
self.txtView.text.append(contentsOf: "Ready\n")
case .failed( _):
self.txtView.text.append(contentsOf: "Failed\n")
case .cancelled:
self.txtView.text.append(contentsOf: "Cancelled\n")
default:
break
}
}
}
let queue = DispatchQueue(label: "label")
connection.start(queue: queue)
}
}