簡體   English   中英

在Xcode 9 / Swift 4中不再可以訪問本機UIKit元素的子視圖嗎?

[英]Native UIKit elements' subviews are no longer accessible in Xcode 9 / Swift 4?

故事:

因此,我正在研究如何隱藏UIPickerView的選擇指示器的方法,並且看到一些具有解決方法的SO線程

但是,當我嘗試在Swift 4的Xcode 9(測試版4)中使用它時,我發現它不起作用。 經過進一步檢查,我意識到,每當我調用myPickerView.subviews ,我的計數都為0。現在這很奇怪,因為它顯然在其他線程建議的情況下就可以工作了。

我使用調試視圖層次結構工具進行了檢查,看來子視圖的結構沒有變化,因為舊線程似乎也有3個子視圖。 但是由於某些原因,我無法訪問它們。 但是,令人難以置信的是,如果將語言設置為Swift 3.2並在iOS 9.0上運行相同的項目,我仍然會遇到相同的錯誤。 因此,我無法真正確定更改的時間或來源。 不幸的是,我再也沒有要測試的舊版本的xcode。

盡管多個UIKit元素似乎發生了相同的事情,但並非全部。 完整列表在這篇文章的結尾。 我試圖盡可能地全面,如果我錯過了任何東西,請隨時告訴我。

我知道解決此問題的正確方法是制作自己的UIScrollView並對其進行自定義,但是對於將來的使用以及其他元素,任何人都不知道已有解決方法嗎?

仍具有子視圖的元素:

  • UISwitch :1個子視圖
  • UITextView :1個子視圖
  • UIDatePicker :1個子視圖
  • UITableView :1個子視圖
  • UISearchBar :1個子視圖
  • UIProgressView :2個子視圖
  • UIStepper :3個子視圖

沒有子視圖的元素:

  • UISegmentedControl
  • UIPickerView
  • UITextField
  • UISlider
  • UIPageControl

用於獲得以下結果的源代碼:

    let tableView        = UITableView()
    let pickerViewHere   = UIPickerView()
    let segmentedControl = UISegmentedControl()
    let textField        = UITextField()
    let slider           = UISlider()
    let switchUI         = UISwitch()
    let progressView     = UIProgressView()
    let pageControl      = UIPageControl()
    let stepper          = UIStepper()
    let textView         = UITextView()
    let datePicker       = UIDatePicker()
    let searchBar        = UISearchBar()


    print("switchUI has: (\(switchUI.subviews.count)) subviews")
    print("progressView has: (\(progressView.subviews.count)) subviews")
    print("stepper has: (\(stepper.subviews.count)) subviews")
    print("textView has: (\(textView.subviews.count)) subviews")
    print("datePicker has: (\(datePicker.subviews.count)) subviews")
    print("tableView has: (\(tableView.subviews.count)) subviews")
    print("segmentedControl has: (\(segmentedControl.subviews.count)) subviews")
    print("pickerViewHERE has: (\(pickerViewHere.subviews.count)) subviews")
    print("pickerView has: (\(pickerView.subviews.count)) subviews")
    print("searchBar has: (\(searchBar.subviews.count)) subviews")
    print("textField has: (\(textField.subviews.count)) subviews")
    print("slider has: (\(slider.subviews.count)) subviews")
    print("pageControl has: (\(pageControl.subviews.count)) subviews")

顯然,在iOS 11中, UIPickerView在其layoutSubviews方法中創建其子視圖。 大概其他視圖也懶惰地創建了它們的子視圖。

測試代碼:

import UIKit

class ViewController: UIViewController {
    let pickerView = MyPickerView()

    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(pickerView)
        pickerView.frame = view.bounds
    }
}

class MyPickerView: UIPickerView {
    override func layoutSubviews() {
        print("before layoutSubviews: \(subviews.count)")
        super.layoutSubviews()
        print("after layoutSubviews: \(subviews.count)")
    }
}

輸出:

before layoutSubviews: 0
after layoutSubviews: 3
before layoutSubviews: 3
after layoutSubviews: 3
before layoutSubviews: 3
after layoutSubviews: 3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM