Хобрук: Ваш путь к мастерству в программировании

Добавление новой страницы в PageViewController

Я новичок в Swift и делаю простое погодное приложение. Я использовал шаблон страничного приложения.

У меня проблема следующая:

Когда пользователь добавляет город, я вызываю addCity и успешно добавляю новое название города в свой массив городов. Когда я печатаю этот массив в этой функции, он показывает новый город в конце.

Однако функция viewControllerAtIndex, которая создает новую страницу, похоже, использует старую версию этого массива без добавления нового города. Когда я печатаю массив городов, в нем отсутствует новое название города. Следовательно, когда пользователи проводят пальцем по экрану, новая страница для нового города не отображается. Пользователь должен перезапустить приложение, чтобы появился новый город.

Я сделал снимок экрана, чтобы проиллюстрировать проблему.

https://youtu.be/DbMqgJ0lONk

(в массиве городов также должно быть указано «Лондон», я думаю, я просто не перезапускал приложение)

Буду признателен за любую помощь здесь!

import UIKit

class ModelController: NSObject, UIPageViewControllerDataSource {

    var rootViewController = RootViewController()
    var cities = [""]
    let defaults = UserDefaults.standard

    override init() {
        super.init()

        self.cities = self.defaults.stringArray(forKey: "SavedStringArray") ?? [String]()

        if self.cities == [""] || self.cities.count == 0  {
            self.cities = ["Current Location"]
        }
    }

    func addCity(name:String) {
        self.cities.append(name)
        self.defaults.set(self.cities, forKey: "SavedStringArray")
        print ("cities from addCity:")
        print (self.cities)

    }


    func viewControllerAtIndex(_ index: Int, storyboard: UIStoryboard) -> DataViewController? {
        // Return the data view controller for the given index.
        if (self.cities.count == 0) || (index >= self.cities.count) {
            return nil
        }

        // Create a new view controller and pass suitable data.
        let dataViewController = storyboard.instantiateViewController(withIdentifier: "DataViewController") as! DataViewController

        //get city name
        dataViewController.dataObject = self.cities[index]
        print ("cities in viewControllerAtIndex:")
        print (self.cities)

        return dataViewController
    }



    func indexOfViewController(_ viewController: DataViewController) -> Int {
        // Return the index of the given data view controller.
        // For simplicity, this implementation uses a static array of model objects and the view controller stores the model object; you can therefore use the model object to identify the index.
        return self.cities.index(of: viewController.dataObject) ?? NSNotFound
    }


    // MARK: - Page View Controller Data Source

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        var index = self.indexOfViewController(viewController as! DataViewController)
        if (index == 0) || (index == NSNotFound) {
            return nil
        }

        index -= 1
        return self.viewControllerAtIndex(index, storyboard: viewController.storyboard!)
    }

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        var index = self.indexOfViewController(viewController as! DataViewController)
        if index == NSNotFound {
            return nil
        }

        index += 1
        if index == self.cities.count {
            return nil
        }
        return self.viewControllerAtIndex(index, storyboard: viewController.storyboard!)
    }

}

  • Где вы устанавливаете ModelController для TableViewController? Можете ли вы вставить и этот код? 23.07.2017
  • Привет, @cweinberger! Смотрите весь код здесь: github.com/bjoern2000/FranzFahrenheit 23.07.2017

Ответы:


1

Проблема в том, что вы используете два разных экземпляра ModelController. Один для RootViewController, а другой в TableViewController. Они не знают друг друга.

Пара вариантов решения проблемы:

1.) Передайте тот же экземпляр ModelController TableViewController, когда вы перейдете к нему.

Например. добавив этот prepare(for segue:) method toRootViewController`

func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        if(segue.identifier == "Locations") {

            let destVC: TableViewController = segue.destination as! TableViewController;
            destVC.modelViewController = self.modelController;

        }
    }

Это обеспечит передачу того же ModelController.

Примечание: вы должны добавить этот идентификатор («Местоположения») к переходу от кнопки «Изменить» к сцене TableViewController.

Примечание 2: этот код не тестировался и, вероятно, даже не компилируется. У меня сейчас нет Xcode.

2.) Убедитесь, что не может быть более одного экземпляра ModelController (Singleton)

Одна случайная веб-ссылка: https://thatthinginswift.com/singletons/

23.07.2017
  • Это сработало. Спасибо! Я предполагал, что это связано с тем, что не используется один и тот же экземпляр. Единственная оставшаяся проблема - когда я нахожусь на последней странице в массиве, мне приходится проводить пальцем влево, а затем снова вправо, чтобы появилось новое местоположение. 24.07.2017
  • Чтобы решить эту проблему (и потенциально другие интересные случаи, такие как удаление города, отображаемого в данный момент), вам, вероятно, придется вызвать _ 1_ снова. 24.07.2017
  • Новые материалы

    Введение в контекст React
    В этом посте мы поговорим о Context API, который был представлен в React 16, и о том, как вы можете их использовать. Что такое контекст? Глядя на определение из react docs , оно..

    Шлюз с лицензией OSS, совместимый с Apollo Federation v2, появится в WunderGraph
    Сегодня мы рады сообщить, что мы сотрудничаем с поддерживаемой YC Tailor Technologies, Inc. для внедрения Apollo Federation v2. Реализация будет лицензирована MIT (Engine) и Apache 2.0..

    Это оно
    Ну, я официально уволился с работы! На этой неделе я буду лихорадочно выполнять последние требования Думающего , чтобы я мог сосредоточиться на поиске работы. Что именно это значит?..

    7 полезных библиотек JavaScript, которые вы должны использовать в своем следующем проекте
    Усильте свою разработку JavaScript Есть поговорка «Не нужно изобретать велосипед». Библиотеки — лучший тому пример. Это поможет вам написать сложные и трудоемкие функции простым способом...

    Базовое руководство по переносу концепций обучения в глубокое обучение
    Обзор По мере того, как машинное обучение становится все более мощным и продвинутым, модели, обеспечивающие эту расширенную возможность, становятся все больше и начинают требовать огромного..

    C в C.R.U.D с использованием React-Redux
    Если вы использовали React, возможно, вы знакомы с головной болью, связанной с обратным потоком данных. Передача состояния реквизитам от родительских компонентов к дочерним компонентам может..

    5 обязательных элементов современного инструмента конвейера данных
    В цифровом мире предприятия используют конвейеры данных для перемещения, преобразования и хранения огромных объемов данных. Эти конвейеры составляют основу бизнес-аналитики и играют..