Как передать данные в условном раскладе?

Я пытаюсь построить RSS-ридер. На странице "Добавление канала", если я нажму кнопку "Добавить", я надеюсь проверить, успешно ли добавлен канал. Если он добавлен, то запускайте переход и возвращайтесь на главную страницу. Если он не добавлен, оставайтесь на текущей странице.

Я знаю, что могу создать IBAction на кнопке "Добавить" и проверить, добавлен ли канал. Однако есть два требования, которым я должен соответствовать, чтобы добавить канал.

Во-первых, после того, как я проанализирую URL, мне нужно знать, могут ли результаты анализа генерировать фид. Чтобы разобрать URL, мне нужно использовать метод, определенный в mainViewController.

Во-вторых, мне нужно проверить, существует ли канал. Если этот канал уже существует, не добавляйте его. Чтобы проверить это, мне нужно получить данные фида из mainViewController.

В настоящее время я использую prepareForSegue для передачи данных из основного viewController в это представление. Но для условного перехода, я не знаю, как передать данные и проверить, существует ли канал уже. Потому что prepareForSegue используется только тогда, когда будет запущен переход. Если сеанс не вызван, я не могу проверить состояние.

Кроме segue, есть ли другие способы передать данные из другого представления?

Я не знаю, цель-C, поэтому было бы лучше, если бы вы могли быстро дать мне несколько решений.:)

3 ответа

Решение

Как сказал Schemetrical, использование делегата - это простой способ получить доступ к методам вашего MainViewController.

Поскольку вы пометили это как Swift, я также приведу небольшой пример делегата в Swift.

Сначала вы создаете протокол:

protocol NameOfDelegate: class {     // ":class" isn't mandatory, but it is when you want to set the delegate property to weak
    func someFunction() -> String    // this function has to be implemented in your MainViewController so it can access the properties and other methods in there
}

В вашем MainViewController вы должны добавить:

class MainViewController: UIViewController, NameOfDelegate {

    // your code

    @IBAction func button(sender: UIButton) {
        performSegueWithIdentifier("toOtherViewSegue", sender: self)
    }

    fun someFunction() -> String {
        // access the other methods and return it
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "toOtherViewSegue" {
            let destination = segue.destinationViewController as! OtherViewController
            destination.delegate = self
        }
    }
}

И последний шаг, вам нужно будет добавить свойство делегата, чтобы вы могли "поговорить" с ним. Лично я представляю, что это свойство является воротами между двумя контроллерами представления, чтобы они могли общаться друг с другом.

class OtherViewController: UIViewController {

    weak var delegate: NameOfDelegate?

    @IBAction func button(sender: UIButton) {
        if delegate != nil {
            let someString = delegate.someFunction()
        }
    }
}

Я предположил, что вы использовали segue для доступа к вашему другому ViewController, так как вы упомянули об этом в своем посте. Таким образом, вы можете просто "поговорить" с вашим MainViewController.

РЕДАКТИРОВАТЬ:

Что касается отдыха. Это также может быть сделано через segue.

  1. добавлять: @IBAction func unwindToConfigMenu(sender: UIStoryboardSegue) { } на ваш MainViewController.
  2. В вашей раскадровке есть 3 иконки в верхней части вашего OtherViewController, Нажмите на круглый желтый с квадратом внутри, чтобы убедиться, что выбран ViewController, а не некоторые элементы внутри.
  3. Управляйте перетаскиванием (или перетаскиванием правой кнопкой мыши) от того же круглого желтого с квадратом внутри к правому значку красного квадрата. При этом появляется меню, в котором вы можете выбрать режим раскрутки.
  4. Нажмите на новую тему, которую вы только что создали. Присвойте ему идентификатор типа "backToMain"
  5. Добавьте что-то похожее на код ниже OtherViewController

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

- (UIViewController*)viewControllerForStoryboardName:(NSString*)storyboardName class:(id)class
{
    UIStoryboard* storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:nil];
    NSString* className = nil;

    if ([class isKindOfClass:[NSString class]])
        className = [NSString stringWithFormat:@"%@", class];
    else
        className = [NSString stringWithFormat:@"%s", class_getName([class class])];

    UIViewController* viewController = [storyboard instantiateViewControllerWithIdentifier:[NSString stringWithFormat:@"%@", className]];
    return viewController;
}

// get the view controller
    ViewController* viewController = (ViewController*)[self viewControllerForStoryboardName:@"MyStoryboard" class:[OtherViewController class]];
    // Pass data here
    viewController.data = myData;

// or you can push it
    [self.navigationController pushViewController:viewController animated:YES];

Вы всегда можете использовать делегатов.

Настройте делегата на странице добавления фида и получите mainViewController соответствовать делегату. Добавить метод делегата (- (BOOL)canGenerateFeed:(NSURL *)url) и свойство делегата (@property (weak, nonatomic) id <AddFeedControllerDelegate> delegate).

Когда ваша страница добавления фида звонит [self.delegate canGenerateFeed:url] и ваш mainViewController соответствует делегату, метод в mainViewController вызывается (это должно ответить BOOL, как указано в объявлении метода). Затем вы можете ответить ДА или НЕТ соответственно, что будет отправлено обратно на страницу добавления фида.

Другие вопросы по тегам