我无法让tabbar委托给我打电话

时间:2017-03-20 23:19:24

标签: ios swift tabs

我问过这个问题b4并且已经试了很久......

问题:我有4个选项卡,当第三个选项卡被选中时我想等到选项卡被更改,然后将信息发送到Stringbuilder等。但我似乎永远无法让它正常调用,我试过委托genreViewController并尝试使用协议但它从不调用...

请告诉我我需要放入标签栏功能,因为我不知道应该在那里。我已经尝试将tabbarcontroller放在那里并选择viewcontroller。我对这一切都很陌生,所以请不要苛刻:(

TabBarController:

import UIKit
class TabBarViewController: UITabBarController{

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    func tabBar(_ tabBar: TabBarViewController, didSelect item: UITabBarItem) {
        print("he")
        //ask where it is first tab bar item
        if self.tabBarController?.selectedIndex == 1 {
            print("genres")

        }

    }

}

GenreViewController:

import UIKit

class GenreViewController: UIViewController,     UITableViewDelegate,UITableViewDataSource, UITabBarControllerDelegate {

    @IBOutlet weak var genreSwitch: UISwitch!

    @IBOutlet weak var tableView: UITableView!
    override func viewDidLoad() {
        super.viewDidLoad()
        //self.tabBarController?.delegate = self
        tableView.isScrollEnabled = false
        let tabBarViewController = TabBarViewController()



    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    let genreArray = ["Action","Adventure","Comedy","Fantasy","Drama","Horror","Romance","Thriller","Family"]
    let genreIds = [28,12,35,14,18,27,10749,53,10751]
    //LATER!!: Save this Array until next time they log into the app
    var activeGenreArray = [Int!](repeating: 0, count: 9)





    //Number of rows
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return genreArray.count
    }


    //What to do with tableview
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = self.tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! GenreCustomcell


        cell.genreSwitch.isEnabled = true
        cell.genreName.text = self.genreArray[indexPath.row]
        cell.genreSwitch.setOn(false, animated: true)

        cell.genreSwitch.addTarget(self, action: #selector(GenreViewController.switchChange(sender:)), for: UIControlEvents.valueChanged)
        cell.genreSwitch.restorationIdentifier = "\(genreIds[indexPath.row])"
        cell.genreSwitch.tag = indexPath.row


        return cell
    }
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }

    func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }

    func switchChange(sender: UISwitch){

        let id = Int(sender.restorationIdentifier!)
        let row = Int(sender.tag)
        print(row)

        if sender.isOn == true{
            activeGenreArray[row] = id!
            print(activeGenreArray)
        }
        else{

            activeGenreArray[row] = 0

            print(activeGenreArray)
        }

    }




}


class GenreCustomcell: UITableViewCell{

    @IBOutlet weak var genreName: UILabel!

    @IBOutlet weak var genreSwitch: UISwitch!

}

1 个答案:

答案 0 :(得分:0)

我不清楚你在这里想做什么。您已将GenreViewController宣布为UITabBarControllerDelegate,但在UITabBarControllerDelegate tabBar:didSelect:子类TabBarViewController上实施了UITabBarController方法UITabBarController }。

我希望你能看到:

  1. 对某些TabBarViewController的引用(可能更具体地说是UITabBarControllerDelegate
  2. 对某些GenreViewController的引用(如果它应该是自己的委托,则可以是TabBarViewControllerUITabBarController,或者完全是其他对象)
  3. delegate实例的UITabBarControllerDelegate属性设置为GenreViewController个实例。
  4. 可能让你困惑的事情:

    • 视图控制器可以存在(并与选项卡关联)但是可以 在需要之前不加载它的视图(即你切换到它的视图) 标签)。如果您将viewDidLoad添加到标签栏控制器 在标签栏之前不会调用它的GenreViewController方法 控制器第一次切换到该选项卡。如果你的 viewDidLoad正在设置自己的标签栏控制器 self.tabbarController?.delegate = self中的代理人(例如let tabBarViewController = TabBarViewController())当您离开时,它可能不会成为标签栏控制器的代理人 预期,因此不会通知所选标签中的更改 直到它被选中一次。
    • 目前还不清楚TabBarViewController行的意图是什么,但这是创造一个 新的Public Function SplitSemiColon(s As String) As String While Left(s, 1) = ";" s = Mid(s, 2) Wend While Right(s, 1) = ";" s = Left(s, Len(s) - 1) Wend SplitSemiColon = s End Function 不是您可能已经存在的那个 在你的窗口看到。创建类的新实例并不等同于引用同一类的某个现有实例。