2017-11-15 1 views
0

나는 SimplePing app from Apple을 시도하고 있습니다. 그러나 대리자 메서드는 호출되지 않습니다. 나는 해결책을 찾으려고 노력하고 있지만 여기에도 도움을 청하고 있습니다.사과 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

프로젝트를 Apple에서 다운로드하여 직접 사용해 보았습니다. 테이블 뷰의 didSelect 이벤트에 대해 잘못된 메서드 서명이있을 수 있습니다.

것은 확인 MainViewController.swift 내부
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
을 변경합니다.

이 문제가 해결되기를 바랍니다.

편집 : 또한 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

관련 문제