2015-04-12 1 views
-1

Я пытаюсь построить rss-ридер. На странице «Добавление фида», если я нажму кнопку «Добавить», я надеюсь проверить, успешно ли добавлен фид. Если он добавлен, затем запустите разматывание и перейдите на главную страницу. Если он не добавлен, оставайтесь на текущей странице.Как передать данные в условном режиме разговора?

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

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

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

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

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

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

ответ

1

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

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

Сначала необходимо создать протокол:

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.

EDIT:

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

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

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

+0

Спасибо за ваш ответ! Я прочитал много документов в Интернете о делегате, но до сих пор не могу понять эту концепцию. У меня есть несколько вопросов. 1. Где я должен определить протокол? На странице mainViewController или addFeed? Ваш ответ отличается от @Schemetrical, поэтому я не уверен в этом. 2. Что означает 'destination.delegate = self'? 'self' означает ** mianViewController ** или ** addFeedViewController **? – Antimony

+0

Я сам это понял. Спасибо огромное! – Antimony

+0

Эй, просто чтобы я ответил на вопросы: 1. Вне декларации класса. Это не имеет большого значения, в каком файле, поскольку он доступен на глобальном уровне. 2. В моем примере self означает экземпляр класса, в котором он используется. Цитата: 'this, self и Me являются ключевыми словами, которые используются в некоторых языках программирования для обозначения объекта, класса или другого объекта, код запуска является частью. «Не стесняйтесь задавать мне какие-либо вопросы, так как я начал учиться быстро и стараюсь улучшить его, помогая другим :) – Eendje

0

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

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

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

+0

Hi Schemetrical, ваш ответ очень полезен. Спасибо! – Antimony

0
- (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]; 
Смежные вопросы