Swift Ui - другой вид (макет) для первого элемента списка - PullRequest
0 голосов
/ 12 апреля 2020

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

К сожалению, я получаю эту ошибку в этих 2 строках (VStack and at ForEach-Line). Если я уберу if i == 0 тогда и просто использую для обычного макета все listitems, ошибки не будет.

ERROR: Type '()' cannot conform to 'View'; only struct/enum/class types can conform to protocols

Вот мой код:

var body: some View {

    NavigationView {

        VStack { // here first error

            if self.model.error != nil {

                Text(self.model.error!)

            }

            ForEach(0..<self.model.weatherList.count, id: \.self) { i in // here second error



                if i == 0 {

                    NavigationLink(destination: DetailView(model: self.model.weatherList[i])) {

                        RowView(model: self.model.weatherList[i])

                    }

                }

                else{

                    NavigationLink(destination: DetailView(model: self.model.weatherList[i])) {

                        RowView(model: self.model.weatherList[i])

                    }

                }

            }



        }

        .navigationBarTitle(Text("Weather in " + UserSettings.instance.locationSetting))

        .navigationBarItems(trailing:

            Button(action: {

                self.model.reload()

            }) {

                Image(systemName: "arrow.clockwise")

            }

            .disabled(model.reloading)

        )

    }

}

Буду признателен каждый совет. Спасибо.

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

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

            ForEach(0..<self.model.weatherList.count, id: \.self) { i in

на

            ForEach(0..<self.model.weatherList.count) { i in // remove the id: argument

Объяснение:

Если вы используете диапазон для перебора массива, вы не используете аргумент id :. Диапазон автоматически идентифицируется. Инициализатор ForEach(_:id:content:) используется в тех случаях, когда вы можете сказать:

ForEach(self.model.weatherlist, id: \.self) { model in 
    SomeView(model: model)
}

Это компилируется для вас?

Редактировать: пример, который вы привели, выглядит так, как будто он сделает то же самое Индекс равен 0 или нет. Есть ли причина, по которой он не работает, если вы попытаетесь:

                ForEach(0..<self.model.weatherList.count) { i in
                NavigationLink(destination: DetailView(model: self.model.weatherList[i])) {
                    RowView(model: self.model.weatherList[i])
                }
            }
0 голосов
/ 13 апреля 2020

Я не пробовал это, но что, если вы оберните NavigationLink следующим образом:

    if i == 0 {
        AnyView(
            NavigationLink(destination: DetailView(model: self.model.weatherList[i])) {
                RowView(model: self.model.weatherList[i])
        })
    } else {
        AnyView(
            NavigationLink(destination: DetailView(model: self.model.weatherList[i])) {
                RowView(model: self.model.weatherList[i])
        })
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...