поместить наблюдаемый объект в список - PullRequest
0 голосов
/ 13 января 2020

Я получаю данные из моего API и создаю для них класс. Я могу использовать swify JSON, чтобы правильно их инициализировать. Проблема в том, что когда я помещаю свой наблюдаемый объект в список, он может правильно отображаться только один раз. Это потерпит крах после того, как я изменил представление Он очень силен, потому что мой другой List со схожей структурой данных может работать. (Это представление в tabView) Кто-нибудь знает, куда мой getAllNotification () должен поместить view.onAppear () или List.onAppear ()? Спасибо !!

class ManagerNotification : Identifiable, ObservableObject{
@Published var id = UUID()
var notifyId : Int = 0
var requestId : Int = 0
var requestName: String = ""
var groupName : String = ""
//        var imageName: String { return name }

init(jsonData:JSON) {
    notifyId = jsonData["notifyId"].intValue
    requestId = jsonData["requestId"].intValue
    requestName = jsonData["requestName"].stringValue
    groupName = jsonData["groupName"].stringValue
}

}

import SwiftUI
import SwiftyJSON


struct NotificationView: View {
var roles = ["userNotification", "managerNotification"]
@EnvironmentObject var userToken:UserToken

@State var show = false
@State private var selectedIndex = 0

@State var userNotifications : [UserNotification] = [UserNotification]()
@State var managerNotifications : [ManagerNotification] = [ManagerNotification]()

var body: some View {


        VStack {
            Picker(selection: $selectedIndex, label: Text(" ")) {
                        ForEach(0..<roles.count) { (index) in
                            Text(self.roles[index])
                        }
                    }
            .pickerStyle(SegmentedPickerStyle())
            containedView()
            Spacer()

    }
               .onAppear(perform: getAllNotification)
}

func containedView() -> AnyView {
   switch selectedIndex {
   case 0:
       return AnyView(
            List(userNotifications) { userNotification in
                UserNotificationCellView(userNotification: userNotification)
            }
        )

   case 1:

      return AnyView(
        List(managerNotifications) { managernotification in
          ManagerNotificationCellView(managerNotification : managernotification)
        }
        .onAppear(perform: getManagerNotification)


    )

   default:
    return AnyView(Text("22").padding(40))
    }

}

func getAllNotification(){
//        if (self.userNotifications.count != 0){
//            self.userNotifications.removeAll()
//        }
//    I think the crash was in here, because when i don't use removeAll().
//    It works fine, but i don't want every times i change to this view. my array will be longer and 
//    longer

      if (self.managerNotifications.count != 0){
          self.managerNotifications.removeAll()
      }

    NetWorkController.sharedInstance.connectApiByPost(api: "/User/email", params: ["token": "\(self.userToken.token)"])
    {(jsonData) in
        if let result = jsonData["msg"].string{
            print("eeee: \(result)")
            if(result == "you dont have any email"){

            }else if(result == "success get email"){
                if let searchResults = jsonData["mail"].array {
                    for notification in searchResults {
                        self.userNotifications.append(UserNotification(jsonData: notification))
                    }
                }
            }
        }

    }

    NetWorkController.sharedInstance.connectApiByPost(api: "/Manager/email", params: ["token": "\(self.userToken.token)"])
           {(jsonData) in
               if let result = jsonData["msg"].string{
                   print("eeee: \(result)")
                   if(result == "you dont have any email"){

                   }else if(result == "success get email"){
                       if let searchResults = jsonData["mail"].array {
                           for notification in searchResults {
                               self.managerNotifications.append(ManagerNotification(jsonData: notification))
                           }
                       }

                   }
               }

           }
}

func getManagerNotification(){

//        if (self.managerNotifications.count != 0){
//            self.managerNotifications.removeAll()
//        }
    print(self.managerNotifications.count)
    NetWorkController.sharedInstance.connectApiByPost(api: "/Manager/email", params: ["token": "\(self.userToken.token)"])
    {(jsonData) in
        if let result = jsonData["msg"].string{
            print("eeee: \(result)")
            if(result == "you dont have any email"){

            }else if(result == "success get email"){
                if let searchResults = jsonData["mail"].array {
                    for notification in searchResults {
                        self.managerNotifications.append(ManagerNotification(jsonData: notification))
                    }
                }
            }
        }

    }
}

}

сообщение об ошибке

Только предупреждение только один раз: UITableView был задан для размещения его видимых ячеек и другое содержимое, не входящее в иерархию представлений (табличное представление или одно из его суперпредставлений не было добавлено в окно). Это может привести к ошибкам, заставляя представления внутри табличного представления загружаться и выполнять компоновку без точной информации (например, границ табличного представления, сбора признаков, полей макета, вставок безопасной области и т. Д. c), а также приведет к ненужным потерям производительности из-за дополнительные макеты проходит. Создайте символьную c точку останова в UITableViewAlertForLayoutOutsideViewHierarchy, чтобы перехватить это в отладчике и посмотреть, что вызвало это, чтобы вы могли вообще избежать этого действия, если это возможно, или отложить его, пока представление таблицы не будет добавлено в окно. причина: 'попытка удалить раздел 0, но до обновления осталось только 0 разделов'

1 Ответ

0 голосов
/ 14 января 2020

Я думаю, вы не понимаете роль @State и @ObservebableObject; это не похоже на MVC, где вы заменяете ViewController на SwiftUI.View, как вы, похоже, пытаетесь сделать в своем примере. Вместо этого представление должно быть функцией локального @State и / или внешнего @ObservedObject. Это ближе к MVVM, где ваш @ObservedObject аналогичен ViewModel, и представление будет перестраиваться в ответ на изменения свойств @Published в ObservableObject.

TLDR: переместите логи извлечения c для ObservableObject и используйте @Published, чтобы позволить представлению подписаться на результаты. У меня есть пример здесь: https://github.com/joshuajhomann/TVMaze-SwiftUI-Navigation

...