Is there an .onAppear equivalent that works on individual items in a view, and also gets called on redraws?

Within my SwiftUI view I have multiple view items, buttons, text, etc.

Within the view, the user selects a ticket, and then clicks a button to upload it. The app then sends the ticket to my server, where the server takes time to import the ticket. So my SwiftUI app needs to make repeated URL calls depending on how far the server has gotten with the ticket.

I thought the code below would work. I update the text to show at what percent the server is at. However, it only works once. I guess I thought that onAppear would work with every refresh since it's in a switch statement.

If I'm reading my debugger correctly, SwiftUI recalls which switch statement was called last and therefore it views my code below as a refresh rather than a fresh creation.

So is there a modifier that would get fired repeatedly on every view refresh? Or do I have to do all my multiple URL calls from outside the SwiftUI view?

Something like onInitialize but for child views (buttons, text, etc.) within the main view?

switch myNewURL.stage {
	case .makeTicket:
		Text(myNewURL.statusMsg)
			.padding(.all, 30)
	case .importing:
		Text(myNewURL.statusMsg)
			.onAppear{
				Task {
					try! await Task.sleep(nanoseconds: 7000000000)
					print ("stage two")
					let request = xFile.makeGetReq(xUser: xUser, script: "getTicketStat.pl")
					var result = await myNewURL.asyncCall(request: request, xFile: xFile)
				}
			}
			.padding(.all, 30)
	case .uploadOriginal:
		Text(myNewURL.statusMsg)
			.padding(.all, 30)
	case .JSONerr:
		Text(myNewURL.statusMsg)
		.padding(.all, 30)
}


Accepted Reply

I guess I thought that onAppear would work with every refresh since it's in a switch statement.

No. onAppear is called only when the view is loaded in the view hierarchy, so only once.

 

So is there a modifier that would get fired repeatedly on every view refresh?

  • When is the view refresehd ? When myNewURL.statusMsg changes ?
  • If so, if I understand correctly your intent, you could replace onAppear with an onChange modifier.
  • That's what I was looking for. Have been trying to find a website that lists all modifiers that Apple provides.

Add a Comment

Replies

I guess I thought that onAppear would work with every refresh since it's in a switch statement.

No. onAppear is called only when the view is loaded in the view hierarchy, so only once.

 

So is there a modifier that would get fired repeatedly on every view refresh?

  • When is the view refresehd ? When myNewURL.statusMsg changes ?
  • If so, if I understand correctly your intent, you could replace onAppear with an onChange modifier.
  • That's what I was looking for. Have been trying to find a website that lists all modifiers that Apple provides.

Add a Comment