2015-05-06 1 views
4

Я использую очень простой настройку UIAlertController с двумя кнопками.Делегаты кнопок UIAlertController не запускаются (в Modally Segue)

var alert = UIAlertController(title: "Leave player?", 
     message: "You will not be able to return to this routine after!", 
     preferredStyle: .Alert) 


    let cancelAction: UIAlertAction = UIAlertAction(title: "Continue", style: .Cancel) { action -> Void in 
     println("here") 
    } 
    let deleteAction: UIAlertAction = UIAlertAction(title: "Leave", style: .Default) { action -> Void in 
     println("here") 
    } 

    alert.addAction(cancelAction) 
    alert.addAction(deleteAction) 

    self.presentViewController(alert, animated: true, completion: nil) 

Этот код работает с одним и тем же представлением с помощью push-сегмента из другой части программы. Где находится структура:

Теперь всплывающие окна AlertController и кнопка возвращают простой текстовый вывод.

Но в следующей ситуации всплывающее окно AlertController, но нажатие кнопки ничего не возвращает, моя точка останова никогда не срабатывает, или просто проверка консоли для вывода текста ничего не возвращает.

(MainView) -modal> (ThisView) 

Конечно, я постарался установить segue во второй ситуации на толкающий сегмент, но ничего не изменил. Чтобы не ошибиться, AlertController всплывает, но кнопки вообще не реагируют. Могу ли я сделать альтернативного делегата?

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

Теперь я отчасти стараюсь. Поэтому, пожалуйста, кто-то просветить меня, что я делаю не так :)

UPDATE

Встраивание MainView в навигационном контроллере и изменяя SEGUE к Нажимаем Segue, делает нажатие на кнопку реагирует .. Добавление контроллера навигации для исправления этого - это то, что я мог бы рассмотреть, но я хотел бы сохранить Modal segue для его анимации. Любые идеи?

Временное решение

Сейчас я буду использовать нажимной SEGUE и контроллер навигации, чтобы решить эту проблему. Это не оптимально, так как это представление должно вести себя как всплывающее окно, а не push, например segue, но оно работает.

+0

Не могли бы вы указать, где будет объявлен код? В MainView или в этом представлении? – aout

+0

Можете ли вы опубликовать еще несколько кода/раскадровку, чтобы лучше понять, что происходит, когда отображается это предупреждение? – keithbhunter

+0

Код объявлен в этом представлении, который находится всего в 1 секунде от mainView. Это представление также может быть достигнуто из другой части программы, которая имеет х количество раздвижных сегментов между ними. В этом представлении есть также таймер, тикающий каждую секунду, но я отключил это, и большинство вещей происходит там, поэтому он ничего не должен делать. Также я запустил Alert из разных частей программы, viewdidload, viewdidappear и в одном из циклов (которые отключены, если таймер отключен), вы можете отключить его) Так что моя мысль имеет дело с модальным segue construction .. –

ответ

0

ты попытался установить действие в виде отдельной функции и вызова этой функции

как этот

var alert = UIAlertController(title: "Leave player?", message: "You will not be able to return to this routine after!", preferredStyle: UIAlertControllerStyle.Alert) 

alert.addAction(UIAlertAction(title: "Continue", style: UIAlertActionStyle.Cancel, handler: {(alert : UIAlertAction!) in self.AlertContinue()})) 

alert.addAction(UIAlertAction(title: "Leave", style: UIAlertActionStyle.Default, handler: {(alert : UIAlertAction!) in self.AlertLeave()})) 

self.presentViewController(alert, animated: true, completion: nil) 

, а затем определить методы, как этот

func AlertContinue() {println("here")} 
func AlertLeave() {println("here")} 
+0

Благодарим вас за ответ, но поведение не изменилось. Это похоже на то, что события кликов вообще не регистрируются. –

+0

еще одна вещь, которая приходит на ум, из панели рассказов, выберите (ThisView) и перейдите к инспектору атрибутов и проверьте, установлено ли представление в полноэкранном режиме. также, проверьте (MainView) атрибуты, для галочки (Определяет контекст), снимите флажок и попробуйте –

+0

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

1

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

Лучшее решение, которое я нашел, это включить NSZombies. Xcode сообщит вам, когда ваше сообщение о действии будет отправлено на освобожденный экземпляр. См. Этот ответ для включения (используйте Xcode 4.1 или более подход): https://stackoverflow.com/a/5387006/2194039

Если вы не хотите использовать NSZombies, попытайтесь поместить это в каждый из ваших VCs или других соответствующих классов:

deinit { 
    println("This instance is deallocating") 
} 

Я знаю, что это всего лишь общая идея и ничего конкретного, но это помогло мне раньше.

+0

Спасибо за ваше предложение, но это мне не помогло. На данный момент я оставляю всю функциональность в стороне, пока не будет решения без необходимости использовать push segues. –

+0

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

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

  • Нет связанных вопросов^_^