Достъп до променливи от друг ViewController в Swift

Имам следното ViewController:

class PageContentViewController: UIViewController {

    var pageIndex: Int

}

Как да получа достъп до pageIndex от друг ViewController?

Имам нужда от достъп до 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?
}

person fulvio    schedule 06.06.2014    source източник
comment
отговорът на този въпрос е същият като на други въпроси за Accessing променливи от друг клас. първо трябва да получите препратка към обекта. (и мисля, че е лош въпрос)   -  person Bryan Chen    schedule 06.06.2014
comment
var index: Int = PageContentViewController(viewController).pageIndex ето как бихте могли да преведете този ред на Swift според мен   -  person Connor    schedule 06.06.2014
comment
@BryanChen: Мислиш ли или знаеш? Една връзка би била чудесна към съществуващ отговор. Ще се радвам да затворя това, след като го предоставите.   -  person fulvio    schedule 06.06.2014


Отговори (7)


Всичко по подразбиране в 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
person Mike    schedule 06.06.2014
comment
това работи ли само ако класовете са в един и същи файл? - person Connor; 06.06.2014
comment
това не е валидна причина да използвате глобална променлива. и какво се случва, ако имате няколко екземпляра на PageContentViewController? - person Bryan Chen; 06.06.2014
comment
@BryanChen: По всякакъв начин, тогава ни покажете как правилно да имаме достъп до променливата. - person fulvio; 06.06.2014
comment
@gotnull частично. Предполагам, че трябва да са в един и същ файл, тъй като е деклариран в обхвата на файла, но не съм сигурен - person Connor; 06.06.2014
comment
Не, не е необходимо да е в същия файл, но ще редактирам това с по-добър отговор. - person Mike; 06.06.2014
comment
ВСИЧКО е бързо е публично (в момента) - person Bryan Chen; 06.06.2014
comment
@BryanChen: Все още не съм видял опит за отговор на моя въпрос. - person fulvio; 06.06.2014
comment
@gotnull Опитахте ли моето редактирано решение? доста просто според мен. - person Mike; 06.06.2014
comment
Печатна грешка и моят код е пример с произволен тестов код, който написах. Добавете функция към вашия PageContentViewController, която връща променливата, до която трябва да получите достъп, и след това извикайте тази функция на екземпляр на PageContentViewController, който сте имали. - person Mike; 06.06.2014
comment
Това е, защото нямате TestViewController.... Създадох го като пример. Вие никога не сте създавали този клас. Вижте моята редакция. - person Mike; 06.06.2014
comment
Нека продължим тази дискусия в чата. - person Mike; 06.06.2014
comment
използвайки swift 3, трябва ли да отменям? иска да добавя fatalError и се проваля при изпълнение. - person Dylan; 24.02.2017
comment
можете ли да дадете реален пример, моля? @Майк - person Dory Daniel; 13.03.2017

ViewController1.swift

class ViewController1: UIViewController {

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

ViewController2.swift

class ViewController2: UIViewController 
{

print(ViewController1.GlobalVariable.myString)

}
person Sabarinathan    schedule 06.04.2017
comment
Досадно, че след това трябва да извикате GlobalVariable.myString дори във ViewController1 и не можете просто да се обърнете към myString там. Но това работи добре за препращане към него в другия контролер за изглед. Благодаря! - person RanLearns; 18.05.2017
comment
не е необходимо да добавяте допълнителната структура на GlobalVariable. можете просто да направите myString статична променлива myString или променлива на класа myString директно в класа Viewcontroller1. След това, за да го използвате, просто го използвайте като print(Viewcontroller1.myString) - person Mark Dail; 16.08.2018

Реших по този начин. .

class StaticLinker
{
     static var viewController : PageContentViewController? = nil
}

class PageContentViewController: UIViewController
{

    var pageIndex: Int
    StaticLinker.viewController = self
}

class AnotherClass
{
    StaticLinker.viewController.pageIndex = 100
}
person roy    schedule 24.04.2017

Ето моя опит да конвертирам този код в 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?

}
person Connor    schedule 06.06.2014

Бях изправен пред същия проблем, когато трябва да използвам токен във всеки друг клас, решението е доста просто, това, което направих, беше

var access = LoginViewController() 
token = access.token

но проблемът, който срещна, беше: Използване на стойността по подразбиране за токен. така че направих тази променлива статична и използвах това с цел зареждане.

     var token : String = ""
     var access = LoginViewController.self
     token = access.token
person Lakshay    schedule 26.06.2018

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)
  }
}
person Community    schedule 15.03.2018

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

Можете да получите достъп до тази променлива във secondViewController, като създадете екземпляр на firstViewController()

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

по-късно използвайте newVariableName за достъп до стойността на variableName

newVariableName.variableName
person Rawand Saeed    schedule 10.06.2018