Activity indicator in UITableView in iphone app - iphone

In my iphone app I have a table view. In that onclick of each row it will download some data. During that download process I need to animate an activity indicator. How to add an activity indicator in table view?

First, you do not need to add activity indicator in table view. You just add it in that view and then set its hidden property. When the user clicks on a row, set its hidden property to NO.
One more thing, move your table to send to back from layout->send to back
and the indicator to send to front layout->sent to front.

Just add an UIActivityIndicatorView to your view say activity Assign it the frame and style you want.
Then all you need to do is that put the below code above your download code.
[NSThread detachNewThreadSelector:#selector(myMethod:) toTarget:self withObject:nil];
and you need to declare myMethod as
-(void)myMethod:(id)data
{
[activity startAnimating];
[activity setHidden:NO];
}
Whenever your download finishes just put
[activity stopAnimating];
[activity setHidden:YES];
Hope this helps you.

Related

show activity indicator while loading ViewController

I have a ViewController that takes time to load its views. When I run Instruments, I see from the home screen, if I tap on the icon that pushes that view controller onto the stack, it's half laying out the views, and half getting the data for the views. I tried adding an activity indicator to display on the home screen over the button when the button is pressed to push the LongRunningViewController onto the stack. So I basically do this:
- (IBAction)puzzleView:(id)sender {
dispatch_async(dispatch_get_main_queue(), ^{
[self.activityIndicator startAnimating];
});
PuzzleViewController *detailViewController = [[[PuzzleViewController alloc] init] autorelease];
[self.navigationController pushViewController:detailViewController animated:YES];
[self.activityIndicator stopAnimating];
}
The home screen lags while pressing the button, and then loads the view. I'm trying to show the activity indicator while the other screen is preparing to be pushed (or at least that's the way I think it works). The activity indicator does not show however. I'm wondering if this can be done? Or do other apps push their ViewController, and then on that screen, they have the activity indicators showing the loading of their different resources?
When you say that it takes time to get the data for the views, I assume you mean that the PuzzleViewController does something non-trivial somewhere like viewDidLoad.
So let's say it is in viewDidLoad. Then you can do this:
-(void)viewDidLoad
{
[self.activityIndicator startAnimating];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
{
//do something expensive
[self doSomethingExpensive];
//dispatch back to the main (UI) thread to stop the activity indicator
dispatch_async(dispatch_get_main_queue(), ^
{
[self.activityIndicator stopAnimating];
});
});
}
This will mean that the expensive operation will be put on a background thread and won't block the loading/showing of the view controller.
This approach is showing the requested view immediately when the user pushes the button, and showing progress on that screen. I think it's more common this way than to show an activity view while loading contents before presenting the view. This also buys you a little bit more time; your long operation can be running in the background during the transition animation!
The reason your activity view isn't showing the way you're doing it is that you're doing it all on the UI thread; using dispatch_async to the main queue from the main queue won't accomplish anything because your block won't have a chance to run until the run loop completes.

Custom Activity Indicator Issue

I am making an iPhone app in which I have made a custom activity indicator class to show an activity indicator animating on another class, but my problem is that the activity indicator class get start animating but it doesn't get stop animating.
Here is the code:
customActivityView = [[ CustomActivityIndicatorView alloc] init];
customActivityView.view.center = self.view.center;
[self.view addSubview:customActivityView.view];
[customActivityView.activityIndicator startAnimating]; // is work fine to add a custom activity indicator and start animating
[customActivityView.activityIndicator stopAnimating]; // but this line doesn't work
Check that customActivityView.activityIndicator actually returns the activity view, or quite likely, if it returns anything at all.
You cannot start and stop an activity indicator in the same method.if you do so you cannot see anythng in result.
Sorry it's working now actually my custom Activity class was get assign two times that why it didn't stop.

UIAlertView Dynamically in iPhone App

I want to display dynamic UIAlertView and Indicator within it when data is loading from web-service.
Also I don't want any button on UIAlertView. And it will be stopped automatically when data will be loaded successfully.
How can I implement it.?
Just declar UIAlertView and then your activity indicator, make indicator a sub view to alert view and then when your data has been loaded from web service dismiss with this instance method
– dismissWithClickedButtonIndex:animated:
If you are using WebView then write startAnimating ActivityIndicator in ViewDidLoad and this delegate method will call by itself when your data will be loaded
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
//[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
[ActivityIndicator stopAnimating];
}
Hope it helps.Thanks :)
Then use MBProgress HUD or SVprogress HUD
https://github.com/jdg/MBProgressHUD

Activity Indicator not showing up

I have two issues with activity indicator:
1. Activity Indicator not showing up on UIViewController
I have activity indicator added in .xib file. On button click it should start animating. and when response from server is received, before going to next page it should stop animating.
I am doing it as follows:
activityIndicator.hidden = NO;
[activityIndicator performSelector:#selector(startAnimating) withObject:nil afterDelay:0.1];
[self.view bringSubviewToFront:activityIndicator];
....rest of code here....
activityIndicator.hidden = YES;
[activityIndicator stopAnimating];
Activity Indicator not showing up on UITableView
For table view I am doing it same way but on didselectrowatindexpath...
For tableview I also tried adding activity view to cell accessory, but still not showing up
In both cases activity Indicator is not showing up.
Please help
Thanks
If all this code is in one method or in response to one event, then none of the changes to the views are going be visible until you return to the event loop. You set the activityIndicator.hidden to NO and then set it again to YES before the UI has an opportunity to even refresh.
You also apparently stop the animation before you start it.
What you need to do is make the activity indicator visible here and start its animation. Then schedule the work to be done (start an asynchronous network connection, or put some work into a queue, or whatever it is you need to get done) and return from this method so that the UI can refresh, the indicator can be drawn, and the animation can actually start.
Then later at some point after the work is complete, you can hide the indicator and stop the animation. But you can't do all of that on the main thread within one single turn of the event loop. None of your changes will be visible because no drawing at all will happen here while this method is executing (assuming this is on the main thread)
I hope that makes sense?
Now I modified the code to this:
activityIndicator.hidden = NO;
[activityIndicator startAnimating];
[self performSelector:#selector(saveClicked) withObject:nil afterDelay:0.1];
[self.view bringSubviewToFront:activityIndicator];
and it worked :)
May be, in tableView, instead of self.view , it will be self.navigationController.view ??

Trouble with Displaying an Activity Indicator while Data Loads

I feel as though there is a really simple solution to my problem, but thus far I have had little success... I want to load my initial .xib file (exiting the default.png splash screen early), so that I may display an activity indicator while loading my html data and setting the text label fields created by my xib file.
Unfortunately, when I execute the following code below, I display my default.png image until all of the data is loaded from each website... What may I change in order to first display my mainView, then start the activity indicator, load my html data, and set the text labels in my mainView?
#implementation MainViewController
- (void)viewDidLoad {
[super viewDidLoad];
[activityIndicator startAnimating];
[self runTimer];
}
- (void)viewDidAppearBOOL)animated {
[super viewDidAppear:animated];
[self loadHTMLData1];
[self loadHTMLData2];
[self loadHTMLData3];
[self loadHTMLData4];
[activityIndicator stopAnimating];
}
...
It's all to do with how iOS updates the ui. When you call
[activityIndicator startAnimating];
it doesn't mean start animating immediately, it means you're telling the ui the next time you are updating the display, start animating.
All of this updating happens on the main thread (if you haven't made a thread, you're already on the main thread) so if you do something else that takes a long time, it will do this before updating the display.
There are a few ways to fix this and they all involve making another thread that runs in the background.
Take a look at NSOperation (and NSOperationQueue) - this will let you queue up individual tasks that iOS will run in the background for you. then when they are complete you can update your display again and turn off your activity indicator.
There's NSOperationQueue tutorials all over google :)
Hope that helps.