2015-06-23 4 views
1

я имею этот сбой происходит, когда я рекурсивный вызов @IBAction@IBAction сбой при рекурсивном называемых

0 Goga 0x00000001000b90b8 function signature specialization <Arg[0] = Owned To Guaranteed, Arg[1] = Owned To Guaranteed> of Goga.NewViewController.emailButtonPressed (Goga.NewViewController)(ObjectiveC.UIButton) ->() (NewViewController.swift:0) 
1 Goga 0x00000001000c0488 Goga.NewViewController.(emailButtonPressed (Goga.NewViewController) -> (ObjectiveC.UIButton) ->()).(closure #2) (NewViewController.swift:872) 
2 Goga 0x00000001000bd250 partial apply forwarder for reabstraction thunk helper from @callee_owned (@in ObjectiveC.UIAlertAction!) -> (@out()) to @callee_owned (@owned ObjectiveC.UIAlertAction!) -> (@unowned()) (NewViewController.swift:0) 

Это код, и линия, которая происходит в его

allowedToSend = false 
@IBAction func emailButtonPressed(sender: UIButton) { 

    if !allowedToSend { 

    let controller = UIAlertController(title: title, 
        message: "Are you sure you want to send the Email?", 
        preferredStyle: .Alert) 

    controller.addAction(UIAlertAction(title: "Yes please, send.", style: .Default, handler: { 
        action in 

        self.allowedToSend = true; 
        self.emailButtonPressed(sender) <=== WHERE THE CRASH HAPPENED 
      })) 

    controller.addAction(UIAlertAction(title: "Cancel", style: .Default, handler: nil)) 
    presentViewController(controller, animated: true, completion: nil) 
    return // exit the function 

    } 

    // Reset the value 
    allowedToSend = false 

    // Sending code 

    let text = textArea.text 
    let to = toLabel.text 

    ....  

} 

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

Я не уверен, в чем проблема с такой реализацией и почему Swift жалуется на это, учитывая, что я тестировал это в режиме отладки, и это выглядит нормально. Почему это происходит?

EDIT

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

+1

бесконечной рекурсии, это? –

+0

Я не думаю, что это связано с тем, что предупреждение вызвано действием пользователя. Если пользователь принимает решение «Да, пожалуйста, отправьте». он будет называться. Это происходит очень редко. –

+0

initialize ** allowedToSend ** false по умолчанию, я имел в виду, когда он получил вызов 1-й раз –

ответ

0

Я думаю, что у вас бесконечная рекурсия. Установите точку останова на линии self.emailButtonPressed(sender) и allowedToSend = false и запустите приложение, и вы увидите, что второй никогда не вызывался.

+0

Я не думаю, что это связано с тем, что предупреждение вызвано действием пользователя. Если пользователь принимает решение «Да, пожалуйста, отправьте». он будет называться. Крушение произошло только два раза. –

+1

@ MickeyMouse, вы на самом деле пробовали это с помощью отладчика? В программировании не рекомендуется «думать», когда у вас есть все инструменты, чтобы «знать». –

+0

@ LajosArpad, конечно, я сделал.Я просто не копирую код и ожидаю, что они будут работать :) –

3

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

@IBAction func emailButtonPressed(sender: UIButton) { 
    self.confirm(); 
} 

func confirm() { 
    let controller = UIAlertController(title: title, 
       message: "Are you sure you want to send the Email?", 
       preferredStyle: .Alert) 

    controller.addAction(UIAlertAction(title: "Yes please, send.", style: .Default, handler: { 
       action in 
       self.send() 
    })) 

    controller.addAction(UIAlertAction(title: "Cancel", style: .Default, handler: nil)) 
    presentViewController(controller, animated: true, completion: nil) 
} 

func send() { 
    let text = textArea.text 
    let to = toLabel.text 
    .... 
} 
+0

Собственно, это то, что я планирую делать. Спасибо за совет. –

+0

Рад, что это помогло. Если это сработало, примите его как правильный ответ. Благодаря! – picciano

0

Я нашел проблему. Он не имеет ничего общего с рекурсией или даже с разбивкой кода на куски. Проблема заключалась в том, что программа разбилась, поскольку она нашла нуль при развертывании необязательного значения. Странно, что сообщение об ошибке не может быть найдено в файле журнала сбоев. Итак, каждому, кто увидит это (и моему будущему «я»), всегда проверяйте свои варианты.

Пример:

let cell = tableView.cellForRowAtIndexPath(indexPath) 
cell.textLabel.text = "Hello" // CRASH if the cell is not visible in the view 

исправить выше, просто обернуть в if let

if let cell = tableView.cellForRowAtIndexPath(indexPath) { 
    cell.textLabel.text = "Hello" // Never get executed if cell is nil 
} 
Смежные вопросы