swiftui Неоднозначная ссылка на члена 'navigationBarTitle' - PullRequest
2 голосов
/ 18 января 2020

Я изучаю быстрый пользовательский интерфейс с навигацией и alamofire. Там не было никаких ошибок. Тем не менее, ошибка появилась, когда я изменил код о DetailView.

В строке .navigationBarHidden (showCancelButton) -> '(@lvalue Bool) -> некоторые View' не конвертируется в '(Bool) -> some View '

В строке Group {в DetailView -> Неоднозначная ссылка на член' navigationBarTitle '

Пожалуйста, помогите: (

import SwiftUI
import Alamofire

struct News:Hashable {
    var title :String?
    var reporter : String?
    var press : String?
    var link : String?
    var originalLink : String?
}

extension UIApplication {
    func endEditing(_ force: Bool) {
        self.windows
            .filter{$0.isKeyWindow}
            .first?
            .endEditing(force)
    }
}

struct ContentView: View {
    @State var selection = 0

    var body: some View {
        TabView (selection: $selection){
            FeedView()
                .tabItem {
                    HStack {
                        Image(systemName: "list.dash")
                        Text("Feed")
                    }
            }
            .tag(0)
            SearchView()
                .tabItem {
                    HStack {
                        Image(systemName: "magnifyingglass.circle")
                        Text("Search")
                    }
            }
            .tag(1)
        }
    }
}

struct FeedView: View {

    var body: some View {
        Text("Feed")
    }
}

struct SearchView: View {
    @State private var newsList = [News]()

    var body: some View {
        NavigationView {
            MasterView(newsList: $newsList)
                .navigationBarTitle(Text("Search News"))
                .navigationBarItems(
                    leading: EditButton(),
                    trailing: Button(
                        action: {
                            withAnimation {  }
                    }
                    ) {
                        Image(systemName: "plus")
                    }
            )
            DetailView(selectedNews: News())
        }.navigationViewStyle(DoubleColumnNavigationViewStyle())
    }
}

struct MasterView: View {
    @State private var searchText = ""
    @State private var showCancelButton: Bool = false
    @Binding var newsList: [News]

    var body: some View {
        VStack {
            // Search view
            HStack {
                HStack {
                    Image(systemName: "magnifyingglass")

                    TextField("search", text: $searchText, onEditingChanged: { isEditing in
                        self.showCancelButton = true
                    }, onCommit: {
                        self.showCancelButton = false
                        let apiUrl = "https://openapi.naver.com/v1/search/news.json?query="
                        let search = self.searchText.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)!
                        Alamofire.request(apiUrl+search, method: .get, headers: [ "X-Naver-Client-Id": "*********", "X-Naver-Client-Secret":"**********"])
                            .responseJSON { response in
                                let newsList = (response.result.value as! [String:Any])["items"]!
                                self.newsList = [News]()
                                for news in (newsList as! [[String:String]]) {
                                    self.newsList.append(News(title: news["title"], link: news["link"], originalLink: news["originallink"]))
                                }
                        }
                    }).foregroundColor(.primary)

                    Button(action: {
                        //self.searchText = ""
                    }) {
                        Image(systemName: "xmark.circle.fill").opacity(searchText == "" ? 0 : 1)
                    }
                }
                .padding(EdgeInsets(top: 8, leading: 6, bottom: 8, trailing: 6))
                .foregroundColor(.secondary)
                .background(Color(.secondarySystemBackground))
                .cornerRadius(10.0)

                if showCancelButton  {
                    Button("Cancel") {
                        UIApplication.shared.endEditing(true) // this must be placed before the other commands here
                        self.searchText = ""
                        self.showCancelButton = false
                    }
                    .foregroundColor(Color(.systemBlue))
                }
            }
            .padding(.horizontal)
            .navigationBarHidden(showCancelButton)
            List {
                ForEach(newsList, id: \.self) { news in
                    NavigationLink(
                        destination: DetailView(selectedNews: news)
                    ) {
                        Text(news.title)
                    }
                }.onDelete { indices in
                    indices.forEach { self.newsList.remove(at: $0) }
                }
            }
        }
    }
}

struct DetailView: View {
    var selectedNews: News

    var body: some View {
        Group{
            Text("Hello")
        }.navigationBarTitle(Text(selectedNews.title))
    }
}

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

1 Ответ

3 голосов
/ 18 января 2020

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

Ваша настоящая проблема заключается в том, что вам нужно иметь вызовы .navigationBarHidden и .navigationBarTitle на самом верхнем уровне. уровень вашей иерархии просмотра (то есть VStack). Поэтому вам нужно изменить эту часть следующим образом:

    VStack {
        [...]
                if showCancelButton  {
                    Button("Cancel") {
                        UIApplication.shared.endEditing(true) // this must be placed before the other commands here
                        self.searchText = ""
                        self.showCancelButton = false
                    }
                    .foregroundColor(Color(.systemBlue))
                }
            }
            .padding(.horizontal)
            //.navigationBarHidden(showCancelButton)
            List {
                ForEach(newsList, id: \.self) { news in
                    NavigationLink(
                        destination: DetailView(selectedNews: news)
                    ) {
                        Text(news.title)
                    }
                }.onDelete { indices in
                    indices.forEach { self.newsList.remove(at: $0) }
                }
            }
        }
    }
    .navigationBarHidden(showCancelButton)
    .navigationBarTitle(Text(selectedNews.title))
[...]

На данный момент единственная ошибка, которая у вас есть, заключается в том, что selectedNews не объявлен внутри структуры MasterView. Поэтому вам просто нужно переместить его туда:

struct MasterView: View {
    @State private var searchText = ""
    @State private var showCancelButton: Bool = false
    var selectedNews: News //<-- move here!
    @Binding var newsList: [News]

    var body: some View {
        VStack {
            // Search view
            HStack {
                HStack {
                    [...]

Тогда, если вы исправите все ошибки, которые вы получите, изменив init -ов MasterView и DetailView, ваш код скомпилируется.

...