2015-12-03 1 views
0

Это мой код: Пожалуйста, проверьте, не удалось ли что-то поделать неправильно? Пожалуйста, дайте мне код для UIActionSheet (UIAlertController) с массивом в быстройОшибка UIAlertController? Пожалуйста, дайте код для UIAlertController с Array of Strings As Buttons in Swift

let alertA = UIAlertController(title: "PlayLists", message: "Select From PlayLists Below", preferredStyle: .ActionSheet) 

let action = UIAlertAction(title: "Cancel", style: .Default, handler: {(alert: UIAlertAction!) in 

}) 

let playListModel = PlayListModel.sharedInstance 
plLists = playListModel.getPlayListNames() 

for(var i = 0; i < plLists.count; i++){ 

    alertA.addAction(UIAlertAction(title: plLists.objectAtIndex(i) as? String, style: .Default, handler: { 
    action in 

     NSLog("%@",String(i)) 

    })) 
} 

alertA.addAction(action) 
self.presentViewController(alertA, animated: true, completion: nil) 

В этом коде, если у меня есть 3 плейлистов actionsheet показывает три плейлистов вместе с кнопкой отмены. Когда я нажимаю на первую кнопку, он будет печатать значение 4 (где я прекратил увеличивать). Почему это печатает это? Он должен печатать значение i с 1, правильно? В чем проблема? Правильно ли действие внутри цикла for?

+1

Похоже, что у вас есть языки? Почему вы используете функцию NSLog в своем быстром коде. Вместо этого попробуйте использовать инструкцию печати. – TheAppMentor

+6

@ TheAppMentor NSLog не устарел, он работает нормально с Swift. :) Хотя я также предпочитаю использовать 'print', нет никакой проблемы с использованием NSLog. – Moritz

+0

@ TheAppMentor и Eric D .. Хорошо, но он должен печатать 1 не 4 ... Почему это печатает 4 вместо 1 – Jack

ответ

1

Прежде всего я собираюсь объяснить вам, почему это происходит, вы можете видеть, касаются ли вы каких-либо из ваших кнопок всегда выходным результатом вызова NSLog("%@",String(i)) является plLists.count - 1, это потому, что вы пытаетесь всегда устанавливать индекс оператора for внутри закрытия действий, которые вы добавляете. Переменная выходит за рамки закрытия.

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

Тем не менее, вы можете принять подход к title собственности в action, как следующим образом:

func presentAction() { 

    let alertA = UIAlertController(title: "PlayLists", message: "Select From PlayLists Below", preferredStyle: .ActionSheet) 
    let action = UIAlertAction(title: "Cancel", style: .Default, handler: nil) 

    let plLists = ["List1", "List2", "List3", "List4"] 
    for(var i = 0; i < plLists.count; i++) { 
     alertA.addAction(UIAlertAction(title: plLists[i], style: .Default, handler: self.handlerForAction)) 
    } 

    alertA.addAction(action) 
    self.presentViewController(alertA, animated: true, completion: nil) 
} 

func handlerForAction(action: UIAlertAction) { 
    print(action.title!) 
} 

Я надеюсь, что это поможет вам.

+0

Ты супербосс ...... – Jack

0

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

Использование цикла по-разному:

for titled in plLists{ 
alertA.addAction(UIAlertAction(title: titled, style: .Default, handler: { 
    action in 

     NSLog(titled) 

    })) 
} 
} 

получать правильный выход сейчас, спасибо за терпение ...