2017-03-16 11 views
0

ユーザーに特定のファイルがダウンロードされているかどうかを確認するアプリがあります。このコードは、UITableViewCell内から呼び出されますが、最初の行(必要なファイルは常に最初の行にあります)を押すことをシミュレートするために、tableViewを使用してView Controllerを呼び出す方法がわかりません。ここで テーブルビューの行をシミュレートします。TableViewcell Swift

if (fileLbl.text == baseMapDisplayname) { 
      let alertController = UIAlertController(title: "Basemap Not Downloaded", message: "Please first download the Offline Basemap", preferredStyle: .alert) 

      var rootViewController = UIApplication.shared.keyWindow?.rootViewController 
      if let navigationController = rootViewController as? UINavigationController { 
       rootViewController = navigationController.viewControllers.first 
      } 
      if let tabBarController = rootViewController as? UITabBarController { 
       rootViewController = tabBarController.selectedViewController 
      } 

      alertController.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.cancel ,handler: nil)) 
      alertController.addAction(UIAlertAction(title: "Download", style: UIAlertActionStyle.default,handler: { (action: UIAlertAction!) in 
       //TODO - Simulate action of selecting first row of tableview 

       //this does not work 
       let indexPath = IndexPath(row: 0, section: 0) 
       MainVC().tableView.selectRow(at: indexPath, animated: true, scrollPosition: .bottom) 
       MainVC().tableView.delegate?.tableView!(tableView, didSelectRowAt: indexPath) 

      })) 
      rootViewController?.present(alertController, animated: true, completion: nil) 

     } 
+0

MainVCの新しいインスタンスを作成しているようですが、自己を使用できませんか? コントローラのインスタンスが適切な場合は、selectRowが機能するはずです。また、selfがすでにtableview delegateである場合は、代理人は必要ありません。 – silentBob

答えて

0

はこれを試してみてくださいコードの抜粋です:あなたは、あなたのMainVCが従う単純なプロトコルを記述する必要が

let indexPath = IndexPath(row: 0, section: 0); 
self.tableView.selectRow(at: indexPath, animated: false, scrollPosition: UITableViewScrollPosition.none) 
self.tableView(self.tableView, didSelectRowAt: indexPath) 
+0

これは動作しません。なぜなら、tableViewはUITableViewCellのコンテキストに存在しないからです。 – Nate23VT

+0

これはテーブルセルとは何の関係もありません。 MainVCインスタンスへの参照がない場合は、代理人(プロトコル、上記の推奨)、コールバックブロック(UIAlertControllerの拡張)、通知(NotificationCenter)、alertControllerのpresentingControllerなどを使用できます – silentBob

1

、それはに機能を追加する必要がありますMainVCに「ダウンロード」ボタンが押されたことを通知します。このような何か:

protocol DownloadDelegate { 
    func shouldDownloadFile() 
} 

は、だから、var downloadDelegate: DownloadDelegate?のような変数を作成することによって、ポップアップそのアラートを持つクラスでDownloadDelegateとしてMainVCを設定する必要がありますし、「ダウンロード」のアクションにあなたが言うことができます:

MainVCを通知します、とあなたはすでに上の計画 self.tableView.selectRow...事をすることによって反応することができ ​​

関連する問題