Проведите пальцем влево или вправо, чтобы загрузить контроллер представления с подсветкой ячейки представления коллекции.

У меня есть 3 контроллера представления с именем firstvc, secondvc, thirdvc. И у меня есть один вид коллекции, который будет прокручиваться горизонтально. Если я выберу свой first cell, мой firstvc отобразится в моем дополнительном представлении на моем mainviewcontroller. То же самое и для 2, 3rd cell. Это отлично .

Теперь мне нужна одна функция, например, если я проведу пальцем по subview, у которого будут все мои контроллеры представления, когда я выбираю любую ячейку. Мне нужно добавить свайп влево или вправо.

Например :

если я нахожусь в firstvc, то мой first cell будет выбран. Теперь, если я проведу subview вправо, мой secondvc должен появиться, в то время как моя вторая ячейка представления коллекции также должна highlight

Я не знаю, как применить.

мой код:

  @IBOutlet weak var collectionview: UICollectionView!

    @IBOutlet weak var contentSubView: UIView!
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return self.items.count
    }

    // make a cell for each cell index path
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        // get a reference to our storyboard cell
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath as IndexPath) as! MyCollectionViewCell

        // Use the outlet in our custom class to get a reference to the UILabel in the cell
        cell.myLabel.text = self.items[indexPath.item]
       // cell.backgroundColor = UIColor.cyan // make cell more visible in our example project

        var borderColor: UIColor! = UIColor.clear
        //var borderWidth: CGFloat = 0

        if indexPath == selectedIndexPath{
            borderColor = UIColor.red
            //borderWidth = 1 //or whatever you please
        }else{
            borderColor = UIColor.white
           // borderWidth = 0
        }

        cell.myview.backgroundColor = borderColor
       // cell.myview.layer.borderWidth = borderColor

        return cell
    }


    // MARK: - UICollectionViewDelegate protocol

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        print("You selected cell #\(indexPath.item)!")

        //based on your comment remove the subviews before add on your myview
        //let cell = collectionView.cellForItemAtIndexPath(indexPath) as! MyCollectionViewCell

        selectedIndexPath = indexPath

        for subview in contentSubView.subviews {
            subview.removeFromSuperview()
        }

        let alertStoryBoard =  UIStoryboard(name: "Main", bundle: nil)
        var controller: UIViewController!

        if indexPath.item == 0 {

            if  let allCollectionViewController = alertStoryBoard.instantiateViewController(withIdentifier:"firstvc") as? firstvc  {

                controller = allCollectionViewController
            }

        } else if indexPath.item == 1 {

            if  let allCollec = alertStoryBoard.instantiateViewController(withIdentifier:"secondvc") as? secondvc  {
                controller = allCollec
            }


        }else if indexPath.item == 2 {


            if  let wController = alertStoryBoard.instantiateViewController(withIdentifier:"Thirdvc") as? Thirdvc  {
                controller = wController
            }

        }

        addChildViewController(controller)

        // Add the child's View as a subview
        contentSubView.addSubview(controller.view)
        controller.view.frame = contentSubView.bounds
        controller.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]

        // tell the childviewcontroller it's contained in it's parent
        controller.didMove(toParentViewController: self)

}

Полный ZIP-файл моего проекта: https://www.dropbox.com/s/fwj745kdgqvgjxa/Collection%20view%20example.zip?dl=0


person david    schedule 16.09.2017    source источник
comment
ссылка не активна   -  person akshay    schedule 13.11.2018


Ответы (1)


person    schedule
comment
Пробовал ваше решение, но оно дает сбой, как только я прокручиваю начало от первого vc ко второму, второму к третьему, третьему к снова второму, второму к первому, затем, если я пытаюсь провести дальше влево ... затем его сбой ... то же самое для последнего контроллера просмотра и если я попытаюсь провести еще раз, это также приведет к сбою ... вот этот zip-архив проекта: dropbox.com/s/fwj745kdgqvgjxa/ - person david; 16.09.2017
comment
Да, он не добавляет проверок, чтобы убедиться, что вы можете провести пальцем в нужное место. CollectionView делает это за вас, но когда вы делаете что-то программно (с вызовом функции), вам приходится выполнять проверки самостоятельно. В частности, вы должны проверить, что целевая страница будет действительной И что вы ее реализовали. В частности, вы не реализовали страницу 4, поэтому она вылетает при переходе на страницу 4 (так как она вылетает, когда вы нажимаете на 4 в вашем collectionView) - person Jeffrey Mvutu Mabilama; 16.09.2017
comment
Теперь, как я могу справиться с этим... например, я могу установить в своем представлении коллекции did select method or changePageOnSwipe. Как я могу решить этот сбой... - person david; 16.09.2017
comment
АВАРИЙНЫЙ СБОЙ в этой строке `self.collectionview.selectItem(at: newIndex, анимированный: true, scrollPosition: UICollectionViewScrollPosition.centeredHorizontally)` - person david; 16.09.2017
comment
Это последний ZIP-файл проекта, который я попробовал dropbox.com /s/fwj745kdgqvgjxa/ - person david; 16.09.2017
comment
Если я нахожусь в первом vc, то я еще раз прокручиваю влево, и происходит сбой, то же самое, если я нахожусь в последнем vc, то если я прокручиваю вправо, то тоже происходит сбой ... пожалуйста, помогите мне .. - person david; 16.09.2017
comment
Я забыл упомянуть об этом, но вы использовали обновленный ответ? Чтобы убрать сбой при свайпе, используйте обновленный ответ. и (конечно) удалите некоторые числа из var items = ["1","2","3"], так как у вас нет VC для страниц выше 3. Вот почему пример приложения также аварийно завершает работу, когда вы нажимаете на числа ›= 4 в collectionView. - person Jeffrey Mvutu Mabilama; 16.09.2017
comment
КАК Я МОГУ установить indexPath по умолчанию для self.currentIndexPath в viewDidLoad - person david; 16.09.2017
comment
Да, я удалил этот номер, если вы проверите эту ссылку, он правильно установлен только на 3. Вот этот обновленный проект ZIP dropbox. com/s/fwj745kdgqvgjxa/ как установить indexPath по умолчанию для self.currentIndexPath в viewDidLoad - person david; 16.09.2017
comment
Нет, новая проблема. после того, как я обновлю ваше решение. если я нахожусь в первом vc, то, если я проведу пальцем вправо, я не смогу провести по второму vc. в моем журнале я получаю You are trying to go to a non existing page You are tying to navigate to an invalid page - person david; 16.09.2017
comment
это окончательный обновленный ZIP-файл проекта ответа dropbox.com/ s/mdf245mfsxlm93e/ пожалуйста, изучите это и дайте мне какое-нибудь решение.. здесь меня больше поразило - person david; 16.09.2017
comment
И еще одно: когда я открываю мой проект, он черный. Я хочу, чтобы мой первый vc был первым в моем подвиде моего mainviewcontroler, а также моя первая ячейка должна быть высоко освещена .... Если я нашел решение и для этого ... это будет большой помощью от вас,,, я могу чему-то научиться из этого... - person david; 16.09.2017
comment
currentIndexPath имеет тип IndexPath? не массив, так почему вы назначаете ему массив ( = [] )? Вы должны удалить файл = []. Если вам нужно значение по умолчанию, используйте инициализатор класса IndexPath. Либо в var currentIndexPath: IndexPath? = IndexPath(row: 0, section: 0), либо в viewDidLoad() { /* ... */ self.currentIndexPath = IndexPath(row: 0, section: 0); } - person Jeffrey Mvutu Mabilama; 16.09.2017
comment
Этот индексный путь, который я использовал, как этот array to it ( = [] ) ? , который поможет мне выделить цвет границы ячейки, когда когда-либо я перейду на любой контроллер представления, он также изменится. так только я так делал. - person david; 16.09.2017
comment
Никакой вид не загрузился, мне понравилось, что self.currentIndexPath = IndexPath(row: 0, section: 0).. so my first cell of my colelction view is high lighted. But in my sub view of my miainviewcontroller` не показывает первый vc, но все еще показывает черный. Если выбрать первую ячейку, то отображается только ее... Только эта проблема у меня есть сейчас - person david; 16.09.2017
comment
Что касается вашего последнего вопроса, как вы думаете, вы должны это сделать? Посмотрите на методы, которые я использую в методе changePageOnSwipe(). collectionView.selectItem(at ...) и self.didSelect..., который является метод делегирования - person Jeffrey Mvutu Mabilama; 16.09.2017
comment
Давайте продолжим обсуждение в чате. - person Jeffrey Mvutu Mabilama; 16.09.2017