为什么无法从 scrollViewDidScroll 内部访问图像色调颜色

Why can't access the image tint color from inside the scrollViewDidScroll

我有以下代码:

class SegmentedControlViewController: UIViewController, UIScrollViewDelegate {

    @IBOutlet weak var happyOutlet: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        scrollView?.delegate = self
    
    }
    
   func scrollViewDidScroll(_ scrollView: UIScrollView) {
       
       if scrollView.contentOffset.x > 490 {
              
        happyOutlet?.imageView?.tintColor = #colorLiteral(red: 0.3411764801, green: 0.6235294342, blue: 0.1686274558, alpha: 1)
       }
       else {
           print("nope")
       }
   }

    
    @IBAction func happy(_ sender: UIButton) {

        happyOutlet.imageView?.tintColor = #colorLiteral(red: 0.9294117647, green: 0.4705882353, blue: 0.07450980392, alpha: 1)

    }
}

当我单击按钮时,图像色调会发生变化,但当我滚动超过 450 时,色调不会改变。我知道我的代码是正确的,因为在 if 语句中我尝试打印一些东西并且它起作用了所以我猜它与按钮插座有关。另外,除非我在 if 语句中解包 happyOutlet,否则我会得到 unwrap optional is nil 错误。

编辑

我将我的功能更改为:

   func scrollViewDidScroll(_ scrollView: UIScrollView) {
       
           if scrollView.contentOffset.x > 20 {
           print("greater than 20")
           happyOutlet?.imageView?.tintColor = .red
       }
       else {
           print("less than 21")
           happyOutlet?.imageView?.tintColor = .green
       }
   }

尽管内容仍然相同,但颜色根本没有改变,尽管内容已打印到控制台。另外,如果我不添加问号,我也会收到错误消息。我做错了什么?

编辑 2

看看:https://github.com/DonMag/DidScrollTest

简单的例子,加上你的项目 lots 的编辑。


编辑

获得更多详细信息并查看您的示例项目后...

您有一个 SegmentedControlViewController 实例,它使用 UIContainerView 加载您的“滚动视图”控制器。但是,您还为 that 控制器指定 SegmentedControlViewController 作为 class。

故事板中的两个控制器通过 @IBOutlet 连接了不同的元素。这将不起作用(如您所见)。

要完成您的设计,您的“滚动视图”控制器需要一个不同的 class,并且您需要使用自定义委托/协议模式在它们之间进行通信。

附带说明:学习一些基础知识对您很有帮助。

在您的代码中的许多地方,您使用:

happyView?.alpha = 1

然而,? 意味着:

如果它前面的变量是 Nil,则不要执行它后面的内容。

因此,您通过告诉代码不要执行来避免 nil 错误,但是当您想要 它执行时,这并没有帮助。

当你这样写的时候:

happyView.alpha = 1

并且您的应用因 Unexpectedly found nil... 而崩溃,您需要 修复 - 不要编辑您的代码以忽略它。


假设:

  • 你有一个滚动视图连接到 @IBOutlet var scrollView: UIScrollView!
  • 你有一个按钮,连接到 @IBOutlet var happyOutlet: UIButton!
  • 您已为按钮设置图像

当您向左和向右滚动 20 磅时,这将在红色和绿色之间更改按钮图像视图的色调。当你滚动时,它也会 print() 滚动视图的内容偏移量 x 和一条消息是否大于或小于 20:

class SegmentedControlViewController: UIViewController {
    
    @IBOutlet var scrollView: UIScrollView!
    @IBOutlet var happyOutlet: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // assign the delegate
        scrollView.delegate = self
        
    }
    
}

extension SegmentedControlViewController: UIScrollViewDelegate {
    func scrollViewDidScroll(_ scrollView: UIScrollView) {

        print("content offset x:", scrollView.contentOffset.x)
        
        // if we've scrolled left more than 20 points
        if scrollView.contentOffset.x > 20 {
            print("greater than 20")
            happyOutlet.imageView?.tintColor = .red
        }
        else {
            print("less than 21")
            happyOutlet.imageView?.tintColor = .green
        }

    }
}
 

注:

如果happyOutlet按钮是滚动视图的子视图,如果不明显,按钮必须距离滚动视图的前缘超过 20 磅...否则当它滚出视图时您将看不到它的变化。