斯威夫特:我的班级的啥实例在视图中

Posted

技术标签:

【中文标题】斯威夫特:我的班级的啥实例在视图中【英文标题】:Swift: What instance of my class is in the view斯威夫特:我的班级的什么实例在视图中 【发布时间】:2015-07-07 23:26:54 【问题描述】:

我正在构建一个应用程序,其中包含一个包含 tableView 控制器的容器视图。我创建了这个 tableView,但我不知道如何再次访问这个对象,所以我可以在它上面调用函数。目前有一个 BucketTableViewController 对象被自动创建(可能来自故事板)。然后稍后我想在它上面调用一个函数并创建另一个 BucketTableViewController 对象。我可以通过该方法的打印语句验证它们是唯一的。如何为作为原始对象的对象设置变量?

import UIKit

class FirstViewController: UIViewController 


    var bigArray = ["M", "A", "R", "C"]
    let delegate = UIApplication.sharedApplication().delegate as! AppDelegate

    override func viewDidLoad() 
        super.viewDidLoad()
        reachForWebsite()    
    

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

    func reachForWebsite()
        let url = NSURL(...)
        let task = NSURLSession.sharedSession().dataTaskWithURL(url!) (data, response, error) in
            do 
                ...
                // HERE IS THE ISSUE
                var bucketsVC = BucketTableViewController()
                bucketsVC.updateBuckets(self.bigArray)
             catch let myJSONError 
                print(myJSONError)
            
        
        task!.resume()
    

【问题讨论】:

为什么不将bucketsVC 设为实例变量? @ZoffDino 你介意解释一下吗? 【参考方案1】:

您可以从拥有该容器的视图控制器中的prepareForSeque(_:sender:) 获取对它的引用。确保该标识符与您在 Interface Builder 中故事板的 segue 上设置的标识符的名称相匹配。或者,如果您确定没有其他目标类型为 BucketTableViewController 的 segue,则可以省略标识符部分。

class BucketTableViewController: UITableViewController 

class FirstViewController: UIViewController 

    var bucketViewController: BucketTableViewController!

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
        super.prepareForSegue( segue, sender: sender )

        if let vc = segue.destinationViewController as? BucketTableViewController where segue.identifier == "embeddedBuketViewcontroller" 
            self.bucketViewController = vc
        
    

【讨论】:

我不想进行转场,因为表格视图已经启动并在视图中运行。我不需要去。我只需要它所属的对象 我假设您在 Interface Builder 中使用容器视图,它通过“嵌入”segue 连接视图控制器。这种类型的 segue 与其他类型的不同之处在于它不是转换,而仅仅是将该视图控制器嵌入其容器中的机制。这将在加载视图控制器时调用。 这是正确答案(已投票)。当您使用容器视图来托管子视图控制器时,它设置的链接是嵌入转场。这很奇怪,但它是 segue 的一个特例,prepareForSegue 方法确实会触发。加载父视图控制器的视图后立即调用嵌入 segue。 @PatrickLynch 你是对的,它现在正在工作。感谢您的帮助,我永远不会弄清楚这一点。邓肯也帮助验证了您的主张。我很感激【参考方案2】:

评论太紧了,所以我将其作为答案。您可以将bucketsVC` 设为实例变量:

class FirstViewController: UIViewController 
    var bucketsVS : BucketTableViewController?

    func reachForWebsite()
        ...
        do 
            self.bucketsVC = BucketTableViewController()
            self.bucketsVC!.updateBuckets(self.bigArray)
         catch 
            ...
        

        // Now you can use it anywhere within your UIViewController
    

【讨论】:

项目启动时会创建一个 BucketTableViewController。 self.bucketsVC = BucketTableViewController() 创建另一个唯一对象。我希望 bucketsVC 成为启动时创建的原始对象(在代码之前)

以上是关于斯威夫特:我的班级的啥实例在视图中的主要内容,如果未能解决你的问题,请参考以下文章

斯威夫特用户界面。如何访问/操作视图之间的数据

为啥我不能将数字附加到我的变量?!在斯威夫特 3

斯威夫特 3 |以编程方式添加约束不会使我的子视图居中

斯威夫特:不知道如何打电话给我的代表

我的 PDF 位置在本地应用程序文件中的位置是啥? - 斯威夫特用户界面

斯威夫特:我无法使自动布局约束适用于我的 UIScrollView