2016-11-18 77 views
0

我对Swift非常陌生,尝试创建一个应用程序,其中页面之间的滑动正常工作,但也涉及基于滑动距离的背景颜色更改。在Swift中跟踪滑动移动

因此,我想“劫持”滑动手势,所以我可以添加一些行为。我能找到的最好的方法是this question/answer

翻译从选择的答案代码为斯威夫特3,我下面的代码添加到我的RootViewControllerviewDidLoad功能:

for subview in (pageViewController?.view.subviews)!{ 
     if let coercedView = subview as? UIScrollView { 
      coercedView.delegate = (self as! UIScrollViewDelegate) 
     } 
    } 

我的印象是,上面的代码就会让我delegate功能(如scrollViewDidScroll到我正在编写上面的代码的类中,以便我可以定义该函数,调用super.scrollViewDidScroll,然后添加我想要的任何其他功能。

不幸的是,上面的代码不会抛出任何编译错误,的确,当我尝试构建应用程序抛出一个错误:

Could not cast value of type 'My_App.RootViewController' (0x102cbf740) to 'UIScrollViewDelegate' (0x1052b2b00). 

而且,当我尝试在我的课写override func scrollViewDidScroll,我得到一个编译错误告诉我函数不存在覆盖,这即使我通过了错误,也不会被调用,这使我不禁思考,但这不是解决此问题的正确方法。

对不起,这是一个很不好的问题,但我对如何解决这个问题的基本架构以及我是否正确理解给定的答案以及出现了什么问题感到非常困惑。

我在翻译delegate,那答案是否正确? 我委托给正确的对象吗? (这是正确的术语吗?) 有没有更好的方法来处理这个问题? 我强制/铸造不当吗?我应该改为做:

view.delegate = (SomeHandMadeViewDelegateWhichDefinesScrollViewDidScroll as! UIScrollViewDelegate) 

或类似的东西/不同(与let coercedSelf = self as? UIScrollViewDelegate什么的另一个嵌套铸造

感谢

+0

“当我尝试写'重写func scrollViewDidScroll' ...”实现该特定方法。但它不,所以'覆盖'是不合适的。所以,(a)声明你的视图控制器符合'UIScrollViewDelegate'协议;和(b)实现你想要的任何“UIScrollViewDelegate”方法,而不需要“覆盖”(除非你的超类恰好实现了这个特定的方法)。 – Rob

回答

2

如果我正确理解你的问题,你想赶上一些滚动位置?!和东西吧?然后做

class RootViewController { 
    // Your stuff 

    for subview in pageViewController!.view.subviews { 
    if let coercedView = subview as? UIScrollView { 
     coercedView.delegate = self 
    } 
} 

extension RootViewController : UIScrollViewDelegate { 
    // Your scrollView stuff there 
} 
class RootViewController { 
    // Your stuff 

    for subview in pageViewController!.view.subviews { 
    if let coercedView = subview as? UIScrollView { 
     coercedView.delegate = self 
    } 
} 

extension RootViewController : UIScrollViewDelegate { 
    // Your scrollView stuff there 
} 
+0

耶!这工作完美。介意确认我对这里发生的事情的印象,所以我可以更好地理解它?当我编写'extension'行时,我使用'UIScrollViewDelegate'的基本功能扩展'RootViewController',这允许我将'coercedView'的行为委托给类本身。那么我如何从内部获得位置等信息,比如'scrollViewDidScroll'函数(正在被击中)? – Sasha

+0

其实,我只是想出了职位的东西。但是如果你有时间的话,我会很乐意得到基本概念的确认。斯威夫特目前真的很困惑。 – Sasha

+1

其实这个扩展是不需要的。你可以只写类RootViewController:UIScrollViewDelegate,它会做同样的事情。只是为了使代码更清晰。 –