Как представить несколько контроллеров предупреждений в l oop в swift - PullRequest
0 голосов
/ 05 мая 2020

У меня проблемы с отображением нескольких контроллеров предупреждений один за другим. Я хочу, чтобы мой for l oop ждал, пока пользователь не закроет контроллер ответа. Мой код для представления сообщения ниже.

for block in blocks {
     self.presentMessage(title: codeBlock.stringInput1, message: codeBlock.stringInput2)
}
func presentMessage(title: String, message: String, completion: @escaping (Bool)->()) {
     let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)

     alert.addAction(UIAlertAction(title: "Done", style: .default, handler: { action in
          completion(true)
     }))

     self.present(alert, animated: true)
}

Изменить -

Это мой класс блока

class block: Codable {
    var type: String
    var stringInput1: String
    var stringInput2: String

    init(t: String, i1: String, i2: String) {
        type = t
        stringInput1 = i1
        stringInput2 = i2
    }
}

Я пытался использовать отправку группы уже, но мне не удалось заставить его правильно работать. Конечная цель моей настройки - сделать так, чтобы блоки могли выполнять разные действия в зависимости от типа блока. Если это возможно, я бы хотел, чтобы мои циклы for ожидали завершения функции, пока она не продолжится.

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Хорошо, поэтому после некоторой работы я адаптировал ответ @ elliott-io во что-то, что подойдет мне. Вот мое окончательное решение моей проблемы.

func nextBlock(index: Int) {
    if index < codeBlocks.count {
        let type = codeBlocks[index].type
        if type == "message" {
            self.presentMessage(title: codeBlocks[index].stringInput1, message: codeBlocks[index].stringInput2, index: index)
        } else if type == "link" {
            self.openLink(webpage: codeBlocks[index].stringInput1, index: index)
        }
    }
}

func presentMessage(title: String, message: String, index: Int) {
    let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)

    alert.addAction(UIAlertAction(title: "Done", style: .default, handler: { action in
        self.nextBlock(index: index + 1)
    }))

    self.present(alert, animated: true)
}

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

0 голосов
/ 05 мая 2020

Swift позволяет вам представлять только один контроллер представления за раз, поэтому вам нужно будет сделать что-то вроде этого:

var blocks: [Block] = [Block.init(one: "1", two: "12"),
                        Block.init(one: "2", two: "22"),
                        Block.init(one: "3", two: "32")]

func nextMessage(index: Int) {
    if index < blocks.count {
        let codeBlock = blocks[index]
        self.presentMessage(index: index, title: codeBlock.stringInput1, message: codeBlock.stringInput2)
    }
}
func presentMessage(index: Int, title: String, message: String) {
    let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)

    alert.addAction(UIAlertAction(title: "Done", style: .default, handler: { action in
        self.nextMessage(index: index + 1)
    }))

     self.present(alert, animated: true)
}

Вызов presentMessage из первого элемента в массиве запустит его:

self.presentMessage(index: 0, title: blocks[0].stringInput1, message: blocks[0].stringInput2)

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

class Block {
    var stringInput1: String
    var stringInput2: String

    init(one: String, two: String) {
        stringInput1 = one
        stringInput2 = two
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...