斯威夫特:我的班级的啥实例在视图中
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 成为启动时创建的原始对象(在代码之前)以上是关于斯威夫特:我的班级的啥实例在视图中的主要内容,如果未能解决你的问题,请参考以下文章