在Swift中将数据从一个标签控制器传递到另一个标签控制器

8
我的应用程序有三个与tabBar的三个标签关联的viewController。我想从第一个标签切换到第三个标签,并将一些数据从第一个视图控制器传递到第三个视图控制器。我无法使用segue实现它,因为segue会在所选标签中创建导航。这不是我的要求。我想在tabBar中切换标签并传递一些数据,而不需要任何导航。我该怎么做?

以下是一个简洁的示例,使用单例Swift类在控制器之间共享数据:https://dev59.com/YF4c5IYBdhLWcg3wsb_I#44380145 - Gene Bo
如果您不在选项卡根目录下,可以使用取消展开过渡。这里有一个例子。 - Suragch
3个回答

10

最新的Xcode版本8.3.3中使用Swift 3

首先,您可以在FirstViewController中设置选项卡委托UITabBarControllerDelegate。当您想通过单击UITabBarViewController中的标签栏按钮将数据从一个视图控制器发送到另一个视图控制器时,可以使用此功能。

class FirstViewController: UIViewController ,UITabBarControllerDelegate {
    let arrayName = ["First", "Second", "Third"override func viewDidLoad() {
        super.viewDidLoad()

        self.tabBarController?.delegate = self
    }

    func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
        if viewController.isKind(of: FirstsubsecoundViewController.self as AnyClass) {
            let viewController  = tabBarController.viewControllers?[1] as! SecondViewController
            viewController.arrayData = self.arrayName
        } 

        return true
    }
}

在SecondViewController中获取数据:

class SecondViewController: UIViewController {
    var arrayData: [String] = NSArray()
    override func viewDidLoad() {
       super.viewDidLoad()
       print(arrayData) // Output: ["First", "Second", "Third"]
   }
}

4
你可以使用这段代码:Objective C
[tab setSelectedIndex:2];

像这样将数组保存在NSUserDefaults中:

[[NSUserDefaults standardUserDefaults]setObject:yourArray forKey:@"YourKey"];

使用NSUserDefaults从另一个视图获取数据,代码如下:

NSMutableArray *array=[[NSUserDefaults standardUserDefaults]objectForKey:@"YourKey"];

swift

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
      if segue.identifier == "toTabController" {
        var tabBarC : UITabBarController = segue.destinationViewController as UITabBarController
        var desView: CaseViewController = tabBarC.viewControllers?.first as CaseViewController

        var caseIndex = overviewTableView!.indexPathForSelectedRow()!.row
        var selectedCase = self.cases[caseIndex]

        desView.caseitem = selectedCase
      }
    }

2
我可以通过self.tabBarController!.selectedIndex = 2来切换选项卡,但是我如何将第一个选项卡的控制器视图中的数据传递到第三个选项卡的控制器视图中呢?实际上,我的第一个选项卡的控制器视图有一个按钮,点击按钮后,我想将一些数据传递给第三个选项卡的控制器视图。但是怎么做呢? - Nuibb
实际上我想在Swift中这样做 - SecondViewController *secondViewController = [[SecondViewController alloc] initWithNib:@"SecondViewController" bundle:nil]; secondViewController.myValue = 5; [self pushViewController:secondViewController animated:YES]; 我遵循了这篇文章 - http://prateekvjoshi.com/2014/02/16/ios-app-passing-data-between-view-controllers/ 但我正在努力将这个obj-c代码转换为Swift。请帮帮我。 - Nuibb
1
@rcat24 我尝试使用单例模式,但是像我在之前的回答中所描述的那样遇到了一些问题。你能告诉我应该怎么做才能在按钮点击时多次获取单例对象的值,而不是只获取一次吗? - Nuibb
1
@Nuibb 将你在viewDidLoad中的代码替换为viewWillAppear。 - rcat24
@rcat24 非常感谢兄弟。你救了我。现在它能正常工作了。谢谢。 - Nuibb
显示剩余5条评论

2

好的,我尝试在第一个选项卡的视图控制器中创建一个单例对象,然后从第三个选项卡的视图控制器中获取该对象的值。它只在第三个选项卡的视图控制器实例化时有效。除了第一次以外,我从未在第三个选项卡的视图控制器中获取到该单例对象的值。现在该怎么办?在我的代码中 - 在第一个选项卡的控制器中,如果我点击一个按钮,就会切换到第三个选项卡。以下是我的代码部分 -

在第一个选项卡的控制器中 -

@IBAction func sendBtnListener(sender: AnyObject) {
        Singleton.sharedInstance.brandName = self.searchDisplayController!.searchBar.text
        self.tabBarController!.selectedIndex = 2
}

在第三个选项卡的控制器中 -
 override func viewDidLoad() {
     super.viewDidLoad()

     //Nothing is printed out for this portion of code except the first time 
     if !Singleton.sharedInstance.brandName.isEmpty{
         println(Singleton.sharedInstance.brandName)

     }else{

         println("Empty")
     }
 }

在单例对象的类中 -
class Singleton {
    var name : String = ""
    class var sharedInstance : Singleton {
        struct Static {
            static let instance : Singleton = Singleton()
        }
        return Static.instance
    }

    var brandName : String {
        get{
            return self.name
        }

        set {
            self.name = newValue
        }
    }
} 

编辑:

好的,最终它正在工作。对于其他仅需与我类似的人,请将第三个标签页(目标标签页)控制器中从viewDidLoad()到viewWillAppear()方法之间的所有代码替换,它就会起作用了。谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接