2017-11-15 8 views
0

私はSimplePing app from Appleを試しています。ただし、デリゲートメソッドは呼び出されません。私は解決策を見つけようとしていますが、私はまたここで助けを求めています。Apples SinglePingアプリはデリゲートメソッドを呼び出さない

ありがとうございます。

ここでは、見るための完全なMainViewControllerクラスを示します。

import UIKit 

class MainViewController: UITableViewController, SimplePingDelegate { 

    let hostName = "www.apple.com" 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.title = self.hostName 
    } 

    var pinger: SimplePing? 
    var sendTimer: Timer? 

    func start(forceIPv4: Bool, forceIPv6: Bool) { 
     self.pingerWillStart() 

     NSLog("start") 

     let pinger = SimplePing(hostName: self.hostName) 
     self.pinger = pinger 

     if (forceIPv4 && !forceIPv6) { 
      pinger.addressStyle = .icmPv4 
     } else if (forceIPv6 && !forceIPv4) { 
      pinger.addressStyle = .icmPv6 
     } 

     pinger.delegate = self 
     pinger.start() 
    } 

    func stop() { 
     NSLog("stop") 
     self.pinger?.stop() 
     self.pinger = nil 

     self.sendTimer?.invalidate() 
     self.sendTimer = nil 

     self.pingerDidStop() 
    } 

    func sendPing() { 
     self.pinger!.send(with: nil) 
    } 

    // MARK: pinger delegate callback 

    private func simplePing(pinger: SimplePing, didStartWithAddress address: NSData) { 
     NSLog("pinging %@", MainViewController.displayAddressForAddress(address: address)) 

     self.sendPing() 

     assert(self.sendTimer == nil) 
     self.sendTimer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(MainViewController.sendPing), userInfo: nil, repeats: true) 
    } 

    private func simplePing(pinger: SimplePing, didFailWithError error: NSError) { 
     NSLog("failed: %@", MainViewController.shortErrorFromError(error: error)) 

     self.stop() 
    } 

    private func simplePing(pinger: SimplePing, didSendPacket packet: NSData, sequenceNumber: UInt16) { 
     NSLog("#%u sent", sequenceNumber) 
    } 

    private func simplePing(pinger: SimplePing, didFailToSendPacket packet: NSData, sequenceNumber: UInt16, error: NSError) { 
     NSLog("#%u send failed: %@", sequenceNumber, MainViewController.shortErrorFromError(error: error)) 
    } 

    private func simplePing(pinger: SimplePing, didReceivePingResponsePacket packet: NSData, sequenceNumber: UInt16) { 
     NSLog("#%u received, size=%zu", sequenceNumber, packet.length) 
    } 

    private func simplePing(pinger: SimplePing, didReceiveUnexpectedPacket packet: NSData) { 
     NSLog("unexpected packet, size=%zu", packet.length) 
    } 

    // MARK: utilities 

    static func displayAddressForAddress(address: NSData) -> String { 
     var hostStr = [Int8](repeating: 0, count: Int(NI_MAXHOST)) 

     let success = getnameinfo(
      address.bytes.assumingMemoryBound(to: sockaddr.self), 
      //UnsafePointer(address.bytes), 
      socklen_t(address.length), 
      &hostStr, 
      socklen_t(hostStr.count), 
      nil, 
      0, 
      NI_NUMERICHOST 
     ) == 0 
     let result: String 
     if success { 
      result = String(cString: hostStr) 
     } else { 
      result = "?" 
     } 
     return result 
    } 

    /// Returns a short error string for the supplied error. 
    /// 
    /// - parameter error: The error to render. 
    /// 
    /// - returns: A short string representing that error. 

    static func shortErrorFromError(error: NSError) -> String { 
     if error.domain == kCFErrorDomainCFNetwork as String && error.code == Int(CFNetworkErrors.cfHostErrorUnknown.rawValue) { 
      if let failureObj = error.userInfo[kCFGetAddrInfoFailureKey] { 
       if let failureNum = failureObj as? NSNumber { 
        if failureNum.intValue != 0 { 
         let f = gai_strerror(Int32(failureNum.intValue)) 
         if f != nil { 
          return String(cString: f!) 
         } 
        } 
       } 
      } 
     } 
     if let result = error.localizedFailureReason { 
      return result 
     } 
     return error.localizedDescription 
    } 

    // MARK: table view delegate callback 

    @IBOutlet var forceIPv4Cell: UITableViewCell! 
    @IBOutlet var forceIPv6Cell: UITableViewCell! 
    @IBOutlet var startStopCell: UITableViewCell! 

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     let cell = self.tableView.cellForRow(at: indexPath as IndexPath)! 
     switch cell { 
     case forceIPv4Cell, forceIPv6Cell: 
      cell.accessoryType = cell.accessoryType == .none ? .checkmark : .none 
     case startStopCell: 
      if self.pinger == nil { 
       let forceIPv4 = self.forceIPv4Cell.accessoryType != .none 
       let forceIPv6 = self.forceIPv6Cell.accessoryType != .none 
       self.start(forceIPv4: forceIPv4, forceIPv6: forceIPv6) 
      } else { 
       self.stop() 
      } 
     default: 
      fatalError() 
     } 
     self.tableView.deselectRow(at: indexPath as IndexPath, animated: true) 
    } 

    func pingerWillStart() { 
     self.startStopCell.textLabel!.text = "Stop…" 
    } 

    func pingerDidStop() { 
     self.startStopCell.textLabel!.text = "Start…" 
    } 
} 

私はスウィフト4構文にそれを変換してきましたが、何もシミュレータや実​​際のデバイス上で動作しません。私はIPv4またはIPv6をタップしてから起動しますが、何も起こりません。

+0

ファイルをappleからコピーしたか、自分で入力しましたか?リンゴからのアプリは私にはうまく見え、うまくいくはずです。 –

+0

AppleからコピーしてSwift 4に変換しましたが、すべて同じです。 – petesalt

答えて

1

アップルからプロジェクトをダウンロードしてみました。おそらく、テーブルビューのdidSelectイベントに不正なメソッドシグネチャがあります。

はMainViewController.swift内
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
を変更してください。

この問題が解決したらうれしいです。

編集:MainViewController.swiftのすべてのデリゲートメソッドの署名も変更する必要があります。たとえばfunc simplePing(pinger: SimplePing, didFailWithError error: NSError)func simplePing(_ pinger: SimplePing, didFailWithError error: Error)になります。

+0

はい、私はそれをしました。しかし、私がIPv4を選択して起動するたびに何も起こりません。デリゲートメソッドはトリガされません。代議員が割り当てられているので、私はそれについて少し混乱しています。 – petesalt

+0

@petesalt奇妙な、それは私のために働いています。 'MainViewController'の中のデリゲートメソッドのメソッドシグネチャを修正しましたか? –

+0

Pascal_AC、はい。しかし、何も動作しません。シミュレータと実デバイス上。何もない。 – petesalt

関連する問題