首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过Nav控制器的代表

通过Nav控制器的代表
EN

Stack Overflow用户
提问于 2017-05-01 03:09:57
回答 1查看 2.5K关注 0票数 2

我将在其中包含我的完整代码,但我将尝试提供指向相关位元所在位置的指针。基本上,我返回到一个视图控制器从一个解压段与一些新的数据。我在'NBARotoHome‘vc中成功地使用了这些数据,但我还需要将其中的一些数据通过嵌入式Nav控制器传递给'NBARotoTabPager’VC。

我试图使用'UpdateChildView‘委托(在第一个代码块的顶部)并在'loadViewData()中调用它的方法(在第一个块底部的'if语句’中)。

代码语言:javascript
复制
protocol UpdateChildView : class {
 func updateView()
 func test()
 var playerSelected: Player? { get set }
}



class RotoViewRoundCell: UITableViewCell{

@IBOutlet weak var categoryLabel: UILabel!

}

class RotoViewRoundHeader: UITableViewCell{

}


class NBARotoHome: UIViewController{


@IBOutlet weak var posPaidLabel: UILabel!
@IBOutlet weak var progressIndicator: UIProgressView!
@IBOutlet weak var vsLabel: UILabel!
@IBOutlet weak var fantasyFundsAmountLabel: UILabel!
@IBOutlet weak var fantasyFundsLabel: UILabel!
@IBOutlet weak var playerName: UILabel!
@IBOutlet weak var roundIndicator: UILabel!


var selectedPlayer: Player!

var firstNavController: UINavigationController!

weak var updateChildView : UpdateChildView?

override func viewDidLoad() {
    super.viewDidLoad()

    loadViewData()

    firstNavController = self.navigationController



    let rightBarButton = UIBarButtonItem(title: "Select", style: UIBarButtonItemStyle.plain, target: self, action: #selector(myRightSideBarButtonItemTapped(_:)))
    self.navigationItem.rightBarButtonItem = rightBarButton
    self.title = "NBA Roto"


}


func myRightSideBarButtonItemTapped(_ sender:UIBarButtonItem!){

    performSegue(withIdentifier: "ShowDraft", sender: nil)
}


override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if segue.identifier == "ShowDraft" {
        let navVC = segue.destination as? UINavigationController
        let nbaDraftList = navVC?.viewControllers.first as! NBADraftList
        nbaDraftList.mainNavController = firstNavController
    }


    if (segue.identifier == "buyNavControllerChild"){

//            let navVC = segue.destination as? UINavigationController
//            let buyVC = navVC?.viewControllers.first as! NBARotoTabPager
//            buyVC.delegate = self

    }


}


override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)


}

@IBAction func prepareForUnwind(segue: UIStoryboardSegue) {



}

func loadViewData(){

    if((selectedPlayer) != nil){
        roundIndicator.text = "Upcoming: " + selectedPlayer.game_time
        playerName.text = selectedPlayer.Name
        vsLabel.text = selectedPlayer.visiting + " @ " + selectedPlayer.home
        fantasyFundsLabel.text = ""
        fantasyFundsAmountLabel.text = ""

          updateChildView?.test()
     //   updateChildView?.playerSelected = selectedPlayer
    //    updateChildView?.updateView()

    }else{
        roundIndicator.text = "Select a Player"
        playerName.text = "No Player Selected"
        vsLabel.text = "--"
        fantasyFundsLabel.text = "Fantasy Funds"
        fantasyFundsAmountLabel.text = "$10,000"

    }

}

}

因为我还不能让委托工作,所以我一直在尝试在上面的“准备”方法中设置它的委托属性--‘买方no .委托= self’--但是我得到的是'buyVC没有成员委托‘,所以这是一个死胡同。

下一段代码是嵌入在导航控制器中的NBARotoTabPager vc。出于我不再确定的原因,我决定让它成为NBARotoHome的一个子类,但它基本上是一个自定义选项卡寻呼机,它使用分段控件在两个额外的vcs之间切换。

在这一点上最重要的一步就是让'test‘函数工作(它只打印'test’。它在下面的代码块中实现,第二个代码来自updateView之上的底部)。

代码语言:javascript
复制
class NBARotoTabPager: NBARotoHome, UpdateChildView{

@IBOutlet weak var segmentedControl: UISegmentedControl!
@IBOutlet weak var scoreKey: UIBarButtonItem!
@IBOutlet weak var standings: UIBarButtonItem!

 var playerSelected: Player?


override func viewDidLoad() {



    navigationController?.navigationBar.barTintColor = UIColor(red: 27/255, green: 27/255, blue: 27/255, alpha: 1)


    scoreKey.setTitleTextAttributes([NSFontAttributeName: UIFont(name: "Helvetica", size: 13.0)!], for: UIControlState.normal)
    scoreKey.tintColor = UIColor.blue

    standings.setTitleTextAttributes([NSFontAttributeName: UIFont(name: "Helvetica", size: 13.0)!], for: UIControlState.normal)
    standings.tintColor = UIColor.blue

    setupView()
}

private func setupView() {
    setupSegmentedControl()
    updateView()
}

private func setupSegmentedControl() {
    // Configure Segmented Control
    segmentedControl.removeAllSegments()
    segmentedControl.insertSegment(withTitle: "Live", at: 0, animated: false)
    segmentedControl.insertSegment(withTitle: "Avg / +", at: 1, animated: false)
    segmentedControl.addTarget(self, action: #selector(selectionDidChange(_:)), for: .valueChanged)
    segmentedControl.selectedSegmentIndex = 0
}

func selectionDidChange(_ sender: UISegmentedControl) {
    updateView()
}


private lazy var viewLiveTab: NBARotoLive = {
    // Load Storyboard
    let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)

    // Instantiate View Controller
    var viewController = storyboard.instantiateViewController(withIdentifier: "NBARotoLive") as! NBARotoLive


    if((self.playerSelected) != nil){
        viewController.selectedPlayer = self.playerSelected
    }


    // Add View Controller as Child View Controller
    self.add(asChildViewController: viewController)

    return viewController
}()

private lazy var viewAvgsTab: NBARotoAvgs = {
    // Load Storyboard
    let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)

    // Instantiate View Controller
    var viewController = storyboard.instantiateViewController(withIdentifier: "NBARotoAvgs") as! NBARotoAvgs

    if((self.playerSelected) != nil){
        viewController.selectedPlayer = self.playerSelected
    }


    // Add View Controller as Child View Controller
    self.add(asChildViewController: viewController)

    return viewController
}()

private func add(asChildViewController viewController: UIViewController) {
    // Add Child View Controller
    addChildViewController(viewController)

    // Add Child View as Subview
    view.addSubview(viewController.view)

    // Configure Child View
    viewController.view.frame = view.bounds
    viewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]

    // Notify Child View Controller
    viewController.didMove(toParentViewController: self)
}

private func remove(asChildViewController viewController: UIViewController) {
    // Notify Child View Controller
    viewController.willMove(toParentViewController: nil)

    // Remove Child View From Superview
    viewController.view.removeFromSuperview()

    // Notify Child View Controller
    viewController.removeFromParentViewController()
}

internal func test(){
    print("test")
}

internal func updateView() {

    if segmentedControl.selectedSegmentIndex == 0 {



        let position = viewAvgsTab.tableView.contentOffset.y;
        viewLiveTab.tableView.contentOffset = CGPoint(x:0, y:position);


        remove(asChildViewController: viewAvgsTab)
        add(asChildViewController: viewLiveTab)

    } else {

        let position = viewLiveTab.tableView.contentOffset.y;
        viewAvgsTab.tableView.contentOffset = CGPoint(x:0, y:position);

        remove(asChildViewController: viewLiveTab)
        add(asChildViewController: viewAvgsTab)
    }
}

}

我看过很多例子,但我不理解整个‘设置委托’的事情,即theSecondViewController.delegate = self。有时我看到你不需要这样做的例子。而其他时候,我的风投甚至连委托属性都没有。因此,我不确定这是否是我的具体问题,但任何方向都会受到极大的赞赏。谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-01 03:26:34

实现委托有三个步骤。

  1. 创建协议..。(您已经通过创建updateChildView协议做到了这一点)
  2. 您需要在您希望接收的类中实现此协议,并处理这些数据。(您还没有完成这个步骤,这就是为什么不能设置buyVC.delegate = self)
  3. 您需要在ViewController2中添加一个名为“委托”的属性,并在步骤1中将其作为您的协议的一种类型(您还没有完成此步骤,而且在vc2中也没有称为“委托”的属性。这就是为什么会出现这样的错误:“buyVC没有成员委托”)

下面是一个简单的例子:

议定书:

代码语言:javascript
复制
protocol UpdateChildView{ //removed :class
  func updateView()
  func test()
  var playerSelected: Player? { get set }
}

视图控制器A:

代码语言:javascript
复制
class NBARotoHome: UIViewController, UpdateChildView { //added conformance to the protocol

  //add the methods for conforming to protocol and add your implementation

   func updateView() {
        //add your implementation
   }
   func test(){
        //add your implementation
   }
   var playerSelected: Player? {
        //add your implementation
   }

  prepare(for: Segue) {
    /** code for passing data **/
    let navVC = segue.destination as? UINavigationController
    let buyVC = navVC?.viewControllers.first as! NBARotoTabPager
    buyVC.delegate = self
            //sets the delegate in the new viewcontroller 
            //remember.. delegate is a property in the next vc
           // and the property only accepts any viewcontroller that is implements updatechildview protocol
    present(vc2)
    }
  } 

viewcontroller2:

代码语言:javascript
复制
class viewControllerB: UIViewController {

  var delegate: UpdateChildView? //add this

  viewdidload {
      delegate?.test() //call the func in the previous vc
  }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43713768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档