ios – Why SwiftUI redraws the physique of my customized View since nothing associated to him modifications?

0
1
ios – Why SwiftUI redraws the physique of my customized View since nothing associated to him modifications?


Right here is an instance:

struct DemoApp: View {
    @State var viewModel = DemoAppViewModel()
    var physique: some View {
        VStack {
            DemoMonthView(date: viewModel.monthDate)
            DemoDayView(date: viewModel.dayDate) // FIRST
                .onTapGesture {
                    viewModel.dayDate = viewModel.dayDate.addingTimeInterval(86000)
                }
            DemoDayView(date: viewModel.monthDate) // SECOND
                .onTapGesture {
                    viewModel.monthDate = viewModel.monthDate.addingTimeInterval(1400000)
                }
        }
    }
}

@Observable
class DemoAppViewModel {
    var dayDate: Date = Date()
    var monthDate: Date = Date()
}

struct DemoMonthView: View {
    var date: Date
    @FetchRequest personal var days: FetchedResults //it's essential change Day right here with any Entity that can permit to breed the problem
    init(date: Date) {
        self.date = date
        _days = FetchRequest(
            sortDescriptors: [SortDescriptor(.date, order: .reverse)],
            predicate: NSPredicate(worth: true)
        )
        print("DemoMonthView init known as") //needs to be known as, however with out physique redraws

        // heavy calculations for given month
    }
    
    var physique: some View {
        if #obtainable(iOS 17.1, *) {
            print("DemoMonthView physique known as") //shouldn't be known as❓
        }
        return VStack {
            Textual content(date.formatted(date: .lengthy, time: .omitted)).font(.title.daring())
        }
    }
}

struct DemoDayView: View {
    var date: Date
    
    var physique: some View {
        Textual content(date.formatted(date: .lengthy, time: .omitted))
    }
}

#Preview {
    DemoApp()
}

Merely, while you faucet FIRST button it shouldn’t redraw DemoMonthView, nevertheless it does. Why? I really want to keep away from that by tapping each time FIRST button. SECOND button redraws DemoMonthView view accurately, what I perceive. However why the FIRST?

Once I remark it out days and _days affiliation in init, then every part is okay, it DOES NOT redraws…

However that state of affairs is only a shortened drawback of my actual, extra difficult app. There’s a fetchRequest with heavy calculations which shouldn’t be known as so ceaselessly like faucet on the button, like right here in instance, when tapping that button doesn’t change something associated to DemoMonthView.

If it’s the cause because of the lack of my data, what ought to I do know to keep away from that?

Why it issues right here? As a result of I have to replace that DemoMonthView ONLY when monthDate modifications, not every time when dayDate modifications.

LEAVE A REPLY

Please enter your comment!
Please enter your name here