2015-09-30 1 views
0

Я пытаюсь вызвать функцию, хранящуюся на другом классе:Вызов функции в другом классе, который гласил динамическую переменную через IBAction

ViewController

@IBAction func refreshComments() { 
    CommentsTableViewController().refresh() 
} 

CommentsTableViewController

var variable2 = "0" 

func refresh(){ 
    print(variable2) 
    } 

Это отлично работает, но в моем случае значение моей переменной не является статическое значение, я имею получить динамически это значение, и я знаю, что проблема в этой строке:

//CommentsTableViewController().refresh() 

Поскольку CommentsTableViewController() - это конструктор класса и каждый раз, когда я называю CommentsTableViewController() он возвращает новый экземпляр/объект CommentsTableViewController класс, со значениями по умолчанию, конечно.

Так что я действительно застрял в этой точке, и я не знаю, как это решить. Я уже пытался превратить FUNC refresh() класс funcrefresh() и называем этот путь:

@IBAction func refreshComments() { 
CommentsTableViewController.refresh() 
} 

Но таким образом я получил сообщение об ошибке, что я не в состоянии прочитать Variable2

печать (переменная2) - член экземпляра «переменная2» не может использоваться по типу «КомментарииTableViewController»

Любые идеи?

EDIT Следит мою иерархию: enter image description here

ответ

1

Обращение с контроллером в контроллер в контейнере немного сложно. Постарайтесь заполнить контейнер программно. В противном случае вы не будете иметь контроль над контроллером.

Вы также можете работать с уведомлениями, но уведомления не должны использоваться для связи один к одному.

Создать Programaticly

  • У вас есть контейнер и связать IBOutlet вашему MainController.
  • вы также создать свойство для CommentsViewController
  • в раскадровке дает контроллер с storyboardIdentifier
  • в viewDidLoad вашего основного контроллера создания экземпляр свойства CommentsController с контроллером от раскадровки.
  • добавить контроллер как childViewController к mainController и добавить вид из вашего CommentsViewController к containerView
  • может быть, что вам нужно установить view.frame от commentsViewController к тому же, как containerView

теперь у вас есть свойство контроллера, и вы можете запускать любую публичную функцию.

Извините, нет примера кода. У меня в настоящее время не так много времени :)

Notifcations

Ваш Главный вид контроллер будет посылать уведомление на конкретное имя и CommentsViewController будет наблюдатель этого уведомления и сделать действие при приеме его.

NSNotificationCenter.defaultCenter().postNotificationName(name:"YourNameYouLike") 

В ваших комментарияхViewController вы наблюдаете это уведомление.

NSNotificationCenter.defaultCenter().addObserverForName(name:"theSameNameThatYourPostNotificationDidUse", object: nil, queue: mainQueue) { [weak self] in 
    guard s = self else { return } 
    s.reload() 
} 
+0

ты хозяин! Отлично! Спасибо за полное объяснение. Хороший день/ночь. –

+0

Отлично, что я могу помочь. Мои ручки немного дерьмовые. Я должен позаботиться о правильных словах ... ehe –

0

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

+0

Кажется довольно логичным для меня, но я не знаю, как реализовать, можете ли вы дать мне практический пример? –

+0

Извините, я создал новый ответ вместо редактирования моего текущего .... –

0

Не знаете, как ваша иерархия контроллера представления установлена, но вы не должны инициализировать CommentsTableViewController каждый раз, когда вам нужно позвонить refresh.

Веря ваш variable2 модифицируются изнутри CommentsTableViewController и имеет динамическое значение, как уже упоминалось, вы должны вызвать функцию refresh на уже существующий объект CommentsTableViewController, который содержит самые последние и самые большие значения свойств.

Надеюсь, это имеет смысл для вас!

+0

Спасибо за объяснение, но я верю в это. Это не сработает для меня, потому что 'CommentesTableViewController' является контейнером внутри моего' ViewController' и в мой 'ViewController' У меня есть элемент NavigationButtonItem, который должен вызывать функцию, которая хранится в другом классе. –

+0

Я понимаю, и я действительно верю, что вы можете ухватиться за свой контейнерный объект внутри 'ViewController' и использовать его. Это отличный выход, как я могу это видеть. В противном случае попробуйте передать 'variable2' в' refresh' функцию, гарантирующую, что 'ViewController' имеет видимость для динамического значения переменной2. – Abhinav