在Swift中从另一个ViewController访问变量

26

我有以下ViewController

class PageContentViewController: UIViewController {

    var pageIndex: Int

}

我该如何从另一个视图控制器中访问pageIndex

我需要在这个函数中访问pageIndex

func pageViewController(pageViewController: UIPageViewController!, viewControllerBeforeViewController viewController: UIViewController!) -> UIViewController! {

    //var index: Int
    //index = ?

    NSUInteger index = ((PageContentViewController*) viewController).pageIndex; // in Swift?

    if ((index == 0) || (index == NSNotFound)) {
        return nil;
    }

    index--;

    return [self viewControllerAtIndex:index]; // in Swift?
}

2
这个问题的答案与其他“从另一个类访问变量”的问题相同。你需要先获取对象的引用。(我认为这是一个不好的问题) - Bryan Chen
var index: Int = PageContentViewController(viewController).pageIndex 这是你可以用 Swift 翻译这行代码的方式。 - Connor
2
@BryanChen:你是认为还是已经知道?若有现成的答案链接那就更好了。一旦你提供了链接,我将非常乐意关闭这个问题。 - fulvio
7个回答

25

在 Swift 中,默认情况下所有内容都是公开的。因此,如果你像这样声明:

class SomeViewController: UIViewController {
    var someVariable: SomeType = someValue

    init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    }
}

只要您拥有它的实例,就可以访问它:

var myCustomViewController: SomeViewController = SomeViewController(nibName: nil, bundle: nil)
var getThatValue = myCustomViewController.someVariable

1
这只有在类在同一个文件中才能工作吗? - Connor
2
这不是使用全局变量的有效理由。如果您有多个“PageContentViewController”的实例,会发生什么? - Bryan Chen
3
当然,请告诉我们如何正确访问该变量。 - fulvio
1
不需要在同一个文件中,但我会编辑并提供更好的答案。 - Mike
1
@gotnull,你试过我的修改方案了吗?我认为它非常简单明了。 - Mike
显示剩余8条评论

13

ViewController1.swift

class ViewController1: UIViewController {

    struct GlobalVariable{
        static var myString = String()
    }
}

ViewController2.swift

class ViewController2: UIViewController 
{

print(ViewController1.GlobalVariable.myString)

}

有点烦人的是,即使在ViewController1中,你仍然需要调用GlobalVariable.myString,而不能直接引用myString。但是这对于在其他视图控制器中引用它非常有效。谢谢! - RanLearns
你可以直接在ViewController1类中将myString定义为静态变量static var myString或类变量class var myString,而不需要添加GlobalVariable结构体。然后使用时只需像这样使用print(Viewcontroller1.myString)即可。 - Mark Dail

5
我这样解决了。. .
class StaticLinker
{
     static var viewController : PageContentViewController? = nil
}

class PageContentViewController: UIViewController
{

    var pageIndex: Int
    StaticLinker.viewController = self
}

class AnotherClass
{
    StaticLinker.viewController.pageIndex = 100
}

2

当我在每个其他类中使用令牌时,我遇到了同样的问题,解决方案非常简单,我所做的是

var access = LoginViewController() 
token = access.token

但它遇到的问题是:使用令牌的默认值。因此,我将该变量设为静态变量,并在视图加载中使用它。
     var token : String = ""
     var access = LoginViewController.self
     token = access.token

2

这是我尝试将该代码转换为Swift的结果:

func pageViewController(pageViewController: UIPageViewController!, viewControllerBeforeViewController viewController: UIViewController!) -> UIViewController! {

    var pageController  = viewController as PageContentViewController
    var index: Int? = pageController.pageIndex

    if var idx: Int = index{
        if idx == 0{
            return nil
        }
        else{
            idx--
            return viewControllerAtIndex(idx)
        }
    }
    else{
        return nil
    }
}
class PageContentViewController: UIViewController {

    var pageIndex: Int?

}

1
class firstViewController: UIViewController{
var variableName: variableType = variableValue
}

通过创建firstViewController()的实例,您可以在secondViewController中访问此变量。

class secondViewController: UIViewController{
var newVariableName = firstViewController()
}

以后使用newVariableName来访问variableName的值。
newVariableName.variableName

1
class color: UIViewController {

    var blue:Int = 90
}

可以从其他类中访问它(确保在函数内调用变量,否则会出现错误)。

class ViewController: UIViewController{
   var example:color = color()


  override func viewDidLoad() {
     super.viewDidLoad()
     // call it here
      print(example.blue)
  }
}

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