【问题标题】:scrollView is nil when called from viewdidload从 viewdidload 调用时,scrollView 为 nil
【发布时间】:2015-12-08 04:53:35
【问题描述】:

我想在单击 navigationItem 时滚动视图。 但是..这里有一些错误。

  1. 我想制作类似 snapchat 的滚动视图。 它工作正常,但是......当我从 viewdidload 函数中调用 scrollView 时,scrollView 为零!

  2. 我已经制作了类似滑动视图的 snapchat。但是我想在单击导航项(心形标记)时进行滑动视图。

我的 ViewController viewdidload func - 它工作正常

@IBOutlet weak var scrollView: UIScrollView!


var V1 : LeftViewController = LeftViewController(nibName: "LeftViewController", bundle: nil)
var V2 : CenterViewController = CenterViewController(nibName: "CenterViewController", bundle: nil)
var V3 : RightViewController = RightViewController(nibName: "RightViewController", bundle: nil)



override func viewDidLoad() {

    super.viewDidLoad()



    self.addChildViewController(V1)
    self.scrollView.addSubview(V1.view)
    V1.didMoveToParentViewController(self)

    self.addChildViewController(V2)
    self.scrollView.addSubview(V2.view)
    V2.didMoveToParentViewController(self)

    self.addChildViewController(V3)
    self.scrollView.addSubview(V3.view)
    V3.didMoveToParentViewController(self)

    var V2Frame : CGRect = V2.view.frame
    V2Frame.origin.x = self.view.frame.width
    V2.view.frame = V2Frame


    var V3Frame : CGRect = V3.view.frame
    V3Frame.origin.x = 2 * self.view.frame.width
    V3.view.frame = V3Frame

    println(self)
    println(scrollView)
    println(V2.view.frame)

    self.scrollView.setContentOffset(CGPointMake(V2Frame.origin.x, self.view.frame.size.height), animated: false)



    self.scrollView.contentSize = CGSizeMake(self.view.frame.width * 3, self.view.frame.size.height)        }

我的 ViewController clickEvent func - 为什么 scrollView 为零?

    func clickEvent() {

    self.scrollView?.scrollRectToVisible(V2.view.frame, animated: true)

    println(self)
    println(scrollView)
    println(V2.view.frame)
    //self.scrollView.setContentOffset(CGPointMake(V2.view.frame.origin.x, self.view.frame.size.height), animated: true)
}

我从其他 CenterViewController 调用 Viewcontroller 中的 clickEvent - 它可以正常调用但是...在 ViewController clickEvent 函数中的 scrollView 是 nil .. 我该如何解决它?

func clickEvent(sender: AnyObject) {

   ViewController().clickEvent()
}

【问题讨论】:

  • 这些行: let scrollView = UIScrollView(frame: CGRect(x: 0.0, y: 0.0, width: 320.0, height: 568.0)) 和 self.scrollView?.scrollRectToVisible(V2.view.frame , animated: true) 引用不同的滚动视图。
  • 是的,我添加了该代码,因为 scrollView 是 nil.... 我怎样才能获得相同的 scrollView ...?

标签: ios swift uiscrollview


【解决方案1】:

在您的代码中,您可以在viewDidLoad 中获取并设置一个视图框架。在viewDidLoad 中,视图仅加载到内存中,但尚未加载到屏幕中,因此如果您尝试在viewDidLoad 中向视图询问其框架,您将不会获得一致的值.. 而是使用viewWillAppear,您可以在其中向视图询问其框架,并且您会获得正确的值,因为视图已准备好显示。

【讨论】:

  • 你的意思是,将代码从 viewdidload 重写为 viewwillapper? ..它不工作...
  • 处理与尺寸、框架相关的视图的代码部分
【解决方案2】:

类本身不包含布局信息。所以视图控制器对象无法知道哪个视图对象连接到哪个 IBOutlet。视图控制器必须通过情节提要本身进行实例化。您可以使用以下方法

storyboard?.instantiateInitialViewController()
storyboard?.instantiateViewControllerWithIdentifier("YOUR_VC_STORYBOARD_ID")

当您使用第二种方法时,不要忘记设置 Storyboard Identifier。 进入View Controller -> Identity Inspector -> Storyboard_ID 可以找到输入标识符的地方

【讨论】:

  • 我把那个代码写到了。 viewcontroller 和 centerviewcontroller 中的 viewdidload 或 clickevent 函数。但它不工作
  • 你是怎么写的代码可以给我看的吗?您是否正确连接了 IBOutlet??
猜你喜欢
  • 2017-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多