Показать случайные изображения с их именами из массива. (SwiftUI) - PullRequest
0 голосов
/ 21 марта 2020

Впервые на swiftUI, и мне нужно показывать изображения и их имена случайным образом, нажимая кнопку. Как мне вызвать массив картинок для отображения случайного изображения каждый раз, когда пользователь нажимает на кнопку в файле contentView?

это массив картинок, который я хочу показать их случайным образом в contentView (картинки, помещенные в Папка с активами):

struct aPicture: Identifiable {
    var id: Int
    var name: String
    var imageName: String
}


let pictures = [
    aPicture(id: 0, name: "1", imageName: "1"),
    aPicture(id: 1, name: "2", imageName: "2"),
    aPicture(id: 2, name: "3", imageName: "3"),
    aPicture(id: 3, name: "4", imageName: "4"),
    aPicture(id: 4, name: "5", imageName: "5"),
    aPicture(id: 5, name: "6", imageName: "6"),
]

Ответы [ 2 ]

1 голос
/ 21 марта 2020

Вы можете попробовать это:

 struct ContentView: View {

    struct aPicture: Identifiable {
        var id: Int
        var name: String
        var imageName: String
    }

    @State var random : Int = 0


    let pictures = [
        aPicture(id: 0, name: "1", imageName: "1"),
        aPicture(id: 1, name: "2", imageName: "2"),
        aPicture(id: 2, name: "3", imageName: "3"),
        aPicture(id: 3, name: "4", imageName: "4"),
        aPicture(id: 4, name: "5", imageName: "5"),
        aPicture(id: 5, name: "6", imageName: "6"),
    ]

    var body: some View {
        VStack {
            HStack {
                Spacer()
                Text(pictures[self.random].name)
                    .background(Color.white)
                Spacer()
                Button("Next image") {
                    self.random = Int.random(in: 0..<self.pictures.count)
                }
                Spacer()
            }

            Image(pictures[self.random].imageName)
            .resizable()
            .scaledToFit()
        }
    }
}
0 голосов
/ 21 марта 2020

Я предлагаю вам другой подход. 1) вы можете генерировать случайный элемент напрямую

let picture = pictures.randomElement() ?? default_if_empty_collection

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

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

import SwiftUI

struct ContentView: View {
    @State var img  = Image(systemName: "questionmark.square.fill")
    let imgs = [Image(systemName: "trash"),
                Image(systemName: "trash.fill"),
                Image(systemName: "trash.slash"),

    ]

    var body: some View {
        img
            .resizable()
            .scaledToFit()
            .frame(maxWidth: .infinity)
            .onTapGesture {
                var tmp: Image
                repeat {
                    tmp = self.imgs.randomElement() ?? self.img
                } while tmp == self.img
                self.img = tmp
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

enter image description here

...