Не удается получить текстовое поле или UIPickerView для взаимодействия в представлении контейнера UIView - PullRequest
0 голосов
/ 11 ноября 2018

Я следую этому уроку онлайн: https://medium.com/@jannism/segmented-control-tutorial-for-beginner-in-swift-4-8588a63b8bfd

Он использует Сегментированный элемент управления для переключения UIView (представления контейнера) на основе выбора индекса в Сегментированном элементе управления.

Переключение контейнеров работает, как описано в руководстве, но ключевой части, где я хочу добавить либо текстовые поля, либо UIPicker в контейнер. Элементы отображаются в окне контейнера, но я НЕ могу с ними взаимодействовать !?

Кто-нибудь знает, как я могу заставить это работать?

Контроллер основного вида, который содержит три UIViews (иначе контейнеры)

class ViewController: UIViewController, TwicketSegmentedControlDelegate {

    // OUTLETS AND VARIABLES
    @IBOutlet weak var showHome: UIView!
    @IBOutlet weak var showProfile: UIView!
    @IBOutlet weak var showSettings: UIView!


    // BACKGROUND OF THE TOP SLIDER
    var segmentControlView: UIView = {
        var uiView = UIView()
        uiView.backgroundColor =  UIColor.white
        return uiView
    }()


    // DISPLAY SLIDER
    var contentView:UIView = {
        var uiView = UIView()
        return uiView
    }()


    // DESIGN OF THE SEGMENT
    var twicketSegmentControl:TwicketSegmentedControl = {

        var twicketSegmentControl : TwicketSegmentedControl = TwicketSegmentedControl(frame:CGRect.zero)

        // SETTING THE TITLES
        let titles = ["Home", "Profile", "Settings"]
        twicketSegmentControl.setSegmentItems(titles)

        // SETTING THE TEXT COLOR OF THE CHOSEN SEGMENT TO WHITE
        twicketSegmentControl.highlightTextColor = UIColor.white

        // SETTING THE TEXT COLOR OF THE OTHER SEGMENTS TO A DARK GRAY
        twicketSegmentControl.defaultTextColor = UIColor.init(red: 171/255.0, green: 183/255.0, blue: 183/255.0, alpha: 1.0)

        // SETTING THE BACKGROUND COLOR OF THE CHOSEN SEGMENT TO BLUE
        twicketSegmentControl.sliderBackgroundColor = UIColor.init(red: 31/255.0, green: 58/255.0, blue: 147/255.0, alpha: 1.0)

        // SETTING THE BACKGROUND COLOR OF THE OTHER SEGMENTS TO A VERY LIGHT GRAY
        twicketSegmentControl.segmentsBackgroundColor = UIColor.init(red: 238/255.0, green: 238/255.0, blue: 238/255.0, alpha: 1.0)

        // SHOWS SEGMENTS
        return twicketSegmentControl
    }()


    override func viewDidLoad() {
        super.viewDidLoad()
        // LOADING THE HOME SWITCH AS THE DEFAULT VIEW
        didSelect(0)

        super.viewDidLoad()
        configureViewHierarchy()
    }


    // VIEWS
    func configureViewHierarchy(){
        view.addSubview(segmentControlView)
        segmentControlView.snp.makeConstraints { (make) in
            make.top.left.right.equalTo(view)
        }

        segmentControlView.addSubview(twicketSegmentControl)
        twicketSegmentControl.delegate = self;
        twicketSegmentControl.snp.makeConstraints { (make) in

            // PUTS THE SEGMENT CONTROL 30px (= THE HEIGHT OF THE CONTROL) OVER THE VIEW
            make.top.equalTo(showHome).offset(-30)

            // DEFINE THE BORDERS TO THE SIDES
            make.left.equalTo(segmentControlView).offset(16)
            make.right.equalTo(segmentControlView).offset(-16)

            make.bottom.equalTo(segmentControlView).offset(-10)

            // DEFINE THE HEIGHT
            make.height.equalTo(30)
        }

        view.addSubview(contentView)
        contentView.snp.makeConstraints { (make) in
            make.left.right.equalTo(view)
            make.bottom.equalTo(view)
            make.top.equalTo(segmentControlView.snp.bottom)
        }

    }


    override func didReceiveMemoryWarning() {
       super.didReceiveMemoryWarning()
       // Dispose of any resources that can be recreated.
    }


    // CHOSING VIEW BASED ON SEGMENT CHOSEN
    func didSelect(_ segmentIndex: Int) {

        switch segmentIndex
        {
        case 0:
            // SHOWING THE HOME VIEW
            showProfile.alpha = 0
            showSettings.alpha = 0
            showHome.alpha = 1

        case 1:
            // SHOWING THE PROFILE VIEW
            showHome.alpha = 0
            showSettings.alpha = 0
            showProfile.alpha = 1

        case 2:
            // SHOWING THE SETTINGS VIEW
            showHome.alpha = 0
            showProfile.alpha = 0
            showSettings.alpha = 1

        default:
            break;
        }

    }

}

Настройки ViewController таковы:

class SettingViewController: UIViewController {

    @IBOutlet weak var textField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

    }

}

Как я уже сказал, у меня все очень просто, так что я могу отладить проблему, прежде чем включать более сложную.

Прилагается раскадровка enter image description here

1 Ответ

0 голосов
/ 12 ноября 2018

Вы добавляете UIView с именем contentView, охватывающий ваши представления контейнера.

Это contentView, похоже, ничего не делает, , кроме предотвращения взаимодействия с представлениями, которые оно покрывает.

Если вы закомментируете (или удалите) эти строки в вашем configureViewHierarchy() func:

//      view.addSubview(contentView)
//      contentView.snp.makeConstraints { (make) in
//          make.left.right.equalTo(view)
//          make.bottom.equalTo(view)
//          make.top.equalTo(segmentControlView.snp.bottom)
//      }

Вы должны иметь возможность взаимодействовать с элементами в ваших видах контейнера.

Хотя ваш код также устанавливает значения .alpha для ваших представлений контейнера ... Я бы рекомендовал использовать .isHidden вместо:

func didSelect(_ segmentIndex: Int) {

    showHome.isHidden = segmentIndex != 0
    showProfile.isHidden = segmentIndex != 1
    showSettings.isHidden = segmentIndex != 2

    // if you need to run other code based on the selected segment
    switch segmentIndex
    {
    case 0:
        // SHOWING THE HOME VIEW
        // do other stuff here...

    case 1:
        // SHOWING THE PROFILE VIEW
        // do other stuff here...

    case 2:
        // SHOWING THE SETTINGS VIEW
        // do other stuff here...

    default:
        break;
    }

}
...