2015-03-20 2 views
1

Я реализовал пользовательский метод делегирования, который должен появиться в контроллере корневого представления, если некоторые данные поступают с сервера. Нажав кнопку «Назад» в дочернем контроллере, 1-й метод back() проверяет, были ли внесены какие-либо изменения в текстовые поля и отображен лист UIActionSheet в случае внесения некоторых изменений.iOS popToRootViewControllerAnimated не работает над методом делегата

1.

func back() { 
     if modified { 
      let actionSheet = UIActionSheet(title: NSLocalizedString("SAVESETTINGS", comment: "Settings were changed. Do you want to save them?"), delegate: self, cancelButtonTitle: "No", destructiveButtonTitle: "Yes") 
      actionSheet.actionSheetStyle = .Default 
      actionSheet.showInView(self.view) 
     } 
     else { 
      self.navigationController?.popToRootViewControllerAnimated(true) 
     } 
    } 

метод делегата ActionSheet отправляет данные и контроллер ждет ответа
2.

func actionSheet(actionSheet: UIActionSheet, clickedButtonAtIndex buttonIndex: Int) { 
    if buttonIndex == 0 { 
     self.socket.send(someData, tag: someTag) 
    } 
    else { 
     self.modified = false 
     self.navigationController?.popToRootViewControllerAnimated(true) 
    }  
} 

Делегат проверяет метод, если право ответ здесь и должен появиться в контроллере корневого представления.

3.

func ackReceived(tag: Int32) { 
    if tag == someTag { 
     self.navigationController?.popToRootViewControllerAnimated(true) 
    } 
} 

Корневые выскакивает вид контроллера в 1-й и 2-й метод, если не существует каких-либо изменений или, если кнопка второй нажата в UIActionSheet, но он не работает в 3d метода.

Все методы называются. Я в конечном итоге по

self.navigationController?.popToRootViewControllerAnimated(true) 

Я также проверил отладчик, контроллер навигации не nil.

Надеюсь, вы сможете помочь мне с этой проблемой. Большое спасибо заранее.

+0

Что такое я в третьем примере? Добавьте 'NSLog (@"% @ ", self)' –

+0

, эти 3 метода находятся в одном контроллере. – D051P0

+0

Мне все равно, где они, я хочу знать, что вы видите в журнале. (Извините, это не значит быть суровым). –

ответ

1

Благодарим за подсказку из Wain, я нашел проблему. func ackReceived(tag: Int32) {} не вызывался в основной очереди. UI как методы UIKit не являются потокобезопасными и должны быть вызваны в основной очереди.

func ackReceived(tag: Int32) { 
    if tag == someTag { 
     dispatch_async(dispatch_get_main_queue(), { 
       self.navigationController?.popToRootViewControllerAnimated(true) 
       return 
      }) 
    } 
} 

- это правильный способ вызова методов пользовательского интерфейса.

Большое спасибо за помощь.

1

не работает, потому что ваш навигатор равен нулю. вы можете проверить его, например, print («mainIconTapped:» + String (self.navigationController));

Смежные вопросы